Android仿新浪新闻SlidingMenu界面的实现 .
先看看原图:


如图所示,这种侧滑效果以另一种方式替代了原先tab导航的那种用户体验方式
给人耳目一新的感觉,现已被广大知名应用所效仿,如新浪新闻,网易新闻,人人网等
那么这种效果该如何实现呢?那就需要用到一个开源库SlidingMenu
Github地址:https://github.com/jfeinstein10/SlidingMenu
里面包含了demo示例,相关效果图如下:


同时该库又依赖另一个开源库ActionBarSherkLock ,有关该库的介绍,请看此博文http://blog.csdn.net/geniuseoe2012/article/details/9046487
大家最好先把官方demo跑一遍,理清里边的依赖关系以及对库的基本使用,这样自己运用到项目当中就可以得心应手了
OK,最后言归正传,看看新浪新闻的侧滑实现,先上山寨版效果图:



代码片段:
- public class MainActivity extends SlidingFragmentActivity implements OnClickListener{
- private static final CommonLog log = LogFactory.createLog();
- private String mTitle;
- private Fragment mContent;
- private ImageView mLeftIcon;
- private ImageView mRightIcon;
- private TextView mTitleTextView;
- private FragmentControlCenter mControlCenter;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- mControlCenter = FragmentControlCenter.getInstance(this);
- setupViews();
- initData();
- }
- private void setupViews(){
- setContentView(R.layout.main_slidemenu_layout);
- initActionBar();
- initSlideMenu();
- }
- private void initSlideMenu(){
- FragmentModel fragmentModel = mControlCenter.getTouTiaoFragmentModel();
- switchContent(fragmentModel);
- SlidingMenu sm = getSlidingMenu();
- sm.setMode(SlidingMenu.LEFT_RIGHT);
- setBehindContentView(R.layout.left_menu_frame);
- sm.setSlidingEnabled(true);
- sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
- sm.setShadowWidthRes(R.dimen.shadow_width);
- sm.setShadowDrawable(R.drawable.shadow);
- getSupportActionBar().setDisplayHomeAsUpEnabled(true);
- getSupportFragmentManager()
- .beginTransaction()
- .replace(R.id.left_menu_frame, new NavigationFragment())
- .commit();
- sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);
- sm.setBehindScrollScale(0);
- sm.setFadeDegree(0.25f);
- sm.setSecondaryMenu(R.layout.right_menu_frame);
- sm.setSecondaryShadowDrawable(R.drawable.shadow);
- getSupportFragmentManager()
- .beginTransaction()
- .replace(R.id.right_menu_frame, new SettingFragment())
- .commit();
- }
- private void initActionBar(){
- ActionBar actionBar = getSupportActionBar();
- actionBar.setCustomView(R.layout.actionbar_layout);
- actionBar.setDisplayShowCustomEnabled(true);
- actionBar.setDisplayShowHomeEnabled(false);
- mLeftIcon = (ImageView) findViewById(R.id.iv_left_icon);
- mRightIcon = (ImageView) findViewById(R.id.iv_right_icon);
- mLeftIcon.setOnClickListener(this);
- mRightIcon.setOnClickListener(this);
- mTitleTextView = (TextView) findViewById(R.id.tv_title);
- }
- private void initData(){
- }
- public void switchContent(final FragmentModel fragment) {
- mTitle = fragment.mTitle;
- mContent = fragment.mFragment;
- getSupportFragmentManager()
- .beginTransaction()
- .replace(R.id.content_frame, mContent)
- .commit();
- Handler h = new Handler();
- h.postDelayed(new Runnable() {
- public void run() {
- getSlidingMenu().showContent();
- }
- }, 50);
- mTitleTextView.setText(mTitle);
- }
- @Override
- public void onClick(View view) {
- switch(view.getId()){
- case R.id.iv_left_icon:
- toggle();
- break;
- case R.id.iv_right_icon:
- showSecondaryMenu();
- break;
- }
- }
- }
这里actionbar使用自定义布局,主要是使用ActionBarSherklock里的默认布局不知道怎么把title标题居中
找了半天没发现相关属性,如果有童鞋知道麻烦告知
NavigationFragment是左侧菜单
- public class NavigationFragment extends Fragment implements OnCheckedChangeListener, OnClickListener{
- private static final CommonLog log = LogFactory.createLog();
- private View mView;
- private RadioGroup m_radioGroup;
- private ImageButton m_AddButton;
- private FragmentControlCenter mControlCenter;
- public NavigationFragment(){
- }
- @Override
- public void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- log.e("NavigationFragment onCreate");
- mControlCenter = FragmentControlCenter.getInstance(getActivity());
- }
- @Override
- public void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- log.e("NavigationFragment onDestroy");
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- log.e("NavigationFragment onCreateView");
- mView = inflater.inflate(R.layout.navitation_channel_layout, null);
- return mView;
- }
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- log.e("NavigationFragment onActivityCreated");
- setupViews();
- }
- private void setupViews(){
- m_radioGroup = (RadioGroup) mView.findViewById(R.id.nav_radiogroup);
- ((RadioButton) m_radioGroup.getChildAt(0)).toggle();
- m_radioGroup.setOnCheckedChangeListener(this);
- m_AddButton = (ImageButton) mView.findViewById(R.id.ib_add_content);
- m_AddButton.setOnClickListener(this);
- }
- @Override
- public void onCheckedChanged(RadioGroup arg0, int id) {
- switch(id){
- case R.id.rb_toutiao:
- goTouTiaoFragment();
- break;
- case R.id.rb_yule:
- goYuLeFragment();
- break;
- case R.id.rb_tech:
- goTechFragment();
- break;
- case R.id.rb_blog:
- goBlogFragment();
- break;
- }
- }
- private void goTouTiaoFragment(){
- if (getActivity() == null)
- return;
- FragmentModel fragmentModel = mControlCenter.getTouTiaoFragmentModel();
- if (getActivity() instanceof MainActivity) {
- MainActivity ra = (MainActivity) getActivity();
- ra.switchContent(fragmentModel);
- }
- }
- private void goYuLeFragment(){
- if (getActivity() == null)
- return;
- FragmentModel fragmentModel = mControlCenter.getYuLeFragmentModel();
- if (getActivity() instanceof MainActivity) {
- MainActivity ra = (MainActivity) getActivity();
- ra.switchContent(fragmentModel);
- }
- }
- private void goTechFragment(){
- if (getActivity() == null)
- return;
- FragmentModel fragmentModel = mControlCenter.getTechFragmentModel();
- if (getActivity() instanceof MainActivity) {
- MainActivity ra = (MainActivity) getActivity();
- ra.switchContent(fragmentModel);
- }
- }
- private void goBlogFragment(){
- if (getActivity() == null)
- return;
- FragmentModel fragmentModel = mControlCenter.getBlogFragmentModel();
- if (getActivity() instanceof MainActivity) {
- MainActivity ra = (MainActivity) getActivity();
- ra.switchContent(fragmentModel);
- }
- }
- @Override
- public void onClick(View v) {
- switch(v.getId()){
- case R.id.ib_add_content:
- Toast.makeText(getActivity(), "添加尼妹,现在没内容!!!", Toast.LENGTH_SHORT).show();
- break;
- }
- }
- }
SettingFragment是右侧菜单
- public class SettingFragment extends Fragment{
- private static final CommonLog log = LogFactory.createLog();
- private View mView;
- public SettingFragment(){
- }
- @Override
- public void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- log.e("SettingFragment onCreate");
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- log.e("SettingFragment onCreateView");
- View view = inflater.inflate(R.layout.setting_layout, null);
- return view;
- }
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- log.e("SettingFragment onActivityCreated");
- setupViews();
- }
- private void setupViews(){
- }
- @Override
- public void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- log.e("SettingFragment onDestroy");
- }
- }
两个fragment是附在主activity上的,其它的大伙自个儿down代码看吧
附上链接工程:
http://download.csdn.net/detail/geniuseoe2012/5832027
压缩包解开后有如下目录:

