724
京東網上商城
高仿今日頭條(轉載)
高仿今日頭條 --- 第一篇:(android高仿係列)今日頭條 --新聞閱讀器 (一)
上次,已經完成了頭部新聞分類欄目的拖動效果。
這篇文章是繼續去完善APP 今日頭條 這個新聞閱讀器的其他功能。
這次所實現的功能清單:
1.通過SlidingMenu實現左右側拉菜單效果
2.通過重寫CompoundButton實現--晝夜模式切換按鈕效果。
3.通過PopupWindow控件實現了列表中更多菜單彈框操作效果。
4.通過universal-image-loader庫實現了圖片的加載和緩存。
5.通過列表中各個屬性的判斷,實現了頭條新聞列表的相應布局和顯示效果。
下麵把每個功能和對應的實現方式相關博文都列出了,方便大家根據自身需求查看。
下麵就是官方的效果截圖,詳細操作請繼續向下看。
一.通過SlidingMenu實現左右側拉菜單效果
在第一講中,我們已經知道了,它使用了SlidingMenu 這個側拉菜單開源庫,所以我特地將 SlidingMenu的使用和配置寫了一個文章,文章地址:Android SlidingMenu 開源項目 側拉菜單的使用(詳細配置)
所以具體的配置就不在這裏說明了,大家可以去看上麵給的鏈接。
注意:由於 今日頭條用的是左右都可以側拉的菜單,所以設置側拉模式為:SlidingMenu.LEFT_RIGHT,代碼如下
- localSlidingMenu.setMode(SlidingMenu.LEFT_RIGHT);//設置左右滑菜單
- localSlidingMenu.setTouchModeAbove(SlidingMenu.SLIDING_WINDOW);//設置要使菜單滑動,觸碰屏幕的範圍
為了方便代碼的維護,我將SlidingMenu 自定義成了一個DrawerView類,這樣的話所有菜單中的操作就和主界麵分離開來,代碼就不會顯得那麼臃腫了,並且在用到的地址直接實例化這個類就可以了。
代碼如下:
- public class DrawerView implements OnClickListener{
- private final Activity activity;
- SlidingMenu localSlidingMenu;
- private SwitchButton night_mode_btn;
- private TextView night_mode_text;
- private RelativeLayout setting_btn;
- public DrawerView(Activity activity) {
- this.activity = activity;
- }
- public SlidingMenu initSlidingMenu() {
- localSlidingMenu = new SlidingMenu(activity);
- localSlidingMenu.setMode(SlidingMenu.LEFT_RIGHT);//設置左右滑菜單
- localSlidingMenu.setTouchModeAbove(SlidingMenu.SLIDING_WINDOW);//設置要使菜單滑動,觸碰屏幕的範圍
- // localSlidingMenu.setTouchModeBehind(SlidingMenu.RIGHT);
- localSlidingMenu.setShadowWidthRes(R.dimen.shadow_width);//設置陰影圖片的寬度
- localSlidingMenu.setShadowDrawable(R.drawable.shadow);//設置陰影圖片
- localSlidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);//SlidingMenu劃出時主頁麵顯示的剩餘寬度
- localSlidingMenu.setFadeDegree(0.35F);//SlidingMenu滑動時的漸變程度
- localSlidingMenu.attachToActivity(activity, SlidingMenu.RIGHT);//使SlidingMenu附加在Activity右邊
- // localSlidingMenu.setBehindWidthRes(R.dimen.left_drawer_avatar_size);//設置SlidingMenu菜單的寬度
- localSlidingMenu.setMenu(R.layout.left_drawer_fragment);//設置menu的布局文件
- // localSlidingMenu.toggle();//動態判斷自動關閉或開啟SlidingMenu
- localSlidingMenu.setSecondaryMenu(R.layout.profile_drawer_right);
- localSlidingMenu.setSecondaryShadowDrawable(R.drawable.shadowright);
- localSlidingMenu.setOnOpenedListener(new SlidingMenu.OnOpenedListener() {
- public void onOpened() {
- }
- });
- initView();
- return localSlidingMenu;
- }
- private void initView() {
- night_mode_btn = (SwitchButton)localSlidingMenu.findViewById(R.id.night_mode_btn);
- night_mode_text = (TextView)localSlidingMenu.findViewById(R.id.night_mode_text);
- night_mode_btn.setOnCheckedChangeListener(new OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- // TODO Auto-generated method stub
- if(isChecked){
- night_mode_text.setText(activity.getResources().getString(R.string.action_night_mode));
- }else{
- night_mode_text.setText(activity.getResources().getString(R.string.action_day_mode));
- }
- }
- });
- night_mode_btn.setChecked(false);
- if(night_mode_btn.isChecked()){
- night_mode_text.setText(activity.getResources().getString(R.string.action_night_mode));
- }else{
- night_mode_text.setText(activity.getResources().getString(R.string.action_day_mode));
- }
- setting_btn =(RelativeLayout)localSlidingMenu.findViewById(R.id.setting_btn);
- setting_btn.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.setting_btn:
- activity.startActivity(new Intent(activity,SettingsActivity.class));
- activity.overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
- break;
- default:
- break;
- }
- }
- }
2.通過重寫CompoundButton實現--晝夜模式切換按鈕效果
看源碼發現,今日頭條的中的是SwitchButton晝夜模式選擇控件,是通過重寫CompoundButton實現的,以下便是實現對應方法的相關帖子:
SwitchButton
開關按鈕 的多種實現方式 (附源碼DEMO)
根據需求選擇你喜歡的SwitchButton去修改和使用。
3.通過PopupWindow控件實現了列表中更多菜單彈框操作效果。
4.通過universal-image-loader庫實現了圖片的加載和緩存。
universal-image-loader來實現相關的需求。如果你對這個庫的使用不是很了解的話,可以查看以下鏈接:
5.通過列表中各個屬性的判斷,實現了頭條新聞列表的相應布局和顯示效果。





其他操作就是根據服務器返回的數據類型,是否為空等作相應操作即可。
上述就是目前完成的進度,雖然數據啥都是在本地寫死的,可是已經大體的算得上是的一個新聞閱讀器了,之後會繼續完善其他為完成的功能。
開發中的幾個問題總結:
關於Fragment
1)
- @Override
- public void onAttach(Activity activity) {
- // TODO Auto-generated method stub
- this.activity = activity;
- super.onAttach(activity);
- }
通過onAttach()方法獲取父類ACTIVITY,如果在調用getActivity()方法獲取的話,可能會在FRAGMENT被回收後報空指針錯誤。
2)
看今日頭條的效果是,沒切換至類型界麵後,才去刷新數據,Fragment自帶了這個方法,如下:
- public void setUserVisibleHint(boolean isVisibleToUser) {}
下麵看看這次的效果圖:
最後附上源碼DEMO地址:下載地址
可能在代碼方麵寫的不是很好,優化不足,希望大家提出來,共同進步。轉載請注明https://blog.csdn.net/vipzjyno1/article/details/23619269
謝謝。
最後更新:2017-04-03 12:56:18