Android 制作可拖動控件。并且不會因為布局的改動而復(fù)位2018-08-04

int startX;

? ? int startY;

? ? int left;

? ? int top;

? ? int[]temp =new int[]{0, 0};

? ? @Override

? ? public boolean onTouch(View view, MotionEvent motionEvent) {

int x = (int) motionEvent.getRawX();

? ? ? ? int y = (int) motionEvent.getRawY();

? ? ? ? switch (motionEvent.getAction()) {

case MotionEvent.ACTION_DOWN:// touch down so check if the

? ? ? ? ? ? ? ? startX = x;

? ? ? ? ? ? ? ? startY = y;

? ? ? ? ? ? ? ? temp[0] = (int) motionEvent.getX();

? ? ? ? ? ? ? ? temp[1] = y - view.getTop();

break;

? ? ? ? ? ? case MotionEvent.ACTION_MOVE:// touch drag with the ball

? ? ? ? ? ? ? ? left = x -temp[0];

? ? ? ? ? ? ? ? top = y -temp[1];

? ? ? ? ? ? ? ? if (left <0) {//控制左邊界不超出

? ? ? ? ? ? ? ? ? ? left =0;

? ? ? ? ? ? ? ? }

view.layout(left, top, left + view.getWidth(), top + view.getHeight());//自由拖拽

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case MotionEvent.ACTION_UP:

if (Math.abs(x -startX) >2 || Math.abs(y -startY) >2) {//判斷是否移動,再一定范圍內(nèi)不算是移動,解決觸發(fā)事件沖突

//將最后拖拽的位置定下來,否則頁面刷新渲染后按鈕會自動回到初始位置

//注意父容器

? ? ? ? ? ? ? ? ? ? RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) view.getLayoutParams();

? ? ? ? ? ? ? ? ? ? lp.setMargins(left, top, 0, 0);

? ? ? ? ? ? ? ? ? ? view.setLayoutParams(lp);

? ? ? ? ? ? ? ? ? ? //確定是拖拽

//? ? ? ? ? ? ? ? ? ? isMove = true;

? ? ? ? ? ? ? ? }

break;

? ? ? ? }

return true;

? ? }

設(shè)置控件的onTouch事件


這樣子就ok了
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容