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)作,后期如果需要處理長(zhǎ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ù)值,所以要取絕對(duì)值進(jìn)行比較
if (Math.abs(motionEvent.getRawX() - sX) > 6 && Math.abs(motionEvent.getRawY() - sY) > 6) {
return true;
}
break;
}
return false;
}
};
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)生成二維碼并保存到相冊(cè)
這篇文章主要介紹了如何利用Android實(shí)現(xiàn)二維碼的生成,并且保存到本地相冊(cè)。文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編學(xué)習(xí)一下2022-04-04
談?wù)凙ndroid開發(fā)之RecyclerView的使用全解
這篇文章主要介紹了談?wù)凙ndroid開發(fā)之RecyclerView的使用全解,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-12-12
Android?WebView開發(fā)之自定義WebView工具框
在WebView頁(yè)面長(zhǎng)按時(shí)會(huì)彈出一個(gè)復(fù)制框,有的時(shí)候里面的item不是我們想要,這個(gè)時(shí)候我們就可以自定義一個(gè)工具框。本文就將介紹如何通過WebView自定義工具框,需要的朋友可以參考一下2021-12-12
正確在Flutter中添加webview實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了正確在Flutter中添加webview實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
android不同activity之間共享數(shù)據(jù)解決方法
最近做局域網(wǎng)socket連接問題,要在多個(gè)activity之間公用一個(gè)socket連接,就在網(wǎng)上搜了下資料,感覺還是application方法好用,帖出來需要的朋友可以參考下2012-11-11

