我的视频

    • 1、高仿微信5.2.1主界面及消息提醒
    • 2、高仿QQ5.0侧滑菜单
    • 3、Android智能机器人的实现
    • 4、自定义控件:打造Android流式布局和热门标签
    • 5、Android电商活动中的刮刮卡
    本人第一次录制视频~~~还望大家支持,共同进步~


    我的视频

    • 1、高仿微信5.2.1主界面及消息提醒
    • 2、高仿QQ5.0侧滑菜单
    • 3、Android智能机器人的实现
    • 4、自定义控件:打造Android流式布局和热门标签
    • 5、Android电商活动中的刮刮卡
    本人第一次录制视频~~~还望大家支持,共同进步~


牛人视频,,一定要珍惜 。。。。。。。。


http://blog.csdn.net/lmj623565791/article/details/39185641

http://blog.csdn.net/lmj623565791/article/details/39185641

http://blog.csdn.net/lmj623565791/article/details/39185641

http://blog.csdn.net/lmj623565791/article/details/39185641

http://blog.csdn.net/lmj623565791/article/details/39185641

http://blog.csdn.net/lmj623565791/article/details/39185641




Android 自定义控件打造史上最简单的侧滑菜单

分类:【android 进阶之路】 7005人阅读 评论(58) 收藏 举报 Android 滑动菜单 侧滑 SlidingMenu

目录(?)[+]

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39185641,本文出自【张鸿洋的博客】

侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin等实现;多少都有点复杂,完成以后还需要对滑动冲突等进行处理~~今天给大家带来一个简单的实现,史上最简单有点夸张,但是的确是我目前遇到过的最简单的一种实现~~~

1、原理分析

既然是侧滑,无非就是在巴掌大的屏幕,塞入大概两巴掌大的布局,需要滑动可以出现另一个,既然这样,大家为啥不考虑使用Android提供的HorizontalScrollView呢~

如果使用HorizontalScrollView,还需要在ACTION_DOWN , ACTION_MOVE里面去监听,判断,不断改变控件位置了么? NO!!!HorizontalScrollView本身就带了滑动的功能~~

还需要自己的手动处理各种冲突么?NO!!!当然了,还是需要了解下事件分发机制的~~~

2、效果图


嗯,主界面搞了QQ一张图片,左边盗用了一兄弟的布局文件~~罪过~~ 谁有好看的布局、图片、图标神马的,可以给我发点,感激~

3、布局文件

[html] view plain copy
  1. <com.example.zhy_slidingmenu.SlidingMenuxmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="wrap_content"
  4. android:layout_height="fill_parent"
  5. android:scrollbars="none">
  6. <LinearLayout
  7. android:layout_width="wrap_content"
  8. android:layout_height="fill_parent"
  9. android:orientation="horizontal">
  10. <includelayout="@layout/layout_menu"/>
  11. <LinearLayout
  12. android:layout_width="fill_parent"
  13. android:layout_height="fill_parent"
  14. android:background="@drawable/qq">
  15. </LinearLayout>
  16. </LinearLayout>
  17. </com.example.zhy_slidingmenu.SlidingMenu>

首先是我们的自定义View,里面一个方向水平的LinearLayout,然后就是一个是菜单的布局,一个是主布局了~

4、自定义SlidingMenu

接下来就是我们最核心的代码了~

