Android学習のジェスチャー
6556 ワード
Gesture DetectorとSimpleOnGesture Listenerの使用教程
--レス:http://www.cnblogs.com/transmuse/archive/2010/12/02/1894833.html
1.ユーザーがスクリーンにタッチすると、たくさんのジェスチャーが生まれます。例えば、ダウンタウン、up、scroll、filingなど。View類にはView.OnTouch Listener内部インターフェースがあります。彼のontouch(View、MotionEvent)方法を書き換えることで、いくつかのtouchイベントを処理できます。このインターフェースを使うと大変です。(私たちはユーザーのタッチの軌跡からどのジェスチャーかを判断します。)Android sdkは私たちにGesture Detector(Gestureジェスチャー:Detector:識別)類を提供してくれました。この種類を通じて多くのジェスチャーを識別できます。主に彼のonTouchEvent(event)方法によって異なるジェスチャーの識別ができました。彼はジェスチャーを識別することができますが、さまざまなジェスチャーはどのように処理しますか?プログラマに提供するべきです。このタイプは外部に二つのインターフェースを提供しています。OnGesture Listener、Onub TapListener、もう一つの内部種類のSimpleOnGesture Listener、SimpleOnGesture Listener類はGesture Listenerであります。このクラスは上述の二つのインターフェースを実現しています。このクラスはstatic classで、つまり外部クラスです。プログラマは外部でこのクラスを継承し、中のジェスチャー処理方法を書き換えることができます。
Gesture Detectorの構造方法でSimpleOnGesture Listenerオブジェクトを送ることができます。このようにGesture Detectorは異なるジェスチャーを扱うことができます。
2.具体的な使い方:
2.1
2.3 OnTouch Listenerのontouch方法で
遭遇した問題:
1.オンフライ(***)はトリガできません。
mListView.set LongClicableを設定することにより;はい、(私が処理したのはListViewのジェスチャーイベントです)。このようにしてこそ、Tapとは異なるhold(ACTION NuMOVE)を扱うことができます。また、layout定義のAndroid:longClicableでもできます。
2.ユーザーが携帯画面を長押しすると、イベントを長押しするため、画面を離れると、upイベントが発生しますが、Simple OnGesture ListenerはlongPressイベントのupイベントに対してインターフェースを提供していません。
解決策:
このように、キャプチャupイベントは、すべてOnTouch Listenerが先に獲得し、その後Simple OnGesture Listenerに渡されるので、ここで注意しなければならないことがあります。
upイベントをキャプチャした後、このイベントをSimple OnGesture Listenerに処理しなければなりません。私たちは事件のupを長い押すだけですが、SimpleOnGesture Listenerは長押しイベントのupに対してもいくつかの処理を行いました。対外にインターフェースを提供していません。
何をしましたか?
1.画面上の実行フローをクリックします。 二つの場合があります。一つは時間が短いこと、一つは時間が長いことです。
時間は短いです。ondown-------onSingleTapUp-------onSingleTapConfirmed
時間はちょっと長いです。ondown---------'onShow Press---'onSingleTapUp-----'onSingleTapConfirmed
2.長押し事件
ondown-----』onShow Press-----onLongPress
3.スロー:スクリーンに指を触れたら、少しスライドしたらすぐに放します。
on Down---』onScrroll---"onScrroll---"onScrroll----------->onFling
4.ドラッグ
ondown------onScrroll-------onScrroll-----onFiling
注意:ワンフィンリングをトリガする場合がありますが、トリガしない場合があります。
--レス:http://www.cnblogs.com/transmuse/archive/2010/12/02/1894833.html
1.ユーザーがスクリーンにタッチすると、たくさんのジェスチャーが生まれます。例えば、ダウンタウン、up、scroll、filingなど。View類にはView.OnTouch Listener内部インターフェースがあります。彼のontouch(View、MotionEvent)方法を書き換えることで、いくつかのtouchイベントを処理できます。このインターフェースを使うと大変です。(私たちはユーザーのタッチの軌跡からどのジェスチャーかを判断します。)Android sdkは私たちにGesture Detector(Gestureジェスチャー:Detector:識別)類を提供してくれました。この種類を通じて多くのジェスチャーを識別できます。主に彼のonTouchEvent(event)方法によって異なるジェスチャーの識別ができました。彼はジェスチャーを識別することができますが、さまざまなジェスチャーはどのように処理しますか?プログラマに提供するべきです。このタイプは外部に二つのインターフェースを提供しています。OnGesture Listener、Onub TapListener、もう一つの内部種類のSimpleOnGesture Listener、SimpleOnGesture Listener類はGesture Listenerであります。このクラスは上述の二つのインターフェースを実現しています。このクラスはstatic classで、つまり外部クラスです。プログラマは外部でこのクラスを継承し、中のジェスチャー処理方法を書き換えることができます。
Gesture Detectorの構造方法でSimpleOnGesture Listenerオブジェクトを送ることができます。このようにGesture Detectorは異なるジェスチャーを扱うことができます。
2.具体的な使い方:
2.1
private class DefaultGestureListener extends SimpleOnGestureListener{
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
/**
* @param e1 The first down motion event that started the scrolling.
@param e2 The move motion event that triggered the current onScroll.
@param distanceX The distance along the X axis( ) that has been scrolled since the last call to onScroll. This is NOT the distance between e1 and e2.
@param distanceY The distance along the Y axis that has been scrolled since the last call to onScroll. This is NOT the distance between e1 and e2.
view, , , ACTION_MOVE GestureDetector onTouchEvent
* */
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
return false;
}
/**
* @param e1 1 ACTION_DOWN MotionEvent
* @param e2 ACTION_MOVE MotionEvent
* @param velocityX X , /
* @param velocityY Y , /
* ACTION_UP GestureDetector onTouchEvent
*
* */
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
/**
* onSingleTapUp, GestureDetector , , “ ”
* */
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
}
2.2 public Gesture Detector(Contect context、Gesture Detector.OnGesture Listener listener)は、構造方法によりジェスチャー応答を識別クラスに渡す。2.3 OnTouch Listenerのontouch方法で
private OnTouchListener gestureTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gDetector.onTouchEvent(event);
}
};
OK、これで終わりです。遭遇した問題:
1.オンフライ(***)はトリガできません。
mListView.set LongClicableを設定することにより;はい、(私が処理したのはListViewのジェスチャーイベントです)。このようにしてこそ、Tapとは異なるhold(ACTION NuMOVE)を扱うことができます。また、layout定義のAndroid:longClicableでもできます。
2.ユーザーが携帯画面を長押しすると、イベントを長押しするため、画面を離れると、upイベントが発生しますが、Simple OnGesture ListenerはlongPressイベントのupイベントに対してインターフェースを提供していません。
解決策:
このように、キャプチャupイベントは、すべてOnTouch Listenerが先に獲得し、その後Simple OnGesture Listenerに渡されるので、ここで注意しなければならないことがあります。
upイベントをキャプチャした後、このイベントをSimple OnGesture Listenerに処理しなければなりません。私たちは事件のupを長い押すだけですが、SimpleOnGesture Listenerは長押しイベントのupに対してもいくつかの処理を行いました。対外にインターフェースを提供していません。
何をしましたか?
if (mInLongPress) {
mHandler.removeMessages(TAP);
mInLongPress = false;
}
Simple OnGesture Listenerに任せないと、クリック動作もonLongPressメソッドをトリガします。
private OnTouchListener gestureTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
return gDetector.onTouchEvent(event);
case MotionEvent.ACTION_UP:
MyGesture.FlagInfo info = mGesture.getFlagInfo();
if(info.isConnected==true){
int firstVisiblePosition = mListView.getFirstVisiblePosition();
View view = mListView.getChildAt(info.position-firstVisiblePosition);
if(view!=null){
view.setBackgroundResource(R.drawable.listitem_background_blue);
info.isConnected = false;
}
}
return gDetector.onTouchEvent(event);
case MotionEvent.ACTION_MOVE:
return gDetector.onTouchEvent(event);
}
return false;
}
};
まとめ:1.画面上の実行フローをクリックします。 二つの場合があります。一つは時間が短いこと、一つは時間が長いことです。
時間は短いです。ondown-------onSingleTapUp-------onSingleTapConfirmed
時間はちょっと長いです。ondown---------'onShow Press---'onSingleTapUp-----'onSingleTapConfirmed
2.長押し事件
ondown-----』onShow Press-----onLongPress
3.スロー:スクリーンに指を触れたら、少しスライドしたらすぐに放します。
on Down---』onScrroll---"onScrroll---"onScrroll----------->onFling
4.ドラッグ
ondown------onScrroll-------onScrroll-----onFiling
注意:ワンフィンリングをトリガする場合がありますが、トリガしない場合があります。