前面三个都是链接库,彼此又有依赖,最后工程再依赖前面三者,添加完毕后就可以正常running了
Android仿新浪新闻SlidingMenu界面的实现 .的更多相关文章
- Lance老师UI系列教程第八课->新浪新闻SlidingMenu界面的实现
UI系列教程第八课:Lance老师UI系列教程第八课->新浪新闻SlidingMenu界面的实现 今天蓝老师要讲的是关于新浪新闻侧滑界面的实现.先看看原图: 如图所示,这种侧滑效果以另一种方式替 ...
- android仿新浪引导界面
最近在研究如何做出仿微信,仿新浪等应用,第一次安装使用的使用展示应用程序的新特性和用法. 实现功能:左右手势滑屏 底部小圆点随当前显示页跳动 浮动按钮显示.当触屏事件发生显示,否则就渐渐消失 先转个文 ...
- jquery实现隐藏显示层动画效果、仿新浪字符动态输入、tab效果
已经有两年多没登陆csdn账号了,中间做了些旁的事,可是现在却还是回归程序,但改做前端了,虽然很多东西都已忘得差不多了,但还是应该摆正心态,慢慢来,在前端漫游,做一只快乐双鱼. 路是一步一步走出来的, ...
- 门户级UGC系统的技术进化路线——新浪新闻评论系统的架构演进和经验总结(转)
add by zhj:先收藏了 摘要:评论系统是所有门户网站的核心标准服务组件之一.本文作者曾负责新浪网评论系统多年,这套系统不仅服务于门户新闻业务,还包括调查.投票等产品,经历了从单机到多机再到集群 ...
- selenium+BeautifulSoup+phantomjs爬取新浪新闻
一 下载phantomjs,把phantomjs.exe的文件路径加到环境变量中,也可以phantomjs.exe拷贝到一个已存在的环境变量路径中,比如我用的anaconda,我把phantomjs. ...
- Python_网络爬虫(新浪新闻抓取)
爬取前的准备: BeautifulSoup的导入:pip install BeautifulSoup4 requests的导入:pip install requests 下载jupyter noteb ...
- 小爬新浪新闻AFCCL
1.任务目标: 爬取新浪新闻AFCCL的文章:文章标题.时间.来源.内容.评论数等信息. 2.目标网页: http://sports.sina.com.cn/z/AFCCL/ 3.网页分析 4.源代码 ...
- Python爬虫:新浪新闻详情页的数据抓取(函数版)
上一篇文章<Python爬虫:抓取新浪新闻数据>详细解说了如何抓取新浪新闻详情页的相关数据,但代码的构建不利于后续扩展,每次抓取新的详情页时都需要重新写一遍,因此,我们需要将其整理成函数, ...
- python3爬虫-爬取新浪新闻首页所有新闻标题
准备工作:安装requests和BeautifulSoup4.打开cmd,输入如下命令 pip install requests pip install BeautifulSoup4 打开我们要爬取的 ...
随机推荐
- Qt浅谈之总结(整理)
Qt浅谈之总结(整理) 来源 http://blog.csdn.net/taiyang1987912/article/details/32713781 一.简介 QT的一些知识点总结,方便以后查阅. ...
- DelayQueue实现Java延时任务
最近公司需要实现一个订单超时自动关闭的功能,由Java这块来实现 一开始我以为就是定时任务,深入了解了之后发现并不是,官方名称应该叫延时任务,到时间之后 执行传过来的回调函数 这个功能我一共前前后后写 ...
- 【BZOJ4596】黑暗前的幻想乡(矩阵树定理,容斥)
[BZOJ4596]黑暗前的幻想乡(矩阵树定理,容斥) 题面 BZOJ 有\(n\)个点,要求连出一棵生成树, 指定了一些边可以染成某种颜色,一共\(n-1\)种颜色, 求所有颜色都出现过的生成树方案 ...
- C++操作Windows WIFI
原文链接地址:https://blog.csdn.net/just_do_1122/article/details/78031024 实现功能 无线网卡列表 无线热点扫面 无线 ...
- 洛谷p1017 进制转换(2000noip提高组)
洛谷P1017 进制转换 题意分析 给出一个数n,要求用负R进制显示. n∈[-32768,32767].R ∈[-20,-2] 考察的是负进制数的转换,需要理解短除法. 看到这道题的时候,我是比较蒙 ...
- 【莫队】【P3834】 【模板】可持久化线段树 1(主席树)
大家好,我是个毒瘤,我非常喜欢暴力数据结构,于是我就用莫队+分块过了这个题 Solution 发现这个题静态查询资瓷离线,于是考虑莫队. 在这里简单介绍一下莫队: 将所有询问离线后,对原序列分块.按照 ...
- OA项目中的论坛模块设计与实现
1.论坛是什么?论坛与贴吧有什么区别? 简单的说论坛和贴吧都是发表言论和讨论的一个平台. 贴吧是论坛的一个部分. 2.关于论坛模块的需求分析? 首先我们看看论坛的几个设计页面: 这个主要是论坛的版块设 ...
- Holm–Bonferroni method
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...
- 前端PHP入门-033-连接数据库-天龙八步
php检查MySQL的支持是否开启? 若没有看到mysqli扩展在windows服务器下,打开php.ini文件,将php_mysqli.dll打开即可! 注意: 从PHP7开始默认不再支持mysql ...
- 在web.xml中添加servlet报错问题
出现这种问题的原因是因为servlet-name标签中没有名称,如果错误出现在servlet上,也是一样,补充servlet-name名称即可.如下图
