zoukankan      html  css  js  c++  java
  • Android自定义侧滑菜单

      在安卓界面中有这样一种效果:手指向右侧滑,左边会有一个菜单栏伸出。也可以手指向左侧滑,右边会有一个菜单栏伸出。以下只记录左菜单栏滑出,这里的写法是自定义View,没有使用官方提供的位于v4包下的Drawlayout类

     

      自定义一个类MyMenu继承Relativelayout类,在这个类里写自己需要的View


    public class MyMenu extends RelativeLayout {

    static Context context;//承接上下文
    static FrameLayout leftMenu;
    static FrameLayout midleMenu;


    public MyMenu(Context context) {
    super(context);
    initView(context);

    }

    public MyMenu(Context context, AttributeSet attrs) {
    super(context, attrs);
    initView(context);
    }


    // 初始化方法
    public void initView(Context context) {
    this.context = context;
    leftMenu = new FrameLayout(context);
    midleMenu = new FrameLayout(context);
    leftMenu.setBackgroundColor(Color.GREEN);
    midleMenu.setBackgroundColor(Color.GREEN);
    //将自定义的view添加到父类RelativeLayout的View中去
    addView(leftMenu);
    addView(midleMenu);

    }

    //给菜单定义不同的宽度,由手机屏幕大小决定
    public void onMeasure(int width, int height) {
    super.onMeasure(width, height);//调用父类的测量方法
    midleMenu.measure(width, height);
    int realwidth = MeasureSpec.getSize(width);
    int realwidth_1 = width;
    int tempwidth = (int)(realwidth*0.8f);
    leftMenu.measure(tempwidth, height);

    }

    //把菜单放进layout中
    @Override
    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, r, b);
    midleMenu.layout(l, t, r, b);

    }

    public boolean testCompete = false;
    boolean isleftrightevent = true;
    Point point = new Point();//获得当前点的坐标

    //判断动作事件类型
    public void EventType(MotionEvent event) {

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
    point.x = (int) event.getX();
    point.y = (int) event.getY();
    break;

    case MotionEvent.ACTION_MOVE:
    // 这里的point.x和point.y是在ACTION_DOWN动作事件下获得的
    int dx = Math.abs((int) event.getX() - point.x);
    int dy = Math.abs((int) event.getY() - point.y);
    if (dx >= 20 && dx > dy) {
    isleftrightevent = true;
    testCompete = true;
    } else if (dy >= 20 && dy > dx) {
    isleftrightevent = false;
    testCompete = true;
    }
    // 重新赋值当下点的坐标
    point.x = (int) event.getX();
    point.y = (int) event.getY();
    break;

    case MotionEvent.ACTION_UP:
    break;

    }
    }




    // 分发事件的确认,返回布尔值
    // 判断三个事件,左右滑动,上下滑动,点击事件
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    if (!testCompete) {
    EventType(ev);
    return true;
    }
    if(isleftrightevent){
    switch (ev.getAction()){
    case MotionEvent.ACTION_MOVE:
    int scroll = getScrollX();//屏幕的偏移量,初始为0,向右时不断减小为负数,向左是正数
    int getx = (int)ev.getX()-point.x;//手指移动的距离
    int expX = -getx+scroll;
    int finalx = 0;
    if(expX>0){
    finalx = Math.max(expX,leftMenu.getWidth());
    }else{
    finalx = Math.max(expX,-leftMenu.getWidth());
    }
    scrollTo(finalx,0);
    point.x = (int)ev.getX();
    break;
    case MotionEvent.ACTION_UP:
    isleftrightevent=false;
    testCompete=false;
    break;

    }
    }else{//如果不是水平移动则要进行重新默认,否则上下移动之后就不能再左右移动了
    switch (ev.getAction()){
    case MotionEvent.ACTION_DOWN:
    isleftrightevent=false;
    testCompete=false;
    break;
    }

    }


    return super.dispatchTouchEvent(ev);
    }
    }



    将自定义的View放到主类当中
    public class MainActivity extends AppCompatActivity {
    MyMenu myMenu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    myMenu = new MyMenu(this);
    setContentView(myMenu);
    }
    }
     

      

  • 相关阅读:
    Ajax实现文件下载
    jquery easyui 插件开发
    Chrome谷歌浏览器首页被改为Hao123导航怎么办|附各类解决方法【转】
    查看mysql版本的四种方法
    IntelliJ IDEA 快捷键大全
    Java中判断字符串是否为数字的五种方法
    比数据分析更要命的是:数据质量
    Python绘制六种可视化图表详解,三维图最炫酷!你觉得呢?
    大数据需要好设计
    Python模块学习filecmp文件比较
  • 原文地址:https://www.cnblogs.com/lyd447113735/p/7997399.html
Copyright © 2011-2022 走看看