侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin等实现;多少都有点复杂,完成以后还需要对滑动冲突等进行处理~~今天给大家带来一个简单的实现,史上最简单有点夸张,但是的确是我目前遇到过的最简单的一种实现~~~
1、原理分析
如果使用HorizontalScrollView,还需要在ACTION_DOWN , ACTION_MOVE里面去监听,判断,不断改变控件位置了么? NO!!!HorizontalScrollView本身就带了滑动的功能~~
还需要自己的手动处理各种冲突么?NO!!!当然了,还是需要了解下事件分发机制的~~~
2、效果图

嗯,主界面搞了QQ一张图片,左边盗用了一兄弟的布局文件~~罪过~~ 谁有好看的布局、图片、图标神马的,可以给我发点,感激~
3、布局文件
? ? xmlns:tools="http://schemas.android.com/tools"
? ? android:layout_width="wrap_content"
? ? android:layout_height="fill_parent"
? ? android:scrollbars="none" >
? ? ? ? ? ? android:layout_width="wrap_content"
? ? ? ? android:layout_height="fill_parent"
? ? ? ? android:orientation="horizontal" >
? ? ? ?
? ? ? ? ? ? ? ? ? ? android:layout_width="fill_parent"
? ? ? ? ? ? android:layout_height="fill_parent"
? ? ? ? ? ? android:background="@drawable/qq" >
? ? ? ?
? ?
首先是我们的自定义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);
?}
?@Override
?protected 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 px
? ?mMenuRightPadding = (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);
?}
?@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)
? {
? // Up时,进行判断,如果显示区域大于菜单宽度一半则完全显示,否则隐藏
? case MotionEvent.ACTION_UP:
? ?int scrollX = getScrollX();
? ?if (scrollX > mHalfMenuWidth)
? ? this.smoothScrollTo(mMenuWidth, 0);
? ?else
? ? this.smoothScrollTo(0, 0);
? ?return true;
? }
? return super.onTouchEvent(ev);
?}
}
哈哈,完工~上面的演示图,就用到这么点代码~~
代码怎么样,短不短~除了设置宽度这些杂七杂八的代码~正在处理滑动的代码不过10行~~我说史上最简单不为过吧~
嗯,由于代码过于短,就不解释了,大家自己看下注释~
5、扩展
嗯,就下来,我们完善下程序,我准备首先把菜单布局里面改成ListView来证明我们是没有冲突的;然后添加一个属性让用户配置菜单距离右边的边距的值;再对外公布一个方法,点击自动打开菜单,供用户点击某个按钮,菜单慢慢滑出来~
1、添加自定义属性
a、首先在values文件夹下新建一个attr.xml,写入以下内容:
? ?
? ?
? ? ? ?
? ?
b、在布局中声明命名空间和使用属性
定义完了,肯定要使用么。
? ? xmlns:tools="http://schemas.a