[java] view plain copy
  1. packagecom.example.zhy_slidingmenu;
  2. importandroid.content.Context;
  3. importandroid.util.AttributeSet;
  4. importandroid.util.TypedValue;
  5. importandroid.view.MotionEvent;
  6. importandroid.view.ViewGroup;
  7. importandroid.widget.HorizontalScrollView;
  8. importandroid.widget.LinearLayout;
  9. importcom.zhy.utils.ScreenUtils;
  10. publicclassSlidingMenuextendsHorizontalScrollView
  11. {
  12. /**
  13. *屏幕宽度
  14. */
  15. privateintmScreenWidth;
  16. /**
  17. *dp
  18. */
  19. privateintmMenuRightPadding=50;
  20. /**
  21. *菜单的宽度
  22. */
  23. privateintmMenuWidth;
  24. privateintmHalfMenuWidth;
  25. privatebooleanonce;
  26. publicSlidingMenu(Contextcontext,AttributeSetattrs)
  27. {
  28. super(context,attrs);
  29. mScreenWidth=ScreenUtils.getScreenWidth(context);
  30. }
  31. @Override
  32. protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec)
  33. {
  34. /**
  35. *显示的设置一个宽度
  36. */
  37. if(!once)
  38. {
  39. LinearLayoutwrapper=(LinearLayout)getChildAt(0);
  40. ViewGroupmenu=(ViewGroup)wrapper.getChildAt(0);
  41. ViewGroupcontent=(ViewGroup)wrapper.getChildAt(1);
  42. //dptopx
  43. mMenuRightPadding=(int)TypedValue.applyDimension(
  44. TypedValue.COMPLEX_UNIT_DIP,mMenuRightPadding,content
  45. .getResources().getDisplayMetrics());
  46. mMenuWidth=mScreenWidth-mMenuRightPadding;
  47. mHalfMenuWidth=mMenuWidth/2;
  48. menu.getLayoutParams().width=mMenuWidth;
  49. content.getLayoutParams().width=mScreenWidth;
  50. }
  51. super.onMeasure(widthMeasureSpec,heightMeasureSpec);
  52. }
  53. @Override
  54. protectedvoidonLayout(booleanchanged,intl,intt,intr,intb)
  55. {
  56. super.onLayout(changed,l,t,r,b);
  57. if(changed)
  58. {
  59. //将菜单隐藏
  60. this.scrollTo(mMenuWidth,0);
  61. once=true;
  62. }
  63. }
  64. @Override
  65. publicbooleanonTouchEvent(MotionEventev)
  66. {
  67. intaction=ev.getAction();
  68. switch(action)
  69. {
  70. //Up时,进行判断,如果显示区域大于菜单宽度一半则完全显示,否则隐藏
  71. caseMotionEvent.ACTION_UP:
  72. intscrollX=getScrollX();
  73. if(scrollX>mHalfMenuWidth)
  74. this.smoothScrollTo(mMenuWidth,0);
  75. else
  76. this.smoothScrollTo(0,0);
  77. returntrue;
  78. }
  79. returnsuper.onTouchEvent(ev);
  80. }
  81. }

哈哈,完工~上面的演示图,就用到这么点代码~~

代码怎么样,短不短~除了设置宽度这些杂七杂八的代码~正在处理滑动的代码不过10行~~我说史上最简单不为过吧~

嗯,由于代码过于短,就不解释了,大家自己看下注释~

5、扩展

嗯,就下来,我们完善下程序,我准备首先把菜单布局里面改成ListView来证明我们是没有冲突的;然后添加一个属性让用户配置菜单距离右边的边距的值;再对外公布一个方法,点击自动打开菜单,供用户点击某个按钮,菜单慢慢滑出来~

1、添加自定义属性

a、首先在values文件夹下新建一个attr.xml,写入以下内容:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <resources>
  3. <attrname="rightPadding"format="dimension"/>
  4. <declare-styleablename="SlidingMenu">
  5. <attrname="rightPadding"/>
  6. </declare-styleable>
  7. </resources>
b、在布局中声明命名空间和使用属性

定义完了,肯定要使用么。

[html] view plain copy
  1. <com.example.zhy_slidingmenu.SlidingMenuxmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. xmlns:zhy="http://schemas.android.com/apk/res/com.example.zhy_slidingmenu"
  4. android:layout_width="wrap_content"
  5. android:layout_height="fill_parent"
  6. android:scrollbars="none"
  7. zhy:rightPadding="100dp">

可以看到我们的命名空间:xmlns:zhy="http://schemas.android.com/apk/res/com.example.zhy_slidingmenu" 是http://schemas.android.com/apk/res/加上我们的包名;

我们的属性:zhy:rightPadding="100dp"这里我设置了100dp;

注:很多人问我,没有提示咋办,这样,你clean下项目,如果你运气好,就有提示了,嗯,运气好~

c、在我们自定义类中获得属性

[java] view plain copy
  1. publicSlidingMenu(Contextcontext,AttributeSetattrs,intdefStyle)
  2. {
  3. super(context,attrs,defStyle);
  4. mScreenWidth=ScreenUtils.getScreenWidth(context);
  5. TypedArraya=context.getTheme().obtainStyledAttributes(attrs,
  6. R.styleable.SlidingMenu,defStyle,0);
  7. intn=a.getIndexCount();
  8. for(inti=0;i<n;i++)
  9. {
  10. intattr=a.getIndex(i);
  11. switch(attr)
  12. {
  13. caseR.styleable.SlidingMenu_rightPadding:
  14. //默认50
  15. mMenuRightPadding=a.getDimensionPixelSize(attr,
  16. (int)TypedValue.applyDimension(
  17. TypedValue.COMPLEX_UNIT_DIP,50f,
  18. getResources().getDisplayMetrics()));//默认为10DP
  19. break;
  20. }
  21. }
  22. a.recycle();
  23. }

