设为首页 加入收藏

TOP

Android 自定义控件打造史上最简单的侧滑菜单(一)
2015-02-25 16:14:21 来源: 作者: 【 】 浏览:90
Tags:Android 定义 控件 打造 史上最 简单 菜单

侧滑菜单在很多应用中都会见到,最近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

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android自定义侧滑菜单slidmenu 下一篇C、Shell混合编程小技巧

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: