Android仿新浪新闻SlidingMenu界面的实现

简介:

先看看原图:



如图所示,这种侧滑效果以另一种方式替代了原先tab导航的那种用户体验方式

给人耳目一新的感觉,现已被广大知名应用所效仿,如新浪新闻,网易新闻,人人网等

那么这种效果该如何实现呢?那就需要用到一个开源库SlidingMenu

Github地址https://github.com/jfeinstein10/SlidingMenu


里面包含了demo示例,相关效果图如下:




同时该库又依赖另一个开源库ActionBarSherkLock ,有关该库的介绍,请看此博文http://blog.csdn.net/geniuseoe2012/article/details/9046487

大家最好先把官方demo跑一遍,理清里边的依赖关系以及对库的基本使用,这样自己运用到项目当中就可以得心应手了



OK,最后言归正传,看看新浪新闻的侧滑实现,先上山寨版效果图:




代码片段:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends SlidingFragmentActivity implements OnClickListener{  
  2.   
  3.     private static final CommonLog log = LogFactory.createLog();  
  4.       
  5.     private String mTitle;  
  6.     private Fragment mContent;  
  7.       
  8.     private ImageView mLeftIcon;  
  9.     private ImageView mRightIcon;  
  10.     private TextView mTitleTextView;  
  11.       
  12.     private FragmentControlCenter mControlCenter;  
  13.       
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         // TODO Auto-generated method stub  
  17.         super.onCreate(savedInstanceState);  
  18.           
  19.         mControlCenter = FragmentControlCenter.getInstance(this);  
  20.           
  21.         setupViews();  
  22.           
  23.         initData();  
  24.     }  
  25.       
  26.       
  27.       
  28.     private void setupViews(){  
  29.   
  30.         setContentView(R.layout.main_slidemenu_layout);  
  31.           
  32.         initActionBar();  
  33.           
  34.         initSlideMenu();  
  35.       
  36.     }  
  37.       
  38.     private void initSlideMenu(){  
  39.         FragmentModel fragmentModel = mControlCenter.getTouTiaoFragmentModel();  
  40.         switchContent(fragmentModel);  
  41.   
  42.           
  43.         SlidingMenu sm = getSlidingMenu();  
  44.         sm.setMode(SlidingMenu.LEFT_RIGHT);  
  45.   
  46.         setBehindContentView(R.layout.left_menu_frame);  
  47.         sm.setSlidingEnabled(true);  
  48.         sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);  
  49.         sm.setShadowWidthRes(R.dimen.shadow_width);  
  50.         sm.setShadowDrawable(R.drawable.shadow);  
  51.         getSupportActionBar().setDisplayHomeAsUpEnabled(true);  
  52.         getSupportFragmentManager()  
  53.         .beginTransaction()  
  54.         .replace(R.id.left_menu_frame, new NavigationFragment())  
  55.         .commit();  
  56.         sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);  
  57.         sm.setBehindScrollScale(0);  
  58.         sm.setFadeDegree(0.25f);  
  59.   
  60.           
  61.         sm.setSecondaryMenu(R.layout.right_menu_frame);  
  62.         sm.setSecondaryShadowDrawable(R.drawable.shadow);  
  63.         getSupportFragmentManager()  
  64.         .beginTransaction()  
  65.         .replace(R.id.right_menu_frame, new SettingFragment())  
  66.         .commit();  
  67.     }  
  68.       
  69.     private void initActionBar(){  
  70.         ActionBar actionBar = getSupportActionBar();  
  71.         actionBar.setCustomView(R.layout.actionbar_layout);  
  72.         actionBar.setDisplayShowCustomEnabled(true);  
  73.         actionBar.setDisplayShowHomeEnabled(false);  
  74.           
  75.         mLeftIcon = (ImageView) findViewById(R.id.iv_left_icon);  
  76.         mRightIcon = (ImageView) findViewById(R.id.iv_right_icon);  
  77.         mLeftIcon.setOnClickListener(this);  
  78.         mRightIcon.setOnClickListener(this);  
  79.           
  80.         mTitleTextView = (TextView) findViewById(R.id.tv_title);  
  81.     }  
  82.       
  83.     private void initData(){  
  84.           
  85.     }  
  86.       
  87.       
  88.     public void switchContent(final FragmentModel fragment) {  
  89.         mTitle = fragment.mTitle;  
  90.         mContent = fragment.mFragment;  
  91.   
  92.         getSupportFragmentManager()  
  93.         .beginTransaction()  
  94.         .replace(R.id.content_frame, mContent)  
  95.         .commit();  
  96.         Handler h = new Handler();  
  97.         h.postDelayed(new Runnable() {  
  98.             public void run() {  
  99.                 getSlidingMenu().showContent();  
  100.             }  
  101.         }, 50);  
  102.           
  103.         mTitleTextView.setText(mTitle);  
  104.     }  
  105.   
  106.   
  107.   
  108.     @Override  
  109.     public void onClick(View view) {  
  110.         switch(view.getId()){  
  111.         case R.id.iv_left_icon:  
  112.             toggle();  
  113.             break;  
  114.         case R.id.iv_right_icon:  
  115.             showSecondaryMenu();  
  116.             break;  
  117.         }  
  118.     }     
  119.   
  120. }  

