fling
Android アプリケーションでジェスチャー検出を機能させたいです。
私が持っているのはGridLayout
9ImageView
個の を含む です。ソースはここにあります:Romain Guys のグリッドレイアウト。
私が入手したファイルはロマン・ガイのものですフォトストリームアプリケーションわずかに改変されただけです。
onClickListener
単純なクリック状況では、追加するfor each を、 を実装するImageView
main に設定するだけで済みます。 を認識するものを実装するのは、はるかに複雑に思えます。 これは、 にまたがる可能性があるためだと思います。activity
View.OnClickListener
fling
views
アクティビティを実装する場合、それを追加したビューまたはビュー
OnGestureListener
のジェスチャ リスナーとして設定する方法がわかりません。Grid
Image
public class SelectFilterActivity extends Activity implements View.OnClickListener, OnGestureListener { ...
私のアクティビティが実装されている場合、メソッドは
OnTouchListener
ありません(パラメータとして 2 つのイベントがあり、フリングが注目に値するかどうかを判断できます)。onFling
override
public class SelectFilterActivity extends Activity implements View.OnClickListener, OnTouchListener { ...
を拡張する
View
ようなカスタム を作成した場合、ビューから が発生したアクティビティをどのように伝えるかわかりません。いずれにしても、これを試してみたところ、画面をタッチしてもメソッドは呼び出されませんでした。GestureImageView
ImageView
fling
本当に必要なのは、ビュー間でこれが機能する具体的な例です。何を、いつ、どのようにアタッチすればよいでしょうかlistener
。シングルクリックも検出できるようにする必要があります。
// Gesture detection
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
int dx = (int) (e2.getX() - e1.getX());
// don't accept the fling if it's too short
// as it may conflict with a button push
if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.absvelocityY)) {
if (velocityX > 0) {
moveRight();
} else {
moveLeft();
}
return true;
} else {
return false;
}
}
});
画面の上に透明なビューを配置して、フリングをキャプチャすることは可能ですか?
inflate
XML から子イメージ ビューを選択しない場合、作成したGestureDetector
の新しいサブクラスにコンストラクター パラメーターとして渡すことはできますか?ImageView
これは、検出を機能させようとしている非常に単純なアクティビティですfling
。SelectFilterActivity (フォトストリームから改変)。
私は以下の情報源を調べてきました:
今のところ何も効果がないので、何かヒントがあればと思っています。
ベストアンサー1
感謝コード将軍、そのコードを自分の状況に合わせて調整しました。
アクティビティをOnClickListener
通常どおり実装します。
public class SelectFilterActivity extends Activity implements OnClickListener {
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private GestureDetector gestureDetector;
View.OnTouchListener gestureListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* ... */
// Gesture detection
gestureDetector = new GestureDetector(this, new MyGestureDetector());
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
};
}
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left swipe
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(SelectFilterActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(SelectFilterActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
// nothing
}
return false;
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
}
}
メイン レイアウトに追加するすべてのビューにジェスチャ リスナーをアタッチします。
// Do this for each view added to the grid
imageView.setOnClickListener(SelectFilterActivity.this);
imageView.setOnTouchListener(gestureListener);
onClick(View v)
オーバーライドされたメソッドが、アクティビティの とonFling
ジェスチャ リスナーの の両方にヒットするのを、驚嘆しながら見てください。
public void onClick(View v) {
Filter f = (Filter) v.getTag();
FilterFullscreenActivity.show(this, input, f);
}
投げ飛ばした後のダンスはオプションですが、奨励されています。