android控件實(shí)現(xiàn)單擊拖動效果
本文實(shí)例為大家分享了android控件實(shí)現(xiàn)單擊拖動效果的具體代碼,供大家參考,具體內(nèi)容如下
分析
setOnClickListener
setOnClickListener 可以接收控件的單擊動作,無返回值
要想拖動控件,就要利用 setOnTouchListener 自己定義了
setOnTouchListener
通過按下時的坐標(biāo)和移動時的坐標(biāo)之間的差值,來計算移動的距離,然后更改控件的位置以達(dá)到拖動的目的因 Touch 事件執(zhí)行完成后如果返回false則會繼續(xù)執(zhí)行單擊事件,不是我們想要的。如果直接返回true代表處理完了事件,不再執(zhí)行單擊事件,也不是我們想要的。這時候就要判斷什么時候返回true,什么時候返回false,以達(dá)到同時實(shí)現(xiàn)單擊 + 拖動的目的
實(shí)例代碼
綁定事件
//綁定拖動事件floatView.floatMenuIcon.setOnTouchListener(touchListener);//綁定單擊事件,此處為lambda表達(dá)式floatView.floatMenuIcon.setOnClickListener(view -> { EventBus.getDefault().post(AccessibilityService.GLOBAL_ACTION_BACK);});
重寫onTouchListener
注意事項
ACTION_UP為手指抬起時執(zhí)行的事件,單擊事件的判斷放在此處,如果按下時的坐標(biāo)和抬起時的坐標(biāo)相差不大,我們視作單擊動作,后期如果需要處理長按動作或雙擊動作,道理差不多。
完整代碼
private final View.OnTouchListener touchListener = new View.OnTouchListener() { //記錄初使按下時的坐標(biāo),會因為拖動而改變 private float dX; private float dY; //記錄初使按下時的坐標(biāo),不因拖動而改變 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: //拖動事件,為了能夠?qū)崟r拖動,而非抬起后再移動,所以處理代碼放到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: //如果抬起時的位置和按下時的位置大致相同視作單擊事件 //間隔值可能為負(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í)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 存儲于xml中需要的HTML轉(zhuǎn)義代碼2. JSP登錄中Session的用法實(shí)例詳解3. 使用EF Code First搭建簡易ASP.NET MVC網(wǎng)站并允許數(shù)據(jù)庫遷移4. express框架通過ejs模板渲染輸出頁面實(shí)例分析5. NetCore 配置Swagger的詳細(xì)代碼6. js中.sort()函數(shù)的常見用法與高級操作7. 詳解IE6中的position:fixed問題與隨滾動條滾動的效果8. 如何將asp.net core程序部署到Linux服務(wù)器9. 父div高度不能自適應(yīng)子div高度的解決方案10. ASP.NET MVC使用typeahead.js實(shí)現(xiàn)輸入智能提示功能

網(wǎng)公網(wǎng)安備