http://blog.csdn.net/vipzjyno1/article/details/23619269

http://blog.csdn.net/vipzjyno1/article/details/23619269

http://blog.csdn.net/vipzjyno1/article/details/23619269

http://blog.csdn.net/vipzjyno1/article/details/23619269

http://blog.csdn.net/vipzjyno1/article/details/23619269

http://blog.csdn.net/vipzjyno1/article/details/23619269







(android高仿系列)今日头条 --新闻阅读器 (二)

分类:android 5931人阅读 评论(60) 收藏 举报 android 仿 今日头条 网易 新闻客户端

目录(?)[+]

高仿今日头条 --- 第一篇:(android高仿系列)今日头条 --新闻阅读器 (一)

上次,已经完成了头部新闻分类栏目的拖动效果。

这篇文章是继续去完善APP 今日头条 这个新闻阅读器的其他功能。

这次所实现的功能清单

1.通过SlidingMenu实现左右侧拉菜单效果

2.通过重写CompoundButton实现--昼夜模式切换按钮效果。

3.通过PopupWindow控件实现了列表中更多菜单弹框操作效果。

4.通过universal-image-loader库实现了图片的加载和缓存。

5.通过列表中各个属性的判断,实现了头条新闻列表的相应布局和显示效果。


下面把每个功能和对应的实现方式相关博文都列出了,方便大家根据自身需求查看。


下面就是官方的效果截图,详细操作请继续向下看。

(android高仿系列)今日头条 --新闻阅读器 (二)_第1张图片 (android高仿系列)今日头条 --新闻阅读器 (二)_第2张图片


一.通过SlidingMenu实现左右侧拉菜单效果

在第一讲中,我们已经知道了,它使用了SlidingMenu这个侧拉菜单开源库,所以我特地将SlidingMenu的使用和配置写了一个文章,文章地址:Android SlidingMenu 开源项目 侧拉菜单的使用(详细配置)

所以具体的配置就不在这里说明了,大家可以去看上面给的链接。

注意:由于 今日头条用的是左右都可以侧拉的菜单,所以设置侧拉模式为:SlidingMenu.LEFT_RIGHT,代码如下

[java] view plain copy
  1. localSlidingMenu.setMode(SlidingMenu.LEFT_RIGHT);//设置左右滑菜单
由于左右可以拖出菜单,并且中间的ViewPager可以切换新闻页面,所以 SlidingMenu的必须如此设置以下属性:

[java] view plain copy
  1. localSlidingMenu.setTouchModeAbove(SlidingMenu.SLIDING_WINDOW);//设置要使菜单滑动,触碰屏幕的范围
SLIDEING_WINDOW就是触摸边缘才会出发,这样的话滑动操作就不用冲突了。

为了方便代码的维护,我将SlidingMenu自定义成了一个DrawerView类,这样的话所有菜单中的操作就和主界面分离开来,代码就不会显得那么臃肿了,并且在用到的地址直接实例化这个类就可以了。

代码如下:

[java] view plain copy
  1. publicclassDrawerViewimplementsOnClickListener{
  2. privatefinalActivityactivity;
  3. SlidingMenulocalSlidingMenu;
  4. privateSwitchButtonnight_mode_btn;
  5. privateTextViewnight_mode_text;
  6. privateRelativeLayoutsetting_btn;
  7. publicDrawerView(Activityactivity){
  8. this.activity=activity;
  9. }
  10. publicSlidingMenuinitSlidingMenu(){
  11. localSlidingMenu=newSlidingMenu(activity);
  12. localSlidingMenu.setMode(SlidingMenu.LEFT_RIGHT);//设置左右滑菜单
  13. localSlidingMenu.setTouchModeAbove(SlidingMenu.SLIDING_WINDOW);//设置要使菜单滑动,触碰屏幕的范围
  14. //localSlidingMenu.setTouchModeBehind(SlidingMenu.RIGHT);
  15. localSlidingMenu.setShadowWidthRes(R.dimen.shadow_width);//设置阴影图片的宽度
  16. localSlidingMenu.setShadowDrawable(R.drawable.shadow);//设置阴影图片
  17. localSlidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);//SlidingMenu划出时主页面显示的剩余宽度
  18. localSlidingMenu.setFadeDegree(0.35F);//SlidingMenu滑动时的渐变程度
  19. localSlidingMenu.attachToActivity(activity,SlidingMenu.RIGHT);//使SlidingMenu附加在Activity右边
  20. //localSlidingMenu.setBehindWidthRes(R.dimen.left_drawer_avatar_size);//设置SlidingMenu菜单的宽度
  21. localSlidingMenu.setMenu(R.layout.left_drawer_fragment);//设置menu的布局文件
  22. //localSlidingMenu.toggle();//动态判断自动关闭或开启SlidingMenu
  23. localSlidingMenu.setSecondaryMenu(R.layout.profile_drawer_right);
  24. localSlidingMenu.setSecondaryShadowDrawable(R.drawable.shadowright);
  25. localSlidingMenu.setOnOpenedListener(newSlidingMenu.OnOpenedListener(){
  26. publicvoidonOpened(){
  27. }
  28. });
  29. initView();
  30. returnlocalSlidingMenu;
  31. }
  32. privatevoidinitView(){
  33. night_mode_btn=(SwitchButton)localSlidingMenu.findViewById(R.id.night_mode_btn);
  34. night_mode_text=(TextView)localSlidingMenu.findViewById(R.id.night_mode_text);
  35. night_mode_btn.setOnCheckedChangeListener(newOnCheckedChangeListener(){
  36. @Override
  37. publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){
  38. //TODOAuto-generatedmethodstub
  39. if(isChecked){
  40. night_mode_text.setText(activity.getResources().getString(R.string.action_night_mode));
  41. }else{
  42. night_mode_text.setText(activity.getResources().getString(R.string.action_day_mode));
  43. }
  44. }
  45. });
  46. night_mode_btn.setChecked(false);
  47. if(night_mode_btn.isChecked()){
  48. night_mode_text.setText(activity.getResources().getString(R.string.action_night_mode));
  49. }else{
  50. night_mode_text.setText(activity.getResources().getString(R.string.action_day_mode));
  51. }
  52. setting_btn=(RelativeLayout)localSlidingMenu.findViewById(R.id.setting_btn);
  53. setting_btn.setOnClickListener(this);
  54. }
  55. @Override
  56. publicvoidonClick(Viewv){
  57. switch(v.getId()){
  58. caseR.id.setting_btn:
  59. activity.startActivity(newIntent(activity,SettingsActivity.class));
  60. activity.overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_left);
  61. break;
  62. default:
  63. break;
  64. }
  65. }
  66. }

2.通过重写CompoundButton实现--昼夜模式切换按钮效果

看源码发现,今日头条的中的是SwitchButton昼夜模式选择控件,是通过重写CompoundButton实现的,以下便是实现对应方法的相关帖子:

SwitchButton 开关按钮 的多种实现方式 (附源码DEMO)

根据需求选择你喜欢的SwitchButton去修改和使用。


3.通过PopupWindow控件实现了列表中更多菜单弹框操作效果。

在开发中发现,每个新闻列表中对应的ITEM中按钮出发的弹框效果其实是通过PopupWindow实现的,相关博文如下 android 仿 新闻阅读器 菜单弹出效果(附源码DEMO)

4.通过universal-image-loader库实现了图片的加载和缓存。

一个新闻客户端肯定涉及到一个图片异步加载缓存的方法,所以这里使用开发中最常用的开源库之一

universal-image-loader来实现相关的需求。如果你对这个库的使用不是很了解的话,可以查看以下链接:

Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
---根据你需求配置相应的属性即可。

5.通过列表中各个属性的判断,实现了头条新闻列表的相应布局和显示效果。

新闻客户端中,每个新闻的布局都可能不一样,所以你可以选择2种最常用的方式去根据需求改变一个LISTVIEW里面的布局。 1.操作上会麻烦一点,维护起来很方便 BaseAdapter中有个自带的方法,就是getViewTypeCount(),用户可以使用这个方法获取ITEM的种类数量,之后在getView()的时候判断对应到额种类type之后设给他对应的布局即可,常见的例子有:唱吧中的名人榜