在三个参数的构造方法中,通过TypeArray获取就行了~

好了,这样就行了~如果你又很多自定义属性,按照上面的步骤来就行了~~

2、对外公布一个打开菜单的方法

首先定义一个boolean isOpen变量,用来标识我们当前菜单的状态~~然后记得在ACTION_UP的时候改变下状态:

[java] view plain copy
  1. caseMotionEvent.ACTION_UP:
  2. intscrollX=getScrollX();
  3. if(scrollX>mHalfMenuWidth)
  4. {
  5. this.smoothScrollTo(mMenuWidth,0);
  6. isOpen=false;
  7. }else
  8. {
  9. this.smoothScrollTo(0,0);
  10. isOpen=true;
  11. }
  12. returntrue;
  13. }

下面开始添加方法:

[java] view plain copy
  1. /**
  2. *打开菜单
  3. */
  4. publicvoidopenMenu()
  5. {
  6. if(isOpen)
  7. return;
  8. this.smoothScrollTo(0,0);
  9. isOpen=true;
  10. }
  11. /**
  12. *关闭菜单
  13. */
  14. publicvoidcloseMenu()
  15. {
  16. if(isOpen)
  17. {
  18. this.smoothScrollTo(mMenuWidth,0);
  19. isOpen=false;
  20. }
  21. }
  22. /**
  23. *切换菜单状态
  24. */
  25. publicvoidtoggle()
  26. {
  27. if(isOpen)
  28. {
  29. closeMenu();
  30. }else
  31. {
  32. openMenu();
  33. }
  34. }

顺手多添加了两个。。。

下面,我们挑一个进行测试:

主布局多添加一个按钮,用于触发toggleMenu()方法

主Activity

[java] view plain copy
  1. publicclassMainActivityextendsActivity
  2. {
  3. privateSlidingMenumMenu;
  4. @Override
  5. protectedvoidonCreate(BundlesavedInstanceState)
  6. {
  7. super.onCreate(savedInstanceState);
  8. requestWindowFeature(Window.FEATURE_NO_TITLE);
  9. setContentView(R.layout.activity_main);
  10. mMenu=(SlidingMenu)findViewById(R.id.id_menu);
  11. }
  12. publicvoidtoggleMenu(Viewview)
  13. {
  14. mMenu.toggle();
  15. }
  16. }

好了,看下现在的效果图:


我们把padding改成了100dp~

然后点击我们的按钮,看哈效果~~

3、添加ListView测试


好了~~ListView也测试完了~~大家可以根据自己的需求各种修改~~

对了,今天测试用QQ的目的是为了,下次我要拿上面的代码,改造和QQ5.0一模一样的效果,大家有兴趣可以提前试一试,QQ的菜单好像是隐藏在主界面下面一样,给人感觉不是划出来的,我们这个例子也能做出那样的效果,拭目以待吧;剩下就是各种缩放,透明度的动画了~~~


源码点击下载


如果觉得不错,评价下~哈~


----------------------------------------------------------------------------------------------------------

博主部分视频已经上线,如果你不喜欢枯燥的文本,请猛戳(初录,期待您的支持):

1、高仿微信5.2.1主界面及消息提醒

2、高仿QQ5.0侧滑

3、Android智能机器人“小慕”的实现

4、Android自定义控件 打造Android流式布局和热门标签






26
0

更多相关文章

  1. android的map上的浮动菜单以及日历控件
  2. android菜单详解
  3. android:shape的使用 (android用xml文件生成图像控件)
  4. android:Spinner(下拉框)控件的使用
  5. 点击LinearLayout使用selector改变TextView字体颜色
  6. PreferenceActivity里加入普通的View
  7. Android资料
  8. 基本控件学习以( RadioGroup和RadioButton 的学习使用)
  9. Android(安卓)获取控件宽高

随机推荐

  1. Android(安卓)环境变量
  2. Android(安卓)之 将RAW资源文件写入SD卡
  3. android M 及以上版本将应用添加至忽略电
  4. android中缩放图片的方法
  5. Android(安卓)--- Create Menu 的二级子
  6. Android(安卓)动画2--View异步显示和隐藏
  7. Android仿微信底部菜单
  8. Android(安卓)运行错误:The connection to
  9. Android(安卓)HOME键的屏蔽. 同事小伟 提
  10. Android(安卓)Notification通知栏的使用,