版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

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

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

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

这次所实现的功能清单:

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

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

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

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

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

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

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

                

一.通过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. public class DrawerView implements OnClickListener{
  2. private final Activity activity;
  3. SlidingMenu localSlidingMenu;
  4. private SwitchButton night_mode_btn;
  5. private TextView night_mode_text;
  6. private RelativeLayout setting_btn;
  7. public DrawerView(Activity activity) {
  8. this.activity = activity;
  9. }
  10. public SlidingMenu initSlidingMenu() {
  11. localSlidingMenu = new SlidingMenu(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(new SlidingMenu.OnOpenedListener() {
  26. public void onOpened() {
  27. }
  28. });
  29. initView();
  30. return localSlidingMenu;
  31. }
  32. private void initView() {
  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(new OnCheckedChangeListener() {
  36. @Override
  37. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  38. // TODO Auto-generated method stub
  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. public void onClick(View v) {
  57. switch (v.getId()) {
  58. case R.id.setting_btn:
  59. activity.startActivity(new Intent(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种局:
 
布局---1 
布局---2
布局---3
布局---4
布局---5
分析上述布局,其实他们的大体布局是一样的,知识根据图片的张数,图片的大小,以及新闻类别的评论来判断布局的对应显示隐藏问题,只要根据相对应的属性便可以很好的实现这个效果,所以方法2是最合适的。

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

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

开发中的几个问题总结:

关于Fragment

1)

[java]  view plain copy
  1. @Override
  2. public void onAttach(Activity activity) {
  3. // TODO Auto-generated method stub
  4. this.activity = activity;
  5. super.onAttach(activity);
  6. }

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

2)

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

[java]  view plain copy
  1. public void setUserVisibleHint(boolean isVisibleToUser) {}

你可以判断isVisibleToUser属性来知道是否是切换的界面已经完全可见,之后进行操作。代码中也注释了。

下面看看这次的效果图:

            

           

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

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

谢谢。

今日头条 --新闻阅读器 (二)相关推荐

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

    高仿今日头条 --- 第一篇:(android高仿系列)今日头条 --新闻阅读器 (一) 上次,已经完成了头部新闻分类栏目的拖动效果. 这篇文章是继续去完善APP 今日头条  这个新闻阅读器的其他功能 ...

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

    在模仿中循序渐进,以程序员角度去看待每一个APP是如何实现的,它有什么优缺点,并从中提升自己. 之前发现很多人在群里面.论坛上求网易新闻客户端的源码,之后我就去下了个网易新闻客户端和今日头条新闻客户端 ...

  3. android高仿今日头条 --新闻阅读器

    摘要: 开发流程 第一篇:(android高仿系列)今日头条 --新闻阅读器 (一) 涉及到的知识点有 1.slidingmenu.lib  (侧拉菜单包)   使用方法配置以及下载:点击这里   实 ...

  4. (android高仿系列)今日头条 --新闻阅读器 (三) 完结 、总结 篇

    从写第一篇今日头条高仿系列开始,到现在已经过去了1个多月了,其实大体都做好了,就是迟迟没有放出来,因为我觉得,做这个东西也是有个过程的,我想把这个模仿中一步一步学习的过程,按照自己的思路写下来,在根据 ...

  5. 今日头条新闻阅读器 (三) 完结 、总结 篇

    从写第一篇今日头条高仿系列开始,到现在已经过去了1个多月了,其实大体都做好了,就是迟迟没有放出来,因为我觉得,做这个东西也是有个过程的,我想把这个模仿中一步一步学习的过程,按照自己的思路写下来,在根据 ...

  6. 今日头条 --新闻阅读器

    高仿今日头条 --- 第一篇:(android高仿系列)今日头条 --新闻阅读器 (一) 上次,已经完成了头部新闻分类栏目的拖动效果. 这篇文章是继续去完善APP 今日头条  这个新闻阅读器的其他功能 ...

  7. Android 仿 新闻阅读器 菜单弹出效果(附源码DEMO)

    这一系列博文都是:(android高仿系列)今日头条 --新闻阅读器 (一) 开发中碰到问题之后实现的,觉得可能有的开发者用的到或则希望独立成一个小功能DEMO,所以就放出来这么一个DEMO. 原本觉 ...

  8. 如何开发新闻阅读器(新闻软件、今日头条)?让我们一起动手吧!

            过了几天,博主又匿起来开发了一款新闻阅读器,新闻来源是百度APIStore里的免费API接口,开发的灵感和思路来自今日头条.    有的时候,模范别人应用其实就是一种开发的学习手段,因 ...

  9. Android IT新闻阅读器与手机二维码

    首先,这是一篇随笔而不是技术文章. 事情发生在一个月前,当时我苦于在路上了解不到及时的IT行业新闻,在一次偶然的机会在android手机上安装了Javaeye的新闻阅读器,有了新闻来源后,对行业中的一 ...

最新文章

  1. 深度图像分割 -- Fully Convolutional Networks for Semantic Segmentation
  2. codevs 2606 约数和(分块优化数学公式 )
  3. python详细安装教程3.7.4-Linux下Python3.7.4 安装教程
  4. CentOS通过日志反查入侵(转)
  5. java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal res
  6. 软件测试——0422作业
  7. 成年人的世界,嘴上喊的都是主义,心里装的都是生意
  8. OpenCV 线性滤波
  9. dd: 写入‘/EMPTY‘ 出错: 设备上没有空间
  10. ipsan虚拟存储服务器,IPSAN存储架构
  11. Win10环境下初始化MySQL
  12. 51单片机--蜂鸣器
  13. 幼儿园计算机网络教室工作计划,2017年幼儿园教学工作计划范文
  14. 如果说《热带风暴》在你身上刮过,你还剩下什么?
  15. 坐标测量机的定位误差和测长不确定度有何区别,如何表示?
  16. java设置铃声_我的Android进阶之旅------gt;Android系统设置默认来电铃声、闹钟铃声、通知铃声...
  17. 非常的好的协同过滤入门文章
  18. [转]和《红楼梦》咏菊花诗十二首
  19. mysql数据删除后无法恢复数据恢复_Mysql数据库delete删除后数据恢复报告
  20. java反射 enum参数_CookBook/3-Java反射.md at master · Byron4j/CookBook · GitHub

热门文章

  1. ubuntu下nginx安装及域名设置
  2. JavaSE基础18笔记集合
  3. 物流查询,怎么查快递单号看包裹走到哪里了
  4. 兼莱宝分享:一张图2元-5元,不起眼的副业不容小视。
  5. 什么是抗原抗体?A、B、AB、O型血型来源?滴血认亲靠谱吗?DNA亲子鉴定原理?//2021-2-26
  6. java程序设计与j2ee中间件技术/软件开发技术(III)-大作业-采用MVC模式实现商品信息的查询显示(可以模糊查询)、增加和删除功能,商品表自拟,实现简单菜单操作和分页显示
  7. 叶黄素酯的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. 如何利用Smartbi做数据分析:2018内5月热销乘用车分析报告
  9. 数据结构与算法复习(2)
  10. 微信开发者工具中的代码模块不显示