Android——自定义左右菜单的实现

在本篇博客,主要介绍android中自定义左右菜单的实现

下面一步一步介绍开始实现的方法:
新建一个CustomMenu 继承自LinearLayout

public class CustomMenu extends RelativeLayout;

1.在 CustomMenu 这个类中 我们要先创建三个视图,leftMenu,rigthMenu,middleMenu,maskMenu,分别为左,中,右,以及一个蒙版视图

 private LinearLayout leftMenu, rightMenu, middleMenu, maskMenu;

2.然后建立一个初始化的方法,初始以上的四个视图

 public void init(Context context) {
        this.context = context;
        leftMenu = new LinearLayout(context);
        rightMenu = new LinearLayout(context);
        middleMenu = new LinearLayout(context);
        maskMenu = new LinearLayout(context);
        scroller = new Scroller(context, new DecelerateInterpolator());
        leftMenu.setBackgroundColor(Color.RED);
        rightMenu.setBackgroundColor(Color.BLUE);
        middleMenu.setBackgroundColor(Color.WHITE);
        maskMenu.setBackgroundColor(0xaa000000);
        addView(leftMenu);
        addView(middleMenu);
        addView(rightMenu);
        addView(maskMenu);
        maskMenu.setAlpha(0);
    }

3.我们要设置四个视图的宽度和高度以及他们的位置,
通过重写onMeasure()这个函数,我们分别对以上四个子视图进行大小设置

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int measureWidth = MeasureSpec.makeMeasureSpec((int) (width * 0.6), MeasureSpec.EXACTLY);
        middleMenu.measure(widthMeasureSpec, heightMeasureSpec);
        maskMenu.measure(widthMeasureSpec, heightMeasureSpec);
        leftMenu.measure(measureWidth, heightMeasureSpec);
        rightMenu.measure(measureWidth, heightMeasureSpec);
    }

这里解释一下,函数传递过来的参数widthMeasureSpec和heightMeasureSpec可以看做屏幕的大小。middleMenu和maskMenu 的大小应该和传递过来的参数大小是一样,而左右菜单我们可以设置他们的宽度为中间视图的80%,通过measure()函数设置。

4,设置四个视图在猪布局中的位置onLayout():

   protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        leftMenu.layout(l - leftMenu.getMeasuredWidth(), t, l, b);
        rightMenu.layout(l + middleMenu.getMeasuredWidth(), t, r + rightMenu.getMeasuredWidth(), b);
        middleMenu.layout(l, t, r, b);
        maskMenu.layout(l, t, r, b);
    }

最左边的视图leftMenu它的left应该为当前正中间视图的左边(传递过来的l)宽度为leftMenu.getMeasureWidth()处,右边在原中间视图的l处
顶部和底部一样。同理设置右边的视图rightMenu ,middleMenu和maskMenu在中间所以不用改变,直接调用layout(l,t,r,b)。

5,好了设置完了子视图的大小和位置,然而我们还不能看到效果,我们还得进行屏幕的触摸动作事件的处理 重写父类的dispatchTouchEvent()函数

首先我们要判断是不是已经按下了手指:这里通过设置一个标志量来代表是否按下
if (!isTestCompete) {
getEventType(ev);
return true;
}
当第一次开始触碰到屏幕时,我们进行一个动作类型的判断,调用getEventType(ev),在这个函数里我们判断动作并设置标志量isLeftRight判断是否左右滑动

 private void getEventType(MotionEvent ev) {
        switch (ev.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                point.x = (
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值