Androidユーザージェスチャー検出
24000 ワード
AndroidはGestureDetectorクラスを提供し、このクラスを通じて多くのジェスチャーを識別することができ、彼のonTouchEvent(event)方法によって異なるジェスチャー識別を完成した.
GestureDetectorこのクラスは対外的に2つのインタフェースと1つの外部クラスを提供しています
インタフェース:OnGestureListener,OnDoubleTapListener
:1番目のインタフェースはジェスチャーを処理し、2番目のインタフェースはクリックまたはダブルクリックを処理します.
内部クラス:SimpleOnGestureListene
:この外部クラスはインタフェースのすべての関数の統合であり、彼はこの2つのインタフェースのすべての実現が必要な関数を含み、書き換えを行ったが、すべてのメソッドは空である.このクラスはstatic classで、プログラマーは外部でこのクラスを継承し、中のジェスチャー方法を書き換えることができます.
1、インタフェースの使用
次のように使用します.
上記の2つのインタフェースはすべての方法を書き換え、注釈はすでに方法に書かれています.
カスタムビューのジェスチャー検出を行いました.ジェスチャー検出のインタフェースとダブルクリックのインタフェースが実装されており、使用可能
2、内部クラスの使用
内部クラスを使用する方法は、状況に応じて、その方法でその方法を書き換えることができます.
参考記事:https://blog.csdn.net/harvic880925/article/details/39520901
GestureDetectorこのクラスは対外的に2つのインタフェースと1つの外部クラスを提供しています
インタフェース:OnGestureListener,OnDoubleTapListener
:1番目のインタフェースはジェスチャーを処理し、2番目のインタフェースはクリックまたはダブルクリックを処理します.
内部クラス:SimpleOnGestureListene
:この外部クラスはインタフェースのすべての関数の統合であり、彼はこの2つのインタフェースのすべての実現が必要な関数を含み、書き換えを行ったが、すべてのメソッドは空である.このクラスはstatic classで、プログラマーは外部でこのクラスを継承し、中のジェスチャー方法を書き換えることができます.
1、インタフェースの使用
次のように使用します.
public class GestureListener implements GestureDetector.OnGestureListener ,
GestureDetector.OnDoubleTapListener{
private static final String TAG = "GestureListener";
// ;
@Override
public boolean onDown(MotionEvent e) {
Log.e(TAG, "onDown: " );
return false;
}
// ,
@Override
public void onShowPress(MotionEvent e) {
Log.e(TAG, "onShowPress: , " );
}
// ,
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.e(TAG, "onSingleTapUp: " );
return false;
}
/**
* ,
* @param distanceX x
* @param distanceY y
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.e(TAG, "onScroll: , " );
return false;
}
// ,
@Override
public void onLongPress(MotionEvent e) {
Log.e(TAG, "onLongPress: " );
}
/**
* , ,
* @param e1 event
* @param e2 event
* @param velocityX x
* @param velocityY y
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.e(TAG, "onFling: , ," );
return false;
}
// ,
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.e(TAG, "onSingleTapConfirmed: " );
return false;
}
//
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.e(TAG, "onDoubleTap: " );
return false;
}
//
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
Log.e(TAG, "onDoubleTapEvent: " );
return false;
}
}
上記の2つのインタフェースはすべての方法を書き換え、注釈はすでに方法に書かれています.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// gestureDetector , onGestureListener
mGestureDetector = new GestureDetector(new GestureListener());
CustomVolumeControlBar controlBar = findViewById(R.id.controlBar);
//
controlBar.setOnTouchListener(this);
//
controlBar.setFocusable(true);
//
controlBar.setClickable(true);
//
controlBar.setLongClickable(true);
}
/**
* GestureDetector onTouchEvent() , MotionEvent GestureDetector
* callback
*/
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
カスタムビューのジェスチャー検出を行いました.ジェスチャー検出のインタフェースとダブルクリックのインタフェースが実装されており、使用可能
2、内部クラスの使用
内部クラスを使用する方法は、状況に応じて、その方法でその方法を書き換えることができます.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// gestureDetector ,
mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener(){
final int FLING_MIN_DISTANCE = 100, FLING_MIN_VELOCITY = 200;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
// :
if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY){
Log.e(TAG, "onFling: "+e1.getX()+"------"+e2.getX() );
}else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY){
Log.e(TAG, "onFling: "+e1.getX()+"------"+e2.getX() );
}
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
Log.e(TAG, "onDoubleTapEvent: " );
return false;
}
});
CustomVolumeControlBar controlBar = findViewById(R.id.controlBar);
//
controlBar.setOnTouchListener(this);
//
controlBar.setFocusable(true);
//
controlBar.setClickable(true);
//
controlBar.setLongClickable(true);
}
/**
* GestureDetector onTouchEvent() , MotionEvent GestureDetector
* callback
*/
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
参考記事:https://blog.csdn.net/harvic880925/article/details/39520901