Android view的單擊,雙擊,長按事件監聽


關於view的雙擊事件,網上有很多demo使用GestureDetector ,在給view setOnTouchListener的時候插入。我試了下,onDoubleTap onSingleTap等幾個方法都沒有被調用到。而在Activity的onTouchEvent插入GestureDetector ,則完美調用各個手勢事件。可是我們要設置單擊,雙擊,長按事件的對象是view啊,不是Activity。
有些方案是在記錄ACTION_DOWN到ACTION_UP的時間,單擊和雙擊都能很好的記錄,然后長按呢,你會發現只有在你手指抬起,也就是ACTION_UP的時候才開始算是長按!!!!! 這跟我要的效果不一樣啊!!!

此次我們討論的是用另一種方法來實現這3種事件監聽——定時判斷

package com.draftbox.touch_demo;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.draftbox.R;

public class TouchDemoActivity extends AppCompatActivity implements View.OnTouchListener {

TextView touchRl;
private long firstClickTime;
private long secondClickTime;
private long stillTime;
private boolean isUp=false;
private boolean isDoubleClick=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_touch_demo);
touchRl= (TextView) findViewById(R.id.rl_touch_area);
touchRl.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
isUp=false;
if(firstClickTime==0&secondClickTime==0){//第一次點擊
firstClickTime=System.currentTimeMillis();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if(!isUp){
Toast.makeText(TouchDemoActivity.this, "長按", Toast.LENGTH_SHORT).show();
firstClickTime=0;
secondClickTime=0;
isDoubleClick=false;
}else {
if(!isDoubleClick){
Toast.makeText(TouchDemoActivity.this, "點擊", Toast.LENGTH_SHORT).show();
}
isDoubleClick=false;
firstClickTime=0;
secondClickTime=0;
}
}
}, 500);

}else {
secondClickTime=System.currentTimeMillis();
stillTime =secondClickTime-firstClickTime;
if ( stillTime < 500) {//兩次點擊小於0.5秒
Toast.makeText(this, "雙擊", Toast.LENGTH_SHORT).show();
isDoubleClick=true;
firstClickTime=0;
secondClickTime=0;
}
}
break;
case MotionEvent.ACTION_UP:
isUp=true;
break;
}
return true;
}
}

主要實現方案,定義兩個long類型參數記錄第一次,第二次點擊的時間
雙擊:兩次點擊事件不超過0.5秒(該時間可按需求調節)
長按:第一次點擊后,搞個定時器0.5秒后去判斷,手指是否抬起了,沒抬起則為長按
單擊:不是上面兩種情況,那就是單擊了唄
PS :隨手寫的小demo,可能判斷起來不是很嚴謹,不過3種事件我都試過了,完美運行,應該沒多大問題。建議讀者可以自己按自己邏輯,自己理解動手寫下,每個人的實現方案都不一樣,我認為——所謂的最優解還是自己根據業務邏輯寫出來的代碼,而不是照搬別人的。

最后打下小廣告~
有心課堂交流群 183899857
有心課堂,傳遞給你的不僅僅是技術


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com