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

转载请标明出处:,本文出自【张鸿洋的博客】

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

1、原理分析

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

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

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

2、效果图

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

3、布局文件<com.example.zhy_slidingmenu.SlidingMenu xmlns:android=""xmlns:tools=""android:layout_width="wrap_content"android:layout_height="fill_parent"android:scrollbars="none" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="fill_parent"android:orientation="horizontal" ><include layout="@layout/layout_menu" /><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/qq" ></LinearLayout></LinearLayout></com.example.zhy_slidingmenu.SlidingMenu>首先是我们的自定义View,里面一个方向水平的LinearLayout,然后就是一个是菜单的布局,一个是主布局了~4、自定义SlidingMenu

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

package com.example.zhy_slidingmenu;import android.content.Context;import android.util.AttributeSet;import android.util.TypedValue;import android.view.MotionEvent;import android.view.ViewGroup;import android.widget.HorizontalScrollView;import android.widget.LinearLayout;import com.zhy.utils.ScreenUtils;public class SlidingMenu extends HorizontalScrollView{/** * 屏幕宽度 */private int mScreenWidth;/** * dp */private int mMenuRightPadding = 50;/** * 菜单的宽度 */private int mMenuWidth;private int mHalfMenuWidth;private boolean once;public SlidingMenu(Context context, AttributeSet attrs){super(context, attrs);mScreenWidth = ScreenUtils.getScreenWidth(context);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){/** * 显示的设置一个宽度 */if (!once){LinearLayout wrapper = (LinearLayout) getChildAt(0);ViewGroup menu = (ViewGroup) wrapper.getChildAt(0);ViewGroup content = (ViewGroup) wrapper.getChildAt(1);// dp to pxmMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mMenuRightPadding, content.getResources().getDisplayMetrics());mMenuWidth = mScreenWidth – mMenuRightPadding;mHalfMenuWidth = mMenuWidth / 2;menu.getLayoutParams().width = mMenuWidth;content.getLayoutParams().width = mScreenWidth;}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected 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;}}@Overridepublic boolean onTouchEvent(MotionEvent ev){int action = ev.getAction();switch (action){// Up时,进行判断,如果显示区域大于菜单宽度一半则完全显示,否则隐藏case MotionEvent.ACTION_UP:int scrollX = getScrollX();if (scrollX > mHalfMenuWidth)this.smoothScrollTo(mMenuWidth, 0);elsethis.smoothScrollTo(0, 0);return true;}return super.onTouchEvent(ev);}}哈哈,完工~上面的演示图,就用到这么点代码~~

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

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

5、扩展

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

1、添加自定义属性

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

<?xml version="1.0" encoding="utf-8"?><resources><attr name="rightPadding" format="dimension" /><declare-styleable name="SlidingMenu"><attr name="rightPadding" /></declare-styleable></resources>b、在布局中声明命名空间和使用属性

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

<com.example.zhy_slidingmenu.SlidingMenu xmlns:android=""xmlns:tools=""xmlns:zhy=""android:layout_width="wrap_content"android:layout_height="fill_parent"android:scrollbars="none"zhy:rightPadding="100dp" >可以看到我们的命名空间:xmlns:zhy="" 是加上我们的包名;

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

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

此刻睡觉的口水将变成明天流下的泪水。

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

相关文章:

你感兴趣的文章:

标签云: