侧滑菜单的一点小小的总结
2016-07-24 09:51
459 查看
1.首先在看了别人的一些博客之后,想自己总结一下自己对于Android侧滑菜单的学习
2.试着发表自己的第一篇博客,下面就开始对于侧滑菜单我的学习总结吧:
1.首先我觉得应该着重理解两个方法的含义和使用;
第一个方法:View的getScrollX()方法,对于该方法我在看了许多博客之后的理解是:返回调用该方法的组件的显示部分的最左边的X坐标减去该组件最左边的X坐标;也就是该组件左边没有显示部分的长度;也可以理解成当前组件显示部分的左边到整个组件的左边的距离;
第二个方法:View的smoothScrollTo(int X, int Y)方法:这个方法其实和View中的ScrollTo(int X, int Y)方法是一样的,只不过前者是平稳的滑动,而后者是快速的滑动到指定的位置,两者都是哪个组件调用ScrollTo(x,y)方法就表示将该组件的x,y坐标位置放在显示区域的原点,也可以理解为就将屏幕坐标体系移动x,y处,即从组件x,y处开始显示该组件;
2.理解了这两个方法之后就基本大功告成了,接下来就直接看源码吧:
1)定义一个布局,布局代码如下:其中最外层是自己要自定义的一个SlidingMenu 它继承了HorizontalScrollView,
接下来里面嵌套了一个LinearLayout,LinearLayout中先放置了一个侧滑菜单的布局,再放了一个主内容的布局:里面只是放了一张图片和一个按钮用来切换菜单的显示和隐藏
2)接下来就来自定义SlidingMenu这个类,里面有获取自定义的属性,也就是自定义了侧滑菜单显示时离屏幕右边的宽度,自定义属性文件也在下面,这里就不多介绍了,里面都有注释,直接看源码:
自定义的属性资源文件
3)接下来就可以直接在Activity中使用自定义的SlidingMenu了,代码如下:
4)到此为止,侧滑菜单最简单的实现也就实现完了,之前看过用PopupWindow弹出款的方式来实现ListView中的Item滑动删除的效果,这种方式应该也可以用来实现吧,具体还没去实现,下次实现了再总结吧!
2.试着发表自己的第一篇博客,下面就开始对于侧滑菜单我的学习总结吧:
1.首先我觉得应该着重理解两个方法的含义和使用;
第一个方法:View的getScrollX()方法,对于该方法我在看了许多博客之后的理解是:返回调用该方法的组件的显示部分的最左边的X坐标减去该组件最左边的X坐标;也就是该组件左边没有显示部分的长度;也可以理解成当前组件显示部分的左边到整个组件的左边的距离;
第二个方法:View的smoothScrollTo(int X, int Y)方法:这个方法其实和View中的ScrollTo(int X, int Y)方法是一样的,只不过前者是平稳的滑动,而后者是快速的滑动到指定的位置,两者都是哪个组件调用ScrollTo(x,y)方法就表示将该组件的x,y坐标位置放在显示区域的原点,也可以理解为就将屏幕坐标体系移动x,y处,即从组件x,y处开始显示该组件;
2.理解了这两个方法之后就基本大功告成了,接下来就直接看源码吧:
1)定义一个布局,布局代码如下:其中最外层是自己要自定义的一个SlidingMenu 它继承了HorizontalScrollView,
接下来里面嵌套了一个LinearLayout,LinearLayout中先放置了一个侧滑菜单的布局,再放了一个主内容的布局:里面只是放了一张图片和一个按钮用来切换菜单的显示和隐藏
<com.ecjtu.slidingMenu.SlidingMenu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ecjtu="http://schemas.android.com/apk/res/com.ecjtu.slidingMenu" tools:context="com.ecjtu.slidingMenu.MainActivity" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="none" android:id="@+id/slidingMenu" ecjtu:menuRightPadding="150dp"> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="horizontal"> <include layout="@layout/test_menu"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:background="@drawable/skin_preview_red_1"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="toggleMenu" android:text="切换菜单"/> </LinearLayout> </LinearLayout> </com.ecjtu.slidingMenu.SlidingMenu>
2)接下来就来自定义SlidingMenu这个类,里面有获取自定义的属性,也就是自定义了侧滑菜单显示时离屏幕右边的宽度,自定义属性文件也在下面,这里就不多介绍了,里面都有注释,直接看源码:
public class SlidingMenu extends HorizontalScrollView{ //屏幕宽度 private int mScreenWidth; //菜单显示时离屏幕右边的距离,单位为dp private int mMenuRightPadding; //菜单的宽度 private int mMenuWidth; //菜单的一半宽,等下用来判断是否显示菜单 private int mHalfMenuWidth; //是否是第一次执行onMeasure()方法 private boolean once=false; //菜单是否已经显示 private boolean isOpen=false; public SlidingMenu(Context context, AttributeSet attrs) { super(context, attrs); //获取屏幕的宽度 WindowManager wManager=(WindowManager)context .getSystemService(Context.WINDOW_SERVICE); DisplayMetrics metrics=new DisplayMetrics(); wManager.getDefaultDisplay().getMetrics(metrics); mScreenWidth=metrics.widthPixels; //拿到自定义属性文件中属性组 TypedArray tArray=context.obtainStyledAttributes(attrs, R.styleable.MySlidingMenuAttrs); //从用户自定义的属性中拿到菜单显示时离屏幕右边的距离,单位为dp, //但得到的值已经是将dp自动转换为px了,默认为100dp,并且将100dp转换为100px mMenuRightPadding=tArray.getDimensionPixelSize( R.styleable.MySlidingMenuAttrs_menuRightPadding, (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics())); //回收资源 tArray.recycle(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //设置菜单显示的宽度 if (!once) { LinearLayout layout=(LinearLayout)getChildAt(0); //获取菜单布局和内容布局 ViewGroup menu=(ViewGroup)layout.getChildAt(0); ViewGroup content=(ViewGroup)layout.getChildAt(1); //菜单的宽度=屏幕宽度-菜单显示时离屏幕的右边距 mMenuWidth=mScreenWidth-mMenuRightPadding; mHalfMenuWidth=mMenuWidth/2; //将菜单的宽赋给菜单,屏幕的宽赋给屏幕显示的内容 menu.getLayoutParams().width=mMenuWidth; content.getLayoutParams().width=mScreenWidth; once=true; } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); //布局发生改变时将菜单隐藏 if (changed) { //默认将菜单隐藏 this.scrollTo(mMenuWidth, 0); once=true; } } @Override public boolean onTouchEvent(MotionEvent ev) { int action=ev.getAction(); switch (action) { case MotionEvent.ACTION_UP: //获取当前组件显示部分的左边到整个组件的左边的距离,如果该距离大于 //菜单宽度的一半就隐藏菜单,小于则显示菜单 int scrollX=getScrollX(); if (scrollX>mHalfMenuWidth) { //将滚动条向右移动,隐藏菜单,哪个组件调用ScrollTo(x,y)方法就 //表示将该组件的x,y坐标位置放在显示区域的原点, //也可以理解为就将屏幕坐标体系移动x,y处,即从组件x,y处开始显示该组件 this.smoothScrollTo(mMenuWidth, 0); isOpen=false; }else if(scrollX<mHalfMenuWidth){ //将滚动条向左移动,显示菜单 this.smoothScrollTo(0, 0); isOpen=true; } return true; } return super.onTouchEvent(ev); } //打开菜单 public void openMenu(){ if (isOpen) { return; } this.smoothScrollTo(0, 0); isOpen=true; } //关闭菜单 public void closeMenu(){ if (isOpen) { this.smoothScrollTo(mMenuWidth, 0); isOpen=false; } } //切换菜单的状态 public void toggle(){ if (isOpen) { closeMenu(); }else { openMenu(); } } }
自定义的属性资源文件
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MySlidingMenuAttrs"> <attr name="menuRightPadding" format="dimension" /> </declare-styleable> </resources>
3)接下来就可以直接在Activity中使用自定义的SlidingMenu了,代码如下:
public class MainActivity extends Activity { private SlidingMenu slidingMenu; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); slidingMenu=(SlidingMenu)findViewById(R.id.slidingMenu); } //切换菜单的状态 public void toggleMenu(View view){ slidingMenu.toggle(); } }
4)到此为止,侧滑菜单最简单的实现也就实现完了,之前看过用PopupWindow弹出款的方式来实现ListView中的Item滑动删除的效果,这种方式应该也可以用来实现吧,具体还没去实现,下次实现了再总结吧!
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories