View檢視跟隨手指移動
阿新 • • 發佈:2019-01-29
之前 看過跟多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" />