这里actionbar使用自定义布局,主要是使用ActionBarSherklock里的默认布局不知道怎么把title标题居中

找了半天没发现相关属性,如果有童鞋知道麻烦告知


NavigationFragment是左侧菜单

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class NavigationFragment extends Fragment implements OnCheckedChangeListener, OnClickListener{  
  2.   
  3.     private static final CommonLog log = LogFactory.createLog();  
  4.       
  5.     private View mView;  
  6.     private RadioGroup  m_radioGroup;  
  7.     private ImageButton m_AddButton;  
  8.       
  9.     private FragmentControlCenter mControlCenter;  
  10.       
  11.     public NavigationFragment(){  
  12.           
  13.     }  
  14.       
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         // TODO Auto-generated method stub  
  18.         super.onCreate(savedInstanceState);  
  19.           
  20.         log.e("NavigationFragment onCreate");  
  21.           
  22.         mControlCenter = FragmentControlCenter.getInstance(getActivity());  
  23.     }  
  24.   
  25.   
  26.     @Override  
  27.     public void onDestroy() {  
  28.         // TODO Auto-generated method stub  
  29.         super.onDestroy();  
  30.           
  31.         log.e("NavigationFragment onDestroy");  
  32.     }  
  33.       
  34.     @Override  
  35.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  36.         log.e("NavigationFragment onCreateView");  
  37.           
  38.         mView = inflater.inflate(R.layout.navitation_channel_layout, null);  
  39.         return mView;     
  40.     }  
  41.   
  42.     @Override  
  43.     public void onActivityCreated(Bundle savedInstanceState) {  
  44.         super.onActivityCreated(savedInstanceState);  
  45.         log.e("NavigationFragment onActivityCreated");  
  46.           
  47.         setupViews();  
  48.     }  
  49.       
  50.       
  51.     private void setupViews(){  
  52.         m_radioGroup = (RadioGroup) mView.findViewById(R.id.nav_radiogroup);  
  53.         ((RadioButton) m_radioGroup.getChildAt(0)).toggle();  
  54.           
  55.         m_radioGroup.setOnCheckedChangeListener(this);  
  56.           
  57.         m_AddButton = (ImageButton) mView.findViewById(R.id.ib_add_content);  
  58.         m_AddButton.setOnClickListener(this);  
  59.     }  
  60.   
  61.     @Override  
  62.     public void onCheckedChanged(RadioGroup arg0, int id) {  
  63.         switch(id){  
  64.         case R.id.rb_toutiao:  
  65.             goTouTiaoFragment();  
  66.             break;  
  67.         case R.id.rb_yule:  
  68.             goYuLeFragment();  
  69.             break;  
  70.         case R.id.rb_tech:  
  71.             goTechFragment();  
  72.             break;  
  73.         case R.id.rb_blog:  
  74.             goBlogFragment();  
  75.             break;  
  76.         }  
  77.     }  
  78.       
  79.       
  80.     private void goTouTiaoFragment(){  
  81.         if (getActivity() == null)  
  82.             return;  
  83.   
  84.         FragmentModel fragmentModel = mControlCenter.getTouTiaoFragmentModel();  
  85.         if (getActivity() instanceof MainActivity) {  
  86.             MainActivity ra = (MainActivity) getActivity();  
  87.             ra.switchContent(fragmentModel);  
  88.         }  
  89.     }  
  90.       
  91.     private void goYuLeFragment(){  
  92.         if (getActivity() == null)  
  93.             return;  
  94.   
  95.           
  96.         FragmentModel fragmentModel = mControlCenter.getYuLeFragmentModel();  
  97.         if (getActivity() instanceof MainActivity) {  
  98.             MainActivity ra = (MainActivity) getActivity();  
  99.             ra.switchContent(fragmentModel);  
  100.         }  
  101.     }  
  102.       
  103.     private void goTechFragment(){  
  104.         if (getActivity() == null)  
  105.             return;  
  106.   
  107.         FragmentModel fragmentModel = mControlCenter.getTechFragmentModel();  
  108.         if (getActivity() instanceof MainActivity) {  
  109.             MainActivity ra = (MainActivity) getActivity();  
  110.             ra.switchContent(fragmentModel);  
  111.         }  
  112.     }  
  113.       
  114.     private void goBlogFragment(){  
  115.         if (getActivity() == null)  
  116.             return;  
  117.   
  118.         FragmentModel fragmentModel = mControlCenter.getBlogFragmentModel();  
  119.         if (getActivity() instanceof MainActivity) {  
  120.             MainActivity ra = (MainActivity) getActivity();  
  121.             ra.switchContent(fragmentModel);  
  122.         }  
  123.     }  
  124.   
  125.     @Override  
  126.     public void onClick(View v) {  
  127.         switch(v.getId()){  
  128.         case R.id.ib_add_content:  
  129.             Toast.makeText(getActivity(), "添加尼妹,现在没内容!!!", Toast.LENGTH_SHORT).show();  
  130.             break;  
  131.         }  
  132.     }  
  133.       
  134. }  

SettingFragment是右侧菜单

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class SettingFragment extends Fragment{  
  2.       
  3.     private static final CommonLog log = LogFactory.createLog();  
  4.       
  5.     private View mView;  
  6.       
  7.     public SettingFragment(){  
  8.           
  9.     }  
  10.       
  11.       
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         // TODO Auto-generated method stub  
  15.         super.onCreate(savedInstanceState);  
  16.         log.e("SettingFragment onCreate");  
  17.     }  
  18.   
  19.     @Override  
  20.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  21.             Bundle savedInstanceState) {  
  22.         log.e("SettingFragment onCreateView");  
  23.         View view = inflater.inflate(R.layout.setting_layout, null);  
  24.           
  25.         return view;  
  26.     }  
  27.       
  28.       
  29.     @Override  
  30.     public void onActivityCreated(Bundle savedInstanceState) {  
  31.         super.onActivityCreated(savedInstanceState);  
  32.         log.e("SettingFragment onActivityCreated");  
  33.           
  34.         setupViews();  
  35.     }  
  36.       
  37.     private void setupViews(){  
  38.       
  39.     }  
  40.   
  41.     @Override  
  42.     public void onDestroy() {  
  43.         // TODO Auto-generated method stub  
  44.         super.onDestroy();  
  45.         log.e("SettingFragment onDestroy");  
  46.     }  
  47. }  

两个fragment是附在主activity上的,其它的大伙自个儿down代码看吧

附上链接工程:

http://download.csdn.net/detail/geniuseoe2012/5832027

压缩包解开后有如下目录:


前面三个都是链接库,彼此又有依赖,最后工程再依赖前面三者,添加完毕后就可以正常running了

相关文章
|
12月前
|
Android开发 数据安全/隐私保护 开发者
Android自定义view之模仿登录界面文本输入框(华为云APP)
本文介绍了一款自定义输入框的实现,包含静态效果、hint值浮动动画及功能扩展。通过组合多个控件完成界面布局,使用TranslateAnimation与AlphaAnimation实现hint文字上下浮动效果,支持密码加密解密显示、去除键盘回车空格输入、光标定位等功能。代码基于Android平台,提供完整源码与attrs配置,方便复用与定制。希望对开发者有所帮助。
233 0
|
12月前
|
XML Java Android开发
Android自定义view之网易云推荐歌单界面
本文详细介绍了如何通过自定义View实现网易云音乐推荐歌单界面的效果。首先,作者自定义了一个圆角图片控件`MellowImageView`,用于绘制圆角矩形图片。接着,通过将布局放入`HorizontalScrollView`中,实现了左右滑动功能,并使用`ViewFlipper`添加图片切换动画效果。文章提供了完整的代码示例,包括XML布局、动画文件和Java代码,最终展示了实现效果。此教程适合想了解自定义View和动画效果的开发者。
480 65
Android自定义view之网易云推荐歌单界面
|
12月前
|
Android开发 开发者
Android企业级实战-界面篇-3
本文是《Android企业级实战-界面篇》系列的第三篇,主要介绍分割线和条形跳转框的实现方法,二者常用于设置和个人中心界面。文章通过具体代码示例展示了如何实现这两种UI组件,并提供了效果图。实现前需准备`dimens.xml`、`ids.xml`、`colors.xml`等文件,部分资源可参考系列第一、二篇文章。代码中详细说明了布局文件的配置,如分割线的样式定义和条形跳转框的组件组合,帮助开发者快速上手并应用于实际项目中。
143 1
|
12月前
|
XML Android开发 数据格式
Android企业级实战-界面篇-2
本文为《Android企业级实战-界面篇》系列第二篇,主要介绍三个UI模块的实现:用户资料模块、关注与粉丝统计模块以及喜欢和收藏功能模块。通过详细的XML代码展示布局设计,包括dimens、ids、colors配置文件的使用,帮助开发者快速构建美观且功能齐全的界面。文章结合实际效果图,便于理解和应用。建议配合第一篇文章内容学习,以获取完整工具类支持。
178 0
|
12月前
|
算法 Java Android开发
Android企业级实战-界面篇-1
本文详细介绍了Android企业级开发中界面实现的过程,涵盖效果展示、实现前准备及代码实现。作者通过自身经历分享了Android开发经验,并提供了`dimens.xml`、`ids.xml`、`colors.xml`和`strings.xml`等配置文件内容,帮助开发者快速构建规范化的UI布局。文章以一个具体的用户消息界面为例,展示了如何使用线性布局(LinearLayout)和相对布局(RelativeLayout)实现功能模块排列,并附带注意事项及使用方法,适合初学者和进阶开发者参考学习。
251 0
|
Android开发
定制Android关机界面
定制Android关机界面
464 0
|
XML 数据可视化 Android开发
Android应用界面
Android应用界面中的布局和控件使用,包括相对布局、线性布局、表格布局、帧布局、扁平化布局等,以及AdapterView及其子类如ListView的使用方法和Adapter接口的应用。
369 0
Android应用界面
|
XML Android开发 UED
💥Android UI设计新风尚!掌握Material Design精髓,让你的界面颜值爆表!🎨
随着移动应用市场的蓬勃发展,用户对界面设计的要求日益提高。为此,掌握由Google推出的Material Design设计语言成为提升应用颜值和用户体验的关键。本文将带你深入了解Material Design的核心原则,如真实感、统一性和创新性,并通过丰富的组件库及示例代码,助你轻松打造美观且一致的应用界面。无论是色彩搭配还是动画效果,Material Design都能为你的Android应用增添无限魅力。
528 1
|
Android开发 iOS开发 C#
Xamarin.Forms:从零开始的快速入门指南——打造你的首个跨平台移动应用,轻松学会用C#和XAML构建iOS与Android通用界面的每一个步骤
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程并保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用演示了 Xamarin.Forms 的基本功能和工作原理。
608 1
|
XML Android开发 UED
💥Android UI设计新风尚!掌握Material Design精髓,让你的界面颜值爆表!🎨
【7月更文挑战第28天】随着移动应用市场的发展,用户对界面设计的要求不断提高。Material Design是由Google推出的设计语言,强调真实感、统一性和创新性,通过模拟纸张和墨水的物理属性创造沉浸式体验。它注重色彩、排版、图标和布局的一致性,确保跨设备的统一视觉风格。Android Studio提供了丰富的Material Design组件库,如按钮、卡片等,易于使用且美观。
740 1

热门文章

最新文章