2.操作上很方便,只用根据需求设置布局的显示隐藏效果,缺点:如果控件一多,不在注释的话,可能维护起来就很麻烦。
在这里,其实采用第2种方式就可以了,分析它对应的以下布大致的5种局: (android高仿系列)今日头条 --新闻阅读器 (二)_第3张图片 布局---1 (android高仿系列)今日头条 --新闻阅读器 (二)_第4张图片
布局---2 (android高仿系列)今日头条 --新闻阅读器 (二)_第5张图片
布局---3
(android高仿系列)今日头条 --新闻阅读器 (二)_第6张图片
布局---4 (android高仿系列)今日头条 --新闻阅读器 (二)_第7张图片
布局---5

分析上述布局,其实他们的大体布局是一样的,知识根据图片的张数,图片的大小,以及新闻类别的评论来判断布局的对应显示隐藏问题,只要根据相对应的属性便可以很好的实现这个效果,所以方法2是最合适的。

其他操作就是根据服务器返回的数据类型,是否为空等作相应操作即可。

上述就是目前完成的进度,虽然数据啥都是在本地写死的,可是已经大体的算得上是的一个新闻阅读器了,之后会继续完善其他为完成的功能。

开发中的几个问题总结:

关于Fragment

1)

[java] view plain copy
  1. @Override
  2. publicvoidonAttach(Activityactivity){
  3. //TODOAuto-generatedmethodstub
  4. this.activity=activity;
  5. super.onAttach(activity);
  6. }

通过onAttach()方法获取父类ACTIVITY,如果在调用getActivity()方法获取的话,可能会在FRAGMENT被回收后报空指针错误。

2)

看今日头条的效果是,没切换至类型界面后,才去刷新数据,Fragment自带了这个方法,如下

[java] view plain copy
  1. publicvoidsetUserVisibleHint(booleanisVisibleToUser){}
你可以判断isVisibleToUser属性来知道是否是切换的界面已经完全可见,之后进行操作。代码中也注释了。


下面看看这次的效果图:

(android高仿系列)今日头条 --新闻阅读器 (二)_第8张图片 (android高仿系列)今日头条 --新闻阅读器 (二)_第9张图片

(android高仿系列)今日头条 --新闻阅读器 (二)_第10张图片 (android高仿系列)今日头条 --新闻阅读器 (二)_第11张图片


最后附上源码DEMO地址:下载地址

可能在代码方面写的不是很好,优化不足,希望大家提出来,共同进步。转载请注明http://blog.csdn.net/vipzjyno1/article/details/23619269

谢谢。

66




















[置顶](android高仿系列)今日头条 --新闻阅读器 (一)

分类:android 4838人阅读 评论(22) 收藏 举报 头条 android 仿 网易 源码

在模仿中循序渐进,以程序员角度去看待每一个APP是如何实现的,它有什么优缺点,并从中提升自己。

之前发现很多人在群里面、论坛上求网易新闻客户端的源码,之后我就去下了个网易新闻客户端和今日头条新闻客户端,发现他们的大体是一样的,于是在最近的空闲时间,便去琢磨如何去实现这样一个APP。

要知道它们是如何实现的,用到了什么第三方库文件,反编译便是很好的一个了解方法,如果你想要了解如何反编译可以点击这个链接:反编译就这么简单

只是一般的APK打包后都是被混淆过的,所以没那么好了解他的每个界面是如何实现的,没事,那就自己慢慢摸索或则从它的资源文件中提取布局了解下整体的大概情况。

我通过反编译 --今日头条:

(android高仿系列)今日头条 --新闻阅读器 (二)_第12张图片

知道了它用到的架包有,提取了有用的部分:

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命名规范

(android高仿系列)今日头条 --新闻阅读器 (二)_第13张图片

二.进行配置

首先去掉应用的title栏目:

