将Fling手势添加到图像视图 – Android

好的,我一直在引用代码: 在网格布局上进行手势检测

但只是不能得到它的工作。 在我的主要活动中,我定义了一个简单的图像。 我想要检测图像上的一个闪光。 这是我的代码如下。 底部的onclick方法是空的。 是因为这个吗? 我把它留空,因为在其他代码示例中,它不是我想要的。 我只是想要一个简单的敬酒popup说扔或右扔。

public class GestureRightLeft extends Activity implements OnClickListener { ImageView peek; 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 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); peek =(ImageView) findViewById(R.id.peek); peek.setImageResource(R.drawable.bluestrip); gestureDetector = new GestureDetector(new MyGestureDetector()); gestureListener = new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (gestureDetector.onTouchEvent(event)) { return true; } return false; } }; } 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(GestureRightLeft.this, "Left Swipe", Toast.LENGTH_SHORT).show(); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Toast.makeText(GestureRightLeft.this, "Right Swipe", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { // nothing } return false; } } @Override public void onClick(View v) {} } 

这是我能想到的最简单的工作版本。 你可以将它绑定到任何组件,而不仅仅是ImageView。

 public class MyActivity extends Activity { private void onCreate() { final GestureDetector gdt = new GestureDetector(new GestureListener()); final ImageView imageView = (ImageView) findViewById(R.id.image_view); imageView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(final View view, final MotionEvent event) { gdt.onTouchEvent(event); return true; } }); } private static final int SWIPE_MIN_DISTANCE = 120; private static final int SWIPE_THRESHOLD_VELOCITY = 200; private class GestureListener extends SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { return false; // Right to left } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { return false; // Left to right } if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) { return false; // Bottom to top } else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) { return false; // Top to bottom } return false; } } } 

虽然没有活动onClickListener(如果你不需要捕捉任何onclick动作)它不仅捕获水平,但垂直也(只是删除垂直部分,如果你不需要它),水平滑动具有优先级,你可以看到。 在方法返回的地方(我的意见是在哪里),只需调用你的方法或任何:)

尝试这个

 imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (gestureDetector.onTouchEvent(event)) { return false; } return true; } }); 
 imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return !gestureDetector.onTouchEvent(event); } }); 

一些前提条件

 1)setonClick method image.setOnClickListener(this); 2)set your gesture detection in onTouch() image.setOnTouchListener(new OnTouchListener() { GestureDetector gestureDetector = new GestureDetector(new SwingGestureDetection((mContext),image,a)); @Override public boolean onTouch(View v, MotionEvent event) { return gestureDetector.onTouchEvent(event); } }); 3)create SwingGestureDetection class and implement all method @Override public boolean onFling(MotionEvent start, MotionEvent finish, float arg2,float arg3) { if(start.getRawX()<finish.getRawX()){ System.out.println("next...swing"); }else{ System.out.println("previois...swing"); } 4)pass your imageview in constructor public SwingGestureDetection(Context con,ImageView image,int pos) { mContext=con; this.image=image; this.position=pos; } 

这对我来说是完美的工作。如果有任何疑问,然后发表评论。

尝试阅读: http : //illusionsandroid.blogspot.com/2011/05/adding-fling-gesture-listener-to-view.html

它允许您将您的活动实施与您的自定义侦听器分开。 这只是对Alex Orlov报告的解决scheme的重构

如果你正在寻找像ImageView.setOnGestureListener这样的方法,那就没有。 你可以去看Android的源代码。 你最好的select是在View对象的onTouch()中处理它。

这是我能做的最简单的手势检测器。

