1. 程式人生 > >View檢視跟隨手指移動

View檢視跟隨手指移動

之前 看過跟多App在頁面中都有一個浮動的按鈕,可以隨意的在螢幕中拖動 釋放後自動貼在螢幕邊緣,這個效果其實很簡單 就是onTouchEvent事件,在事件中分別處理Down,move,up事件即可。

先看效果圖:


為了防止浮動按鈕超出螢幕,還需要和螢幕寬高進行實時比對,以下方法是獲取螢幕的寬高:

        WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        mWidth = wm.getDefaultDisplay().getWidth();
        mHeight = wm.getDefaultDisplay().getHeight();

在複寫view的onTouchEvent事件
    @Override
    public boolean onTouchEvent(MotionEvent event) {

        int x = (int) event.getX();
        int y = (int) event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                lastX = (int) event.getX();
                lastY = (int) event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                mParams = (LinearLayout.LayoutParams) getLayoutParams();

                offsetX = getLeft() + x - lastX;
                offsetY = getTop() + y - lastY;

                if (offsetX <= 0) {
                    offsetX = 0;
                }

                if (offsetX + DensityUtil.dip2px(mContext, getDpValue()) >= mWidth) {
                    offsetX = mWidth - DensityUtil.dip2px(mContext, getDpValue());
                }

                if (offsetY <= 0) {
                    offsetY = 0;
                }

                if (offsetY + DensityUtil.dip2px(mContext, getDpValue() + 25) >= mHeight) { //25是狀態列的高度
                    offsetY = mHeight - DensityUtil.dip2px(mContext, getDpValue() + 25);
                }

                mParams.leftMargin = offsetX;
                mParams.topMargin = offsetY;
                setLayoutParams(mParams);
                break;
            case MotionEvent.ACTION_UP:

                if (offsetX > mWidth / 2) {
                    mParams.leftMargin = mWidth - DensityUtil.dip2px(mContext, getDpValue());
                } else {
                    mParams.leftMargin = 0;
                }
                mParams.topMargin = offsetY;
                setLayoutParams(mParams);
                break;
        }

        return true;

    }

    private int getDpValue() {
        return 50; //佈局的寬高大小
    }

以上便是浮動按鈕跟隨手指滑動的全部邏輯程式碼

使用:

    <com.ppdai.mvpstudy.views.DragView
        android:layout_width="50dp"
        android:layout_height="50dp" />


我是原始碼