采取修改AndroidManifest.xml文件中application的android:theme="@style/AppTheme"属性:

[java] view plain copy
  1. <stylename="AppTheme"parent="AppBaseTheme">
  2. <itemname="android:windowNoTitle">true</item>
  3. </style>

三.开始开发 设置欢迎界面的调整动画,2秒 [java] view plain copy
  1. start_anima=newAlphaAnimation(0.3f,1.0f);
  2. start_anima.setDuration(2000);
  3. view.startAnimation(start_anima);
  4. start_anima.setAnimationListener(newAnimationListener(){
  5. @Override
  6. publicvoidonAnimationStart(Animationanimation){
  7. //TODOAuto-generatedmethodstub
  8. }
  9. @Override
  10. publicvoidonAnimationRepeat(Animationanimation){
  11. //TODOAuto-generatedmethodstub
  12. }
  13. @Override
  14. publicvoidonAnimationEnd(Animationanimation){
  15. //TODOAuto-generatedmethodstub
  16. redirectTo();//跳转
  17. }
  18. });
之后便是主界面:
可以发现主界面上方的栏目栏是可以横向拖动的,并且选择。

(android高仿系列)今日头条 --新闻阅读器 (二)_第14张图片

下面就首先来实现上部栏目拖动这个效果:

大体思路结构图:

(android高仿系列)今日头条 --新闻阅读器 (二)_第15张图片

整体的布局文件是如下这样:

[java] view plain copy
  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <includelayout="@layout/main_head"/>
  7. <LinearLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="40.0dip"
  10. android:background="#fff3f3f3"
  11. android:orientation="horizontal">
  12. <RelativeLayout
  13. android:id="@+id/rl_column"
  14. android:layout_width="match_parent"
  15. android:layout_height="40.0dip"
  16. android:layout_weight="1.0">
  17. <com.topnews.view.ColumnHorizontalScrollView
  18. android:id="@+id/mColumnHorizontalScrollView"
  19. android:layout_width="match_parent"
  20. android:layout_height="40.0dip"
  21. android:scrollbars="none">
  22. <LinearLayout
  23. android:id="@+id/mRadioGroup_content"
  24. android:layout_width="fill_parent"
  25. android:layout_height="40.0dip"
  26. android:layout_centerVertical="true"
  27. android:gravity="center_vertical"
  28. android:orientation="horizontal"
  29. android:paddingLeft="10.0dip"
  30. android:paddingRight="10.0dip"/>
  31. </com.topnews.view.ColumnHorizontalScrollView>
  32. <ImageView
  33. android:id="@+id/shade_left"
  34. android:layout_width="10.0dip"
  35. android:layout_height="40.0dip"
  36. android:layout_alignParentLeft="true"
  37. android:layout_centerVertical="true"
  38. android:background="@drawable/channel_leftblock"
  39. android:visibility="gone"/>
  40. <ImageView
  41. android:id="@+id/shade_right"
  42. android:layout_width="10.0dip"
  43. android:layout_height="40.0dip"
  44. android:layout_alignParentRight="true"
  45. android:layout_centerVertical="true"
  46. android:background="@drawable/channel_rightblock"
  47. android:visibility="visible"/>
  48. </RelativeLayout>
  49. <LinearLayout
  50. android:id="@+id/ll_more_columns"
  51. android:layout_width="wrap_content"
  52. android:layout_height="40.0dip">
  53. <ImageView
  54. android:id="@+id/button_more_columns"
  55. android:layout_width="40.0dip"
  56. android:layout_height="40.0dip"
  57. android:layout_gravity="center_vertical"
  58. android:src="@drawable/channel_glide_day_bg"/>
  59. </LinearLayout>
  60. </LinearLayout>
  61. <View
  62. android:id="@+id/category_line"
  63. android:layout_width="fill_parent"
  64. android:layout_height="0.5dip"
  65. android:background="#ffdddddd"/>
  66. <android.support.v4.view.ViewPager
  67. android:id="@+id/mViewPager"
  68. android:layout_width="match_parent"
  69. android:layout_height="match_parent"/>
  70. </LinearLayout>
