要知道它们是如何实现的,用到了什么第三方库文件,反编译便是很好的一个了解方法,如果你想要了解如何反编译可以点击这个链接:反编译就这么简单
只是一般的APK打包后都是被混淆过的,所以没那么好了解他的每个界面是如何实现的,没事,那就自己慢慢摸索或则从它的资源文件中提取布局了解下整体的大概情况。
我通过反编译 --今日头条:
知道了它用到的架包有,提取了有用的部分:
1.android-support-v4.jar (最常用的官方架包之一)
2.android-support-v7.jar (主要用于ActionBar的低版本兼容)
3.handmark.pulltorefresh.library (图片的下拉刷新包)
4.slidingmenu.lib (侧拉菜单包) 使用方法配置以及下载:点击这里
5.umeng (友盟的官方架包)
自己要在加用上的架包有:
1.Android-Universal-Image-Loader (图片的异步加载包) 使用方法配置以及下载:点击这里
注:发现架包中有aaa什么的命名,说明它被混淆过,所以要想进一步获取它的源码很困难,只能按照自己的思路去走。
好的,大体了解了它的整体结构,下面就开始它是如何开发的把:
注:本代码内用到的资源文件和属性配置部分从APK反编译的资源(SRC文件)中提取,为了达到更好的实现效果。
一.首先构建大体的框架,架包等用到的时候在导入
命名规范可以参考:android命名规范
二.进行配置
首先去掉应用的title栏目:
采取修改AndroidManifest.xml文件中application的android:theme="@style/AppTheme"属性:
- true
- start_anima = new AlphaAnimation(0.3f, 1.0f);
- start_anima.setDuration(2000);
- view.startAnimation(start_anima);
- start_anima.setAnimationListener(new AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onAnimationRepeat(Animation animation) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onAnimationEnd(Animation animation) {
- // TODO Auto-generated method stub
- redirectTo();//跳转
- }
- });
下面就首先来实现上部栏目拖动这个效果:
大体思路结构图:
整体的布局文件是如下这样:
这个就是它在白天模式和黑夜模式下用的阴影图片。那我们可以采取重写HorizontalScrollView来判断滚动,如果滚动时候不是在最左边,显示左边阴影,不是在最右边,显示右边阴影。
- public class ColumnHorizontalScrollView extends HorizontalScrollView {
- /** 传入整体布局 */
- private View ll_content;
- /** 传入更多栏目选择布局 */
- private View ll_more;
- /** 传入拖动栏布局 */
- private View rl_column;
- /** 左阴影图片 */
- private ImageView leftImage;
- /** 右阴影图片 */
- private ImageView rightImage;
- /** 屏幕宽度 */
- private int mScreenWitdh = 0;
- /** 父类的活动activity */
- private Activity activity;
- public ColumnHorizontalScrollView(Context context) {
- super(context);
- }
- public ColumnHorizontalScrollView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- public ColumnHorizontalScrollView(Context context, AttributeSet attrs,
- int defStyle) {
- super(context, attrs, defStyle);
- }
- /**
- * 在拖动的时候执行
- * */
- @Override
- protected void onScrollChanged(int paramInt1, int paramInt2, int paramInt3, int paramInt4) {
- // TODO Auto-generated method stub
- super.onScrollChanged(paramInt1, paramInt2, paramInt3, paramInt4);
- shade_ShowOrHide();
- if(!activity.isFinishing() && ll_content !=null && leftImage!=null && rightImage!=null && ll_more!=null && rl_column !=null){
- if(ll_content.getWidth() = getMeasuredWidth()) {
- leftImage.setVisibility(View.GONE);
- rightImage.setVisibility(View.GONE);
- }
- } else {
- return;
- }
- //如果滑动在最左边时候,左边阴影隐藏,右边显示
- if (getLeft() == 0) {
- leftImage.setVisibility(View.GONE);
- rightImage.setVisibility(View.VISIBLE);
- return;
- }
- //如果滑动在最右边时候,左边阴影显示,右边隐藏
- if (getRight() == getMeasuredWidth() - mScreenWitdh) {
- leftImage.setVisibility(View.VISIBLE);
- rightImage.setVisibility(View.GONE);
- return;
- }
- //否则,说明在中间位置,左、右阴影都显示
- leftImage.setVisibility(View.VISIBLE);
- rightImage.setVisibility(View.VISIBLE);
- }
- }
之后
private ArrayList newsClassify=new ArrayList();
根据newsClassify这个栏目分类列表里面的数量进行添加栏目。(这里首先采用了自己限定的ITEM,而没有进行数据库的操作,以后加上)
ViewPage的适配器NewsFragmentPagerAdapter,通过ViewPage切换对应栏目的的Fragment:
- public class NewsFragmentPagerAdapter extends FragmentPagerAdapter {
- private ArrayList fragments;
- private FragmentManager fm;
- public NewsFragmentPagerAdapter(FragmentManager fm) {
- super(fm);
- this.fm = fm;
- }
- public NewsFragmentPagerAdapter(FragmentManager fm,
- ArrayList fragments) {
- super(fm);
- this.fm = fm;
- this.fragments = fragments;
- }
- @Override
- public int getCount() {
- return fragments.size();
- }
- @Override
- public Fragment getItem(int position) {
- return fragments.get(position);
- }
- @Override
- public int getItemPosition(Object object) {
- return POSITION_NONE;
- }
- public void setFragments(ArrayList fragments) {
- if (this.fragments != null) {
- FragmentTransaction ft = fm.beginTransaction();
- for (Fragment f : this.fragments) {
- ft.remove(f);
- }
- ft.commit();
- ft = null;
- fm.executePendingTransactions();
- }
- this.fragments = fragments;
- notifyDataSetChanged();
- }
- @Override
- public Object instantiateItem(ViewGroup container, final int position) {
- Object obj = super.instantiateItem(container, position);
- return obj;
- }
- }
- int count = newsClassify.size();
- for(int i = 0; i
关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录