在Android项目中使用视图实现一个侧滑菜单?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强>一、概述强>
在应用中,经常会出现侧滑菜单,侧滑滑出视图等效果,虽然说Android有很多第三方开源库,但是实际上咱们可以自己也写一个自定义的侧滑视图控件,其实不难,主要涉及到以下几个要点:
1。对Android中窗口类中的DecorView有所了解
2。对照片卷轴类实现平滑移动效果
3。自定义ViewGroup的实现
首先来看看效果图吧:
下面是对上面这张图的解释:
1, DecorView为整个窗口界面的最顶层视图。
2, DecorView只有一个子元素为LinearLayout。代表整个窗口界面,包含通知栏,标题栏,内容显示栏三块区域。
3, LinearLayout里有两个FrameLayout子元素。
,(20)为标题栏显示界面。只有一个TextView显示应用的名称。也可以自定义标题栏,载入后的自定义标题栏视图将加入FrameLayout中。
,(21)为内容栏显示界面。就是setContentView()方法载入的布局界面,加入其中只
有了上面的DecorVIew知识背景,现在就来说说怎么添加蒙层视图和将自定义侧滑视图添加到活动的DecorVIew中,首先把蒙层视图添加到
(31) customView中去,然后将自定义侧滑视图添加到(21)FrameLayout中去,至于为什么要这样,是因为考虑到自定义侧滑视图不一定是宽度为屏幕宽度,所以才这么做,而且也方面处理有无标题栏,有无采用沉浸式状态栏设计等情况。
<强>二、自定义侧滑视图的实现强>
根据上面的概述,大家应该知道大概的思路了,下面我就给出自定义侧滑视图类的核心代码:
1,自定义侧视图用滑到的变量:
//侧滑方向,从哪侧滑出 公共静态enum正电子{ 左,右 } 私人上下文mContext; mActivity私人活动; 私人照片卷轴mScroller=零;//侧滑菜单布局的观点 私人观点mMenuView;//底部蒙层的观点 私人观点mMaskView; 私人int mMenuWidth=0;//屏幕宽度 私人int mScreenWidth=0;//是否在滑动中 私人布尔mIsMoving=false;//显示登录界面与否 私人布尔mShow=false;//滑动动画时间 私人int mDuration=600;//缺省侧滑方向为左 私人正电子mPositon=Positon.LEFT;
2,初始化创建自定义侧滑观点:
* * *创建侧滑菜单视图 */公共静态XCSlideView创建活动(活动){=new XCSlideView XCSlideView视图(活动); 返回视图; }/* * *创建侧滑菜单视图 */公共静态XCSlideView创建活动活动,正电子正电子){=new XCSlideView XCSlideView视图(活动); 视图。mPositon=阵地; 返回视图; }
3,创建半透明蒙层视图,并添加到contentView中去
/* * *创建蒙层视图并添加到contentView中 */私人空间attachToContentView(活动活动,正电子正电子){ mPositon=阵地; ViewGroup contentFrameLayout=(ViewGroup) activity.findViewById (android.R.id.content); ViewGroup contentView=((ViewGroup) contentFrameLayout.getChildAt (0)); mMaskView=新视图(活动); mMaskView.setBackgroundColor (mContext.getResources () .getColor (R.color.mask_color)); contentView。addView (mMaskView contentView.getLayoutParams ()); mMaskView.setVisibility (View.GONE); mMaskView.setClickable(真正的); mMaskView.setOnClickListener (new>/* * *设置侧滑菜单视图,并添加到DectorView→LinearLayout→内容显示区域视图中 */公共空间setMenuView(活动活动,查看视图){ mActivity=活动; mMenuView=视图; LayoutParams params=new LayoutParams (LayoutParams。MATCH_PARENT LayoutParams.MATCH_PARENT); addView (mMenuView params); mMenuView。邮报》(新Runnable () { @Override 公共空间run () {//TODO自动生成方法存根 mMenuWidth=mMenuView.getWidth (); 开关(mPositon) { 例左: XCSlideView.this。scrollTo (mScreenWidth 0); 打破; 例吧: XCSlideView.this。scrollTo (-mScreenWidth 0); 打破; } } }); ViewGroup contentFrameLayout=(ViewGroup) activity.findViewById (android.R.id.content); ViewGroup contentView=contentFrameLayout; contentView.addView(这个); FrameLayout。LayoutParams LayoutParams=(FrameLayout.LayoutParams) this.getLayoutParams (); 开关(mPositon) { 例左: layoutParams。重力=Gravity.LEFT; layoutParams。leftMargin=0; 打破; 例吧: layoutParams。重力=Gravity.RIGHT; layoutParams。rightMargin=0; 打破; } TextView titleFrameLayout=(TextView) activity.findViewById (android.R.id.title); 如果(titleFrameLayout !=null) { layoutParams。页面顶栏=DensityUtil.getStatusBarHeight (mContext); } .flags .getAttributes int旗帜=mActivity.getWindow () (); int国旗=(旗帜,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 如果(标志==WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) {//说明状态栏使用沉浸式 layoutParams。页面顶栏=DensityUtil.getStatusBarHeight (mContext); } this.setLayoutParams (layoutParams); }在Android项目中使用视图实现一个侧滑菜单