由于发现HorizontalScrollView左右拖动的时候没有那种阴影效果,所以在这里,我们发现了头条的资源文件下有这么2个文件:

(android高仿系列)今日头条 --新闻阅读器 (二)_第16张图片

这个就是它在白天模式和黑夜模式下用的阴影图片。那我们可以采取重写HorizontalScrollView来判断滚动,如果滚动时候不是在最左边,显示左边阴影,不是在最右边,显示右边阴影。

[java] view plain copy
  1. publicclassColumnHorizontalScrollViewextendsHorizontalScrollView{
  2. /**传入整体布局*/
  3. privateViewll_content;
  4. /**传入更多栏目选择布局*/
  5. privateViewll_more;
  6. /**传入拖动栏布局*/
  7. privateViewrl_column;
  8. /**左阴影图片*/
  9. privateImageViewleftImage;
  10. /**右阴影图片*/
  11. privateImageViewrightImage;
  12. /**屏幕宽度*/
  13. privateintmScreenWitdh=0;
  14. /**父类的活动activity*/
  15. privateActivityactivity;
  16. publicColumnHorizontalScrollView(Contextcontext){
  17. super(context);
  18. }
  19. publicColumnHorizontalScrollView(Contextcontext,AttributeSetattrs){
  20. super(context,attrs);
  21. }
  22. publicColumnHorizontalScrollView(Contextcontext,AttributeSetattrs,
  23. intdefStyle){
  24. super(context,attrs,defStyle);
  25. }
  26. /**
  27. *在拖动的时候执行
  28. **/
  29. @Override
  30. protectedvoidonScrollChanged(intparamInt1,intparamInt2,intparamInt3,intparamInt4){
  31. //TODOAuto-generatedmethodstub
  32. super.onScrollChanged(paramInt1,paramInt2,paramInt3,paramInt4);
  33. shade_ShowOrHide();
  34. if(!activity.isFinishing()&&ll_content!=null&&leftImage!=null&&rightImage!=null&&ll_more!=null&&rl_column!=null){
  35. if(ll_content.getWidth()<=mScreenWitdh){
  36. leftImage.setVisibility(View.GONE);
  37. rightImage.setVisibility(View.GONE);
  38. }
  39. }else{
  40. return;
  41. }
  42. if(paramInt1==0){
  43. leftImage.setVisibility(View.GONE);
  44. rightImage.setVisibility(View.VISIBLE);
  45. return;
  46. }
  47. if(ll_content.getWidth()-paramInt1+ll_more.getWidth()+rl_column.getLeft()==mScreenWitdh){
  48. leftImage.setVisibility(View.VISIBLE);
  49. rightImage.setVisibility(View.GONE);
  50. return;
  51. }
  52. leftImage.setVisibility(View.VISIBLE);
  53. <spanstyle="white-space:pre"></span>rightImage.setVisibility(View.VISIBLE);
  54. }
  55. /**
  56. *传入父类布局中的资源文件
  57. **/
  58. publicvoidsetParam(Activityactivity,intmScreenWitdh,ViewparamView1,ImageViewparamView2,ImageViewparamView3,ViewparamView4,ViewparamView5){
  59. this.activity=activity;
  60. this.mScreenWitdh=mScreenWitdh;
  61. ll_content=paramView1;
  62. leftImage=paramView2;
  63. rightImage=paramView3;
  64. ll_more=paramView4;
  65. rl_column=paramView5;
  66. }
  67. /**
  68. *判断左右阴影的显示隐藏效果
  69. **/
  70. publicvoidshade_ShowOrHide(){
  71. if(!activity.isFinishing()&&ll_content!=null){
  72. measure(0,0);
  73. //如果整体宽度小于屏幕宽度的话,那左右阴影都隐藏
  74. if(mScreenWitdh>=getMeasuredWidth()){
  75. leftImage.setVisibility(View.GONE);
  76. rightImage.setVisibility(View.GONE);
  77. }
  78. }else{
  79. return;
  80. }
  81. //如果滑动在最左边时候,左边阴影隐藏,右边显示
  82. if(getLeft()==0){
  83. leftImage.setVisibility(View.GONE);
  84. rightImage.setVisibility(View.VISIBLE);
  85. return;
  86. }
  87. //如果滑动在最右边时候,左边阴影显示,右边隐藏
  88. if(getRight()==getMeasuredWidth()-mScreenWitdh){
  89. leftImage.setVisibility(View.VISIBLE);
  90. rightImage.setVisibility(View.GONE);
  91. return;
  92. }
  93. //否则,说明在中间位置,左、右阴影都显示
  94. leftImage.setVisibility(View.VISIBLE);
  95. rightImage.setVisibility(View.VISIBLE);
  96. }
  97. }

之后

private ArrayList<NewsClassify> newsClassify=new ArrayList<NewsClassify>();

根据newsClassify这个栏目分类列表里面的数量进行添加栏目。(这里首先采用了自己限定的ITEM,而没有进行数据库的操作,以后加上)

ViewPage的适配器NewsFragmentPagerAdapter,通过ViewPage切换对应栏目的的Fragment:

[java] view plain copy
  1. publicclassNewsFragmentPagerAdapterextendsFragmentPagerAdapter{
  2. privateArrayList<Fragment>fragments;
  3. privateFragmentManagerfm;
  4. publicNewsFragmentPagerAdapter(FragmentManagerfm){
  5. super(fm);
  6. this.fm=fm;
  7. }
  8. publicNewsFragmentPagerAdapter(FragmentManagerfm,
  9. ArrayList<Fragment>fragments){
  10. super(fm);
  11. this.fm=fm;
  12. this.fragments=fragments;
  13. }
  14. @Override
  15. publicintgetCount(){
  16. returnfragments.size();
  17. }
  18. @Override
  19. publicFragmentgetItem(intposition){
  20. returnfragments.get(position);
  21. }
  22. @Override
  23. publicintgetItemPosition(Objectobject){
  24. returnPOSITION_NONE;
  25. }
  26. publicvoidsetFragments(ArrayList<Fragment>fragments){
  27. if(this.fragments!=null){
  28. FragmentTransactionft=fm.beginTransaction();
  29. for(Fragmentf:this.fragments){
  30. ft.remove(f);
  31. }
  32. ft.commit();
  33. ft=null;
  34. fm.executePendingTransactions();
  35. }
  36. this.fragments=fragments;
  37. notifyDataSetChanged();
  38. }
  39. @Override
  40. publicObjectinstantiateItem(ViewGroupcontainer,finalintposition){
  41. Objectobj=super.instantiateItem(container,position);
  42. returnobj;
  43. }
  44. }
之后添加栏目ITEM:

[java] view plain copy
  1. intcount=newsClassify.size();
  2. for(inti=0;i<count;i++){
  3. LinearLayout.LayoutParamsparams=newLinearLayout.LayoutParams(mItemWidth,LayoutParams.WRAP_CONTENT);
  4. params.leftMargin=10;
  5. params.rightMargin=10;
  6. TextViewlocalTextView=newTextView(this);
  7. localTextView.setTextAppearance(this,R.style.top_category_scroll_view_item_text);
  8. localTextView.setBackgroundResource(R.drawable.radio_buttong_bg);
  9. localTextView.setGravity(Gravity.CENTER);
  10. localTextView.setPadding(5,0,5,0);
  11. localTextView.setId(i);
  12. localTextView.setText(newsClassify.get(i).getTitle());
  13. localTextView.setTextColor(getResources().getColorStateList(R.color.top_category_scroll_text_color_day));
  14. if(columnSelectIndex==i){
  15. localTextView.setSelected(true);
  16. }
  17. localTextView.setOnClickListener(newOnClickListener(){
  18. @Override
  19. publicvoidonClick(Viewv){
  20. for(inti=0;i<mRadioGroup_content.getChildCount();i++){
  21. ViewlocalView=mRadioGroup_content.getChildAt(i);
  22. if(localView!=v)
  23. localView.setSelected(false);
  24. else{
  25. localView.setSelected(true);
  26. mViewPager.setCurrentItem(i);
  27. }
  28. }
  29. Toast.makeText(getApplicationContext(),newsClassify.get(v.getId()).getTitle(),Toast.LENGTH_SHORT).show();
  30. }
  31. });
  32. mRadioGroup_content.addView(localTextView,i,params);
  33. }
之后根据选择栏目的来调整ColumnHorizontalScrollView中的位置
[java] view plain copy
  1. <spanstyle="white-space:pre"></span>/**
  2. *选择的Column里面的Tab
  3. **/
  4. privatevoidselectTab(inttab_postion){
  5. columnSelectIndex=tab_postion;
  6. for(inti=0;i<mRadioGroup_content.getChildCount();i++){
  7. ViewcheckView=mRadioGroup_content.getChildAt(tab_postion);
  8. intk=checkView.getMeasuredWidth();
  9. intl=checkView.getLeft();
  10. inti2=l+k/2-mScreenWidth/2;
  11. //rg_nav_content.getParent()).smoothScrollTo(i2,0);
  12. mColumnHorizontalScrollView.smoothScrollTo(i2,0);
  13. //mColumnHorizontalScrollView.smoothScrollTo((position-2)*
  14. //mItemWidth,0);
  15. }
  16. //判断是否选中
  17. for(intj=0;j<mRadioGroup_content.getChildCount();j++){
  18. ViewcheckView=mRadioGroup_content.getChildAt(j);
  19. booleanischeck;
  20. if(j==tab_postion){
  21. ischeck=true;
  22. }else{
  23. ischeck=false;
  24. }
  25. checkView.setSelected(ischeck);
  26. }
  27. }

完成的效果如下:

(android高仿系列)今日头条 --新闻阅读器 (二)_第17张图片




更多注释和实现方法可以查看DEMO源码文件,源码下载地址 :DEMO源码


第2篇已经优化完成点击以下链接:

(android高仿系列)今日头条 --新闻阅读器 (二)

46
0
主题推荐
今日头条 阅读器 新闻 android relativelayout
猜你在找
【Android UI设计与开发】第15期:顶部标题栏(六)实现悬浮式顶部和底部标题栏效果
Android UI 使用HTML布局(直接打开服务器网页)
Android提高篇之自定义dialog实现processDialog“正在加载”效果、使用Animation实现图片旋转
android仿win8 metro磁贴布局
Android版本百度地图开发(五)——覆盖物
Json解析实例Tomcat服务器
Android获取HTML数据
android TextView多行文本始终显示滚动条并自动定位到底部
Android 使用基于位置的服务(一)
Android支付接入(一):支付宝
查看评论
17楼 tequierobluer2014-07-26 22:20发表[回复]
楼主你好~我研究你的demo有一个星期了~~最近想在楼主demo的mainActivity里加一个下拉刷新和上拉加载,主要思路是通过这篇文章http://blog.csdn.net/leehong2005/article/details/12567757,
但是我不知道里面的Container View怎么添加到楼主这个demo的mainActivity里,楼主能不能给个思路呢?
16楼 heyuewei2014-06-26 10:00发表[回复]
源码好像下载不了了。。博主能否查看下呢?
15楼 Rocklei0072014-06-11 11:54发表[回复]
ColumnHorizontalScrollView 类中用于判断阴影部分的代码是在 onScrollChanged(int paramInt1, int paramInt2, int paramInt3, int paramInt4)这里处理的。
方法shade_ShowOrHide(); 在这里是无用的?
14楼 PiGeek2014-06-09 20:40发表[回复]
学习了~哈哈
13楼 项慈航2014-05-30 10:28发表[回复]
写得太好了,这段代码我看了几遍了,有两遍点不明白,上面有个setFragments这个方法好像没有地方用到,还有就是其中 ft.remove(f),按照逻辑,我觉得应该是add(...)
12楼 好炫2014-05-23 16:44发表[回复]
我也来模仿学习
11楼 xiaojie01232014-05-21 11:36发表[回复]
支持
10楼 s1109004122014-05-17 18:06发表[回复]
楼主真心太腻害了; 正在跟着学习中; 后续会完善应用吗?比如服务端相关的内容嘛;
Re: vipra2014-05-17 18:14发表[回复]
回复s110900412:服务端的话应该是不会加了,因为这样的话要自己架设云服务器,在写后台接口,毕竟是模仿,所以后面会差不多是个客户端,频带选择,头条时间段分栏,内容查看都加好了,过几天应该就发上来了,一般自己拿回去加个网络获取加个JSON解析就差不多可以用了的。
Re: s1109004122014-05-18 14:54发表[回复]
回复vipzjyno1:恩 佩服佩服;坐等你更新;
9楼 knxw00012014-05-13 18:13发表[回复]
//如果滑动在最右边时候,左边阴影显示,右边隐藏
if (getRight() == getMeasuredWidth() - mScreenWitdh) {
leftImage.setVisibility(View.VISIBLE);
rightImage.setVisibility(View.GONE);
return;
}

