android控件實(shí)現(xiàn)單擊拖動(dòng)效果
本文實(shí)例為大家分享了android控件實(shí)現(xiàn)單擊拖動(dòng)效果的具體代碼,供大家參考,具體內(nèi)容如下
分析
setOnClickListener
setOnClickListener 可以接收控件的單擊動(dòng)作,無返回值
要想拖動(dòng)控件,就要利用 setOnTouchListener 自己定義了
setOnTouchListener
通過按下時(shí)的坐標(biāo)和移動(dòng)時(shí)的坐標(biāo)之間的差值,來計(jì)算移動(dòng)的距離,然后更改控件的位置以達(dá)到拖動(dòng)的目的
因 Touch 事件執(zhí)行完成后如果返回false則會(huì)繼續(xù)執(zhí)行單擊事件,不是我們想要的。如果直接返回true代表處理完了事件,不再執(zhí)行單擊事件,也不是我們想要的。
這時(shí)候就要判斷什么時(shí)候返回true,什么時(shí)候返回false,以達(dá)到同時(shí)實(shí)現(xiàn)單擊 + 拖動(dòng)的目的
實(shí)例代碼
綁定事件
//綁定拖動(dòng)事件 floatView.floatMenuIcon.setOnTouchListener(touchListener); //綁定單擊事件,此處為lambda表達(dá)式 floatView.floatMenuIcon.setOnClickListener(view -> { EventBus.getDefault().post(AccessibilityService.GLOBAL_ACTION_BACK); });
重寫onTouchListener
注意事項(xiàng)
ACTION_UP為手指抬起時(shí)執(zhí)行的事件,單擊事件的判斷放在此處,如果按下時(shí)的坐標(biāo)和抬起時(shí)的坐標(biāo)相差不大,我們視作單擊動(dòng)作,后期如果需要處理長按動(dòng)作或雙擊動(dòng)作,道理差不多。
完整代碼
private final View.OnTouchListener touchListener = new View.OnTouchListener() { //記錄初使按下時(shí)的坐標(biāo),會(huì)因?yàn)橥蟿?dòng)而改變 private float dX; private float dY; //記錄初使按下時(shí)的坐標(biāo),不因拖動(dòng)而改變 private float sX; private float sY; @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: dX = motionEvent.getRawX(); dY = motionEvent.getRawY(); sX = motionEvent.getRawX(); sY = motionEvent.getRawY(); break; case MotionEvent.ACTION_MOVE: //拖動(dòng)事件,為了能夠?qū)崟r(shí)拖動(dòng),而非抬起后再移動(dòng),所以處理代碼放到ACTION_MOVE中 float nX = (int) motionEvent.getRawX(); float nY = (int) motionEvent.getRawY(); float cW = nX - dX; float cH = nY - dY; dX = nX; dY = nY; layoutParams.x = (int) (layoutParams.x + cW); layoutParams.y = (int) (layoutParams.y + cH); windowManager.updateViewLayout(mView, layoutParams); break; case MotionEvent.ACTION_UP: //如果抬起時(shí)的位置和按下時(shí)的位置大致相同視作單擊事件 //間隔值可能為負(fù)值,所以要取絕對值進(jìn)行比較 if (Math.abs(motionEvent.getRawX() - sX) > 6 && Math.abs(motionEvent.getRawY() - sY) > 6) { return true; } break; } return false; } };
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android數(shù)據(jù)庫增刪改查實(shí)戰(zhàn)案例
我們在編程中經(jīng)常會(huì)遇到數(shù)據(jù)庫的操作,這篇文章主要給大家介紹了關(guān)于Android數(shù)據(jù)庫增刪改查的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04Android ListView實(shí)現(xiàn)上拉加載更多和下拉刷新功能
這篇文章主要為大家詳細(xì)介紹了Android ListView實(shí)現(xiàn)上拉加載更多和下拉刷新功能,介紹了ListView刷新原理及實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-05-05Kotlin?Flow數(shù)據(jù)流的3種使用場景詳解
這篇文章主要為大家詳細(xì)介紹了Kotlin中Flow數(shù)據(jù)流的幾種使用場景,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-04-04Android自定義Dialog實(shí)現(xiàn)加載對話框效果
這篇文章將介紹如何定制當(dāng)今主流的對話框,通過自定義dialog實(shí)現(xiàn)加載對話框效果,具體實(shí)現(xiàn)代碼大家通過本文學(xué)習(xí)吧2018-05-05Android編程實(shí)現(xiàn)popupwindow定時(shí)消失的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)popupwindow定時(shí)消失的方法,結(jié)合實(shí)例形式分析了Android使用定時(shí)器實(shí)現(xiàn)popupwindow定時(shí)消失的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01