我有一个名为GenesMotionDetector.java的类。 这是它的代码:

 package gene.com.motioneventssample; import android.app.Activity; import android.os.Bundle; import android.view.GestureDetector; import android.view.MotionEvent; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class GenesMotionDetector extends Activity implements GestureDetector.OnGestureListener { private GestureDetector gestureScanner; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.nothing); gestureScanner= new GestureDetector(getBaseContext(),this); } @Override public boolean onTouchEvent(MotionEvent me) { System.out.println("Inside onTouchEvent() of GenesMotionDetector.java"); return gestureScanner.onTouchEvent(me); } @Override public boolean onDown(MotionEvent e) { System.out.println("Inside onDown() of GenesMotionDetector.java"); return true; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { System.out.println("Inside onFling() of GenesMotionDetector.java"); return true; } @Override public void onLongPress(MotionEvent e) { System.out.println("Inside onLongPress() of GenesMotionDetector.java"); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { System.out.println("Inside onScroll() of GenesMotionDetector.java"); return true; } @Override public void onShowPress(MotionEvent e) { System.out.println("Inside onShowPress() of GenesMotionDetector.java"); } @Override public boolean onSingleTapUp(MotionEvent e) { System.out.println("Inside onSingleTapUp() of GenesMotionDetector.java"); return true; } } 

该类的相应XML布局文件是nothing.xml。 这是它的代码:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/screen" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/text" android:background="#17528c" android:text="testing" android:layout_width="100dp" android:layout_height="200dp" /> <ImageView android:id="@+id/image" android:background="#f8af20" android:layout_width="100dp" android:layout_height="200dp" /> </LinearLayout> 

现在,采取最简单的手势检测器,我可以(从上面),并修改它为你想要的,我得到这个:

 package gene.com.motioneventssample; import android.app.Activity; import android.os.Bundle; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.widget.ImageView; public class GenesMotionDetector3 extends Activity implements GestureDetector.OnGestureListener { private GestureDetector gestureScanner; ImageView mView3; View.OnTouchListener gestureListener; MotionEvent initialME, finalME; private VelocityTracker mVelocityTracker = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.nothing); mView3 = (ImageView) findViewById(R.id.image); // Gesture detection gestureScanner = new GestureDetector(getBaseContext(), this); gestureListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN: initialME= event; if(mVelocityTracker == null) { // Retrieve a new VelocityTracker object to watch the velocity of a motion. mVelocityTracker = VelocityTracker.obtain(); } else { // Reset the velocity tracker back to its initial state. mVelocityTracker.clear(); } // Add a user's movement to the tracker. mVelocityTracker.addMovement(event); break; case MotionEvent.ACTION_MOVE: mVelocityTracker.addMovement(event); // When you want to determine the velocity, call // computeCurrentVelocity(). Then call getXVelocity() // and getYVelocity() to retrieve the velocity for each pointer ID. mVelocityTracker.computeCurrentVelocity(1000); break; case MotionEvent.ACTION_UP: finalME=event; break; case MotionEvent.ACTION_CANCEL: // Return a VelocityTracker object back to be re-used by others. mVelocityTracker.recycle(); break; } return onFling(initialME, finalME, mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity()); //return false; } }; mView3.setOnTouchListener(gestureListener); } @Override public boolean onTouchEvent(MotionEvent me) { System.out.println("Inside onTouchEvent() of GenesMotionDetector.java"); return gestureScanner.onTouchEvent(me); } @Override public boolean onDown(MotionEvent e) { System.out.println("Inside onDown() of GenesMotionDetector.java"); return true; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { System.out.println("Inside onFling() of GenesMotionDetector.java"); System.out.println("e1= "+ e1); System.out.println("e2= "+ e2); System.out.println("velocityX= "+ velocityX); System.out.println("velocityY= "+ velocityY); return true; } @Override public void onLongPress(MotionEvent e) { System.out.println("Inside onLongPress() of GenesMotionDetector.java"); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { System.out.println("Inside onScroll() of GenesMotionDetector.java"); return true; } @Override public void onShowPress(MotionEvent e) { System.out.println("Inside onShowPress() of GenesMotionDetector.java"); } @Override public boolean onSingleTapUp(MotionEvent e) { System.out.println("Inside onSingleTapUp() of GenesMotionDetector.java"); return true; } } 

你可能只需要处理onTouch()中的所有东西。 我基本上在onTouch中获取手势并将其传递给onFling()。

使用ImageViewdevise您的布局。 将setOnTouchListener添加到setOnTouchListenerimageview.setOnTouchListener(this) .add未实现的方法View.OnTouchListener 。然后onTouch方法就可以实现你的客体逻辑了。这个例子告诉你左,右,左,右,

 float x1,x2; float y1, y2; @Override public boolean onTouch(View view, MotionEvent event) { switch ( event.getAction() ){ case MotionEvent.ACTION_DOWN:{ x1 = event.getX(); y1 = event.getY(); break; } case MotionEvent.ACTION_UP:{ x2 = event.getX(); y2 = event.getY(); if ( x1<x2 ) { //implement what you need to do here } if ( x1>x2 ) { //implement what you need to do here } break; } } return false; } 

如果你不想创build一个单独的类或使代码复杂,
您可以在OnTouchListener中创build一个GestureDetectorvariables,使代码更加简单

namVyuVar可以是您需要设置列表器的视图的任何名称

 namVyuVar.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent MsnEvtPsgVal) { flingActionVar.onTouchEvent(MsnEvtPsgVal); return true; } GestureDetector flingActionVar = new GestureDetector(getApplicationContext(), new GestureDetector.SimpleOnGestureListener() { private static final int flingActionMinDstVac = 120; private static final int flingActionMinSpdVac = 200; @Override public boolean onFling(MotionEvent fstMsnEvtPsgVal, MotionEvent lstMsnEvtPsgVal, float flingActionXcoSpdPsgVal, float flingActionYcoSpdPsgVal) { if(fstMsnEvtPsgVal.getX() - lstMsnEvtPsgVal.getX() > flingActionMinDstVac && Math.abs(flingActionXcoSpdPsgVal) > flingActionMinSpdVac) { // TskTdo :=> On Right to Left fling return false; } else if (lstMsnEvtPsgVal.getX() - fstMsnEvtPsgVal.getX() > flingActionMinDstVac && Math.abs(flingActionXcoSpdPsgVal) > flingActionMinSpdVac) { // TskTdo :=> On Left to Right fling return false; } if(fstMsnEvtPsgVal.getY() - lstMsnEvtPsgVal.getY() > flingActionMinDstVac && Math.abs(flingActionYcoSpdPsgVal) > flingActionMinSpdVac) { // TskTdo :=> On Bottom to Top fling return false; } else if (lstMsnEvtPsgVal.getY() - fstMsnEvtPsgVal.getY() > flingActionMinDstVac && Math.abs(flingActionYcoSpdPsgVal) > flingActionMinSpdVac) { // TskTdo :=> On Top to Bottom fling return false; } return false; } }); });