这是怎么判断的,不懂getMeasuredWidth()是干吗的
Re: vipra2014-05-14 17:31发表[回复]
回复knxw0001:getWidth()、getHeight()和getMeasuredWidth()、getMeasuredHeight()这两对函数之间的区别,getMeasuredWidth()、getMeasuredHeight()返回的是measure过程得到的mMeasuredWidth和mMeasuredHeight的值,而getWidth()和getHeight()返回的是mRight - mLeft和mBottom - mTop的值。一般情况下layout过程会参考measure过程中计算得到的mMeasuredWidth和mMeasuredHeight来安排子视图在父视图中显示的位置,但这不是必须的,measure过程得到的结果可能完全没有实际用处,特别是对于一些自定义的ViewGroup,其子视图的个数、位置和大小都是固定的,这时候我们可以忽略整个measure过程,只在layout函数中传入的4个参数来安排每个子视图的具体位置。
8楼 zhang582465002014-05-12 09:43发表[回复]
真是太棒了~! 谢谢
7楼 sunweijie12342014-04-29 10:31发表[回复]
好文章!
6楼 ccdxwjw2014-04-29 09:48发表[回复]
真心不错!!谢谢!!辛苦了
5楼 sdujava20112014-04-20 10:46发表[回复]
大赞!
4楼 seasonfif2014-04-19 13:19发表[回复]
博主 好厉害啊 膜拜
3楼 android菜虫2014-04-15 19:43发表[回复]
如果能实现头条上栏目拖动效果的就更好。
2楼 xjsaber2014-04-15 13:52发表[回复]
十分不错,博主一定要更新啊,指着这个下菜了
Re: vipra2014-04-15 19:34发表[回复]
回复xjsaber:嗯,好的,就是在模范的时候,发现蛮多东西以前没怎么接触过,所以会顺道发一些遇到的问题相关帖子,之后完善这个源码
1楼 chainway7652014-04-15 10:28发表[回复]
厉害!
Re: vipra2014-04-15 19:32发表[回复]
回复chainway765:谢谢支持,一起努力
发表评论





更多相关文章

  1. Andorid在布局文件中中文加粗
  2. Android图文布局【整理】
  3. android 自学笔记2-布局
  4. Android Txt文本阅读器源码
  5. Android RecyclerView多个Item布局的实现(可实现头部底部)
  6. Android计算器界面布局
  7. android 不使用布局文件,完全由代码控制布局实例
  8. android控件相对布局
  9. Android 动态布局

随机推荐

  1. 跟着大牛学PHP--CSS样式和选择器
  2. css自定义样式来源选择器与选择器的权重
  3. 自定义样式的来源与优先级与常用选择器与
  4. CSS样式来源、优先权重和实例
  5. 有感于android安装的简单
  6. Android(安卓)targetSdkVersion你真的了
  7. Kotlin开发环境搭建及第一行KL代码
  8. Android异步处理
  9. 如何在eclipse上正确导入android工程
  10. Android(安卓)View的事件分发机制