Android侧滑系列(1)---官方控件DrawerLayout
前言:最近在调研一个项目,就是在已经成型的app中加入侧滑效果。由于对这里一无所知,所以准备出一套系列。本篇先mark一下官方文档,然后后期再加上其他的git大神的第三方库,希望大家能够喜欢。
so,这是一篇android developer上的翻译文章。
继承结构
简介
子类
常量
构造函数
方法
继承结构
java这门语言的优点是“万物皆对象“,这也是我最喜欢java的一点。所以任何类,它的跟都是Object类。然后子类的view不难想到,再底下的viewgroup也是同样。作为一个android开发看到widget.xxxLayout,它能包含的属性能够一目了然,这应该是最基本的素质了吧。
java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
↳ android.support.v4.widget.DrawerLayout
简介
DrawerLayout是一个允许用户可以从window纵向单侧或两侧滑入滑出的顶层容器。我们使用android:layout_gravity的属性left和right来控制Drawer的滑入和滑出的位置,start和end控制Drawer的布局方向。在使用控件时,每一个布局只能包含一个Drawer,否则会抛出runtime异常。在添加到布局中时,drawerlayout通常应该是根布局,然后注意它的width和height都要使用match_parent并且不能使用layout_gravity。然后在这个父布局中添加Drawer,这个里面一定要设置layout_gravity,它的height通常是match_parent,width就按照您的心情来,自己设定。
DrawerLayout.DrawerListener是个子类,可以监听drawer的状态和动向。尽量避免在监听到移动时咱们进行布局的绘制,否则会影响用户体验。如果你想用,可以在回调中的STATE_IDLE状态实现你的耗时操作。
从设计的角度来考虑,官方建议当gravity定义为left/start时,滑出来的东西要提供整个app的引导功能,定义为right/end时,滑出来的东西通常是要提供操作该页面的入口。
子类
-
接口
- DrawerLayout.DrawerListener 监听动作事件; 类
- DrawerLayout.LayoutParams
- DrawerLayout.SavedState 存储drawer的状态
- DrawerLayout.SimpleDrawerListener DrawerListener接口的空实现(这个设计思想非常好)
常量
- LOCK_MODE_LOCKED_CLOSED
处于锁定关闭状态? - LOCK_MODE_LOCKED_OPEN
处于锁定打开状态? - LOCK_MODE_UNDEFINED
默认状态 - LOCK_MODE_UNLOCKED
没有被锁定 - STATE_DRAGGING
用户触摸drawer并且来回滑动 - STATE_IDLE
空闲状态 - STATE_SETTLING
被设置到了一个给定的位置
方法
公共方法
- addDrawerListener(DrawerLayout.DrawerListener listener)
添加监听用来监视用户对于drawer的拖拽 - addFocusables(ArrayList views, int direction, int focusableMode)
给可以添加焦点的views添加监控 - void addView(View child, int index, ViewGroup.LayoutParams params)
这个应该不算是它特有的方法,把view添加到父view中 - void closeDrawer(View drawerView)
关闭指定的drawer - void closeDrawer(int gravity)
通过gravity关闭drawer - void closeDrawer(View drawerView, boolean animate)
关闭指定的drawer并且指定动画 - void closeDrawer(int gravity, boolean animate)
通过gravity关闭drawer并且指定是否使用动画 - void closeDrawers()
关闭当前所有的drawer - void computeScroll()
父布局调用计算出子布局的mScrollX和mScrollY的值。 - ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs)
这个不用我说了吧 - float getDrawerElevation()
获取drawer相对于父布局的高度? - int getDrawerLockMode(int edgeGravity)
检查drawer的锁定模式 - int getDrawerLockMode(View drawerView)
检查drawer的锁定模式 - CharSequence getDrawerTitle(int edgeGravity)
检查drawer的标题 - Drawable getStatusBarBackgroundDrawable()
获取状态栏图片 - boolean isDrawerOpen(View drawer)
通过drawer判断drawer是否打开 - boolean isDrawerOpen(int drawerGravity)
通过gravity判断drawer是否打开 - boolean isDrawerVisible(View drawer)
通过drawer判断drawer是否可见 - - boolean isDrawerVisible(int drawerGravity)
通过gravity判断drawer是否可见 - void onDraw(Canvas c)
画呗 - boolean onInterceptTouchEvent(MotionEvent ev)
拦截touch的事件监听 - boolean onKeyDown(int keyCode, KeyEvent event)
这个不用说了吧 - boolean onKeyUp(int keyCode, KeyEvent event)
这个不用说了吧 - void onRtlPropertiesChanged(int layoutDirection)
布局的方向,文字的方向,文字的对齐发生变化时都会调用 - boolean onTouchEvent(MotionEvent ev)
监听触摸事件 - void openDrawer(View drawerView, boolean animate)
打开drawer - void openDrawer(View drawerView)
打开drawer - void openDrawer(int gravity)
打开drawer - void openDrawer(int gravity, boolean animate)
打开drawer - void removeDrawerListener(DrawerLayout.DrawerListener listener)
移除监听,这个应该是在destory的时候调用,免得发生anr - void requestDisallowInterceptTouchEvent(boolean disallowIntercept)
子布局不想让父类监听拦截触摸事件 - void requestLayout()
不用我说了吧 - void setDrawerElevation(float elevation)
设置相对于父布局的高度 - void setDrawerListener(DrawerLayout.DrawerListener listener)
This method is deprecated. - void setDrawerLockMode(int lockMode, View drawerView)
设置锁定模式 - void setDrawerLockMode(int lockMode)
设置锁定模式 - void setDrawerLockMode(int lockMode, int edgeGravity)
设置锁定模式 - void setDrawerShadow(int resId, int gravity)
设置阴影 - void setDrawerShadow(Drawable shadowDrawable, int gravity)
设置阴影 - void setDrawerTitle(int edgeGravity, CharSequence title)
设置标题 - void setScrimColor(int color)
设置一个虚化 - void setStatusBarBackground(Drawable bg)
设置statusbar的背景 - void setStatusBarBackground(int resId)
设置statusbar的背景 - void setStatusBarBackgroundColor(int color)
设置statusbar的背景
受保护的方法
- void checkLayoutParams(ViewGroup.LayoutParams p)
- boolean drawChild(Canvas canvas, View child, long drawingTime)
画一个子view - ViewGroup.LayoutParams generateDefaultLayoutParams()
返回layout parameters.的集合. - ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p)
返回layout parameters.的集合. - void onAttachedToWindow()
当view添加到window上时调用的方法 - void onDetachedFromWindow()
当view离开window时调用的方法 - void onLayout(boolean changed, int l, int t, int r, int b)
不用说了吧 - void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
不用说了吧 - void onRestoreInstanceState(Parcelable state)
保存丢失的状态