Android Studio自定义左右菜单

 实现效果图



新建一个MainUI类 ,代码如下

public class MainUI extends RelativeLayout {
    private Context context;
    private FrameLayout leftMenu;
    private FrameLayout middleMenu;
    private FrameLayout rightMenu;
    private Scroller scroller;
    public MainUI(Context context) {
        super(context);
        intView(context);
    }
    public MainUI(Context context, Attributes attributes) {
        super(context, (AttributeSet) attributes);
        intView(context);
    }
    private void intView(Context context) {
        this.context = context;
        scroller = new Scroller(context,new DecelerateInterpolator());
        leftMenu = new FrameLayout(context);
        middleMenu = new FrameLayout(context);
        rightMenu = new FrameLayout(context);
        leftMenu.setBackgroundColor(Color.RED);
        middleMenu.setBackgroundColor(Color.GREEN);
        rightMenu.setBackgroundColor(Color.RED);
        addView(leftMenu);
        addView(middleMenu);
        addView(rightMenu);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        middleMenu.measure(widthMeasureSpec,heightMeasureSpec);
        int realWidth = MeasureSpec.getSize(widthMeasureSpec);
        int tempWidthMeasure = MeasureSpec.makeMeasureSpec((int) (realWidth*0.8f),
                MeasureSpec.EXACTLY);
        leftMenu.measure(tempWidthMeasure,heightMeasureSpec);
        rightMenu.measure(tempWidthMeasure,heightMeasureSpec);
    }
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        middleMenu.layout(l, t, r, b);
        leftMenu.layout(l-leftMenu.getMeasuredWidth(),t,r,b);
        rightMenu.layout(l+middleMenu.getMeasuredWidth(),t,
                l+middleMenu.getMeasuredWidth()+rightMenu.getMeasuredWidth(),b);
    }
    private boolean isTestCompete;
    private boolean isleftrightEvent;
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (!isTestCompete) {
            getEventType(ev);
            return true;
        }
        if (isleftrightEvent) {
            switch (ev.getActionMasked()) {
                case MotionEvent.ACTION_MOVE:
                    int curScrollX = getScrollX();  //滚动距离
                    int dis_x = (int) (ev.getX() - point.x);    //滑动距离
                    int expectX = -dis_x + curScrollX;
                    int finalX = 0;
                    if (expectX <0 ) {  //向左滚动
                        finalX = Math.max(expectX,-leftMenu.getMeasuredWidth());

                    } else {    //向右滚动
                        finalX = Math.min(expectX,rightMenu.getMeasuredWidth());
                    }
                    scrollTo(finalX,0);
                    point.x = (int) ev.getX();
                    break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    curScrollX = getScrollX();
                    if (Math.abs(curScrollX) > leftMenu.getMeasuredWidth() >> 1) {
                        if (curScrollX < 0) {
                            scroller.startScroll(curScrollX,0,
                                    -leftMenu.getMeasuredWidth()-curScrollX,0,200);

                        } else {
                            scroller.startScroll(curScrollX,0,
                                    leftMenu.getMeasuredWidth()-curScrollX,0,200);
                        }
                    } else {
                        scroller.startScroll(curScrollX,0,-curScrollX,0,200);
                    }
                    invalidate();
                    isleftrightEvent = false;
                    isTestCompete = false;
                    break;
            }

        } else {
            switch (ev.getActionMasked()) {
                case MotionEvent.ACTION_UP:
                    isleftrightEvent = false;
                    isTestCompete = false;
                    break;
                default:
                    break;
            }
        }
        return super.dispatchTouchEvent(ev);
    }
    
    @Override
    public void computeScroll() {
        super.computeScroll();
        if (!scroller.computeScrollOffset()) {
            return;
        }
        int tempX = scroller.getCurrX();
        scrollTo(tempX,0);
    }

    private Point point = new Point();
    private static final int TEST_DIS = 20;
    private void getEventType(MotionEvent ev) {
        switch (ev.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                point.x = (int) ev.getX();
                point.y = (int) ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                int dX = Math.abs((int) ev.getX() - point.x);
                int dY = Math.abs((int) ev.getY() - point.y);
                if (dX >= TEST_DIS && dX>dY ) {  //左滑动
                    isleftrightEvent = true;
                    isTestCompete = true;
                    point.x = (int) ev.getX();
                    point.y = (int) ev.getY();

                } else if (dY >= TEST_DIS && dY>dX) {  //右滑动
                    isleftrightEvent = false;
                    isTestCompete = true;
                    point.x = (int) ev.getX();
                    point.y = (int) ev.getY();
                }
                break;
            case MotionEvent.ACTION_UP:
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
        }
    }
}

修改MainActivity中代码:

public class MainActivity extends AppCompatActivity {
    private MainUI mainUI;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mainUI = new MainUI(this);
        setContentView(mainUI);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_18378065/article/details/81484523