2010-11-04 60 views
41

好吧,我一直在这里引用代码:Fling gesture detection on grid layout添加扫视姿势到图像视图 - Android电子

但就是无法得到它的工作。在我的主要活动中,我定义了一个简单的图像。我想要检测图像上的一片阴影。以下是我的代码如下。底部的onclick方法是空的。是因为这个吗?我将它留空,因为在其他代码示例中,它不是我想要的。我只想要一个简单的敬酒来弹出说出正确的或扔向左。

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) {} 
} 
+0

又见查看的任何名称[如何手势检测添加到Android的视图(https://stackoverflow.com /问题/ 45054908 /如何-TO-添加一个手势检测器在Android中查看) – Suragch 2017-07-12 10:21:15

回答

83

下面是我能想到的flinger最简单的工作版本。 你可以将它绑定到任何组件,而不仅仅是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行动) 它不仅捕获的水平,而且也垂直(只需删除垂直部分,如果你不需要它)和水平您可以看到滑动优先。 在地方,方法返回(NAD在我的意见是)只需要调用你的方法或任何:)

+0

帮助我理解手势检测器和甩尾...... – Gopinath 2011-03-11 07:49:27

+3

使用'最终的GestureDetector gdt = GestureDetector(this,new GestureListener());''相反,按照http://developer.android.com/reference/android/view/GestureDetector.html#GestureDetector(android.view.GestureDetector.OnGestureListener) – Richard 2013-04-11 14:58:17

+0

这更像是分页。一个很好的例子可以在这里找到:http://developer.android.com/training/custom-views/making-interactive.html – Snicolas 2013-05-03 00:38:40

13

试试这个

imageView.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (gestureDetector.onTouchEvent(event)) { 
       return false; 
      } 
      return true; 
     } 
    }); 
+2

** + 1 **谢谢他为我工作..我回归真实而不是错误。现在我的问题解决了 – 2011-05-05 11:22:07

+1

@Ganapathy可以更新答案与工作代码plz – 2013-10-25 12:43:26

+0

@contactmeandroid里面,如果条件也我返回true;它为我工作。 – 2013-10-28 06:08:40

9
imageView.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     return !gestureDetector.onTouchEvent(event); 
    } 
}); 
3

报道了一些前提

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; 
} 

该溶液的重构是me.if完美的工作,那么任何的查询提出意见。

0

如果您正在寻找像ImageView.setOnGestureListener这样的方法,那就没有。你可以看看Android的源代码。你最好的选择是在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> 

现在,考虑我可以让(从上面)最简单的GestureDetector并修改它你想要的东西,我得到这个:

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()。

0

使用ImageView设计您的布局。 将setOnTouchListener添加到imageView。 imageview.setOnTouchListener(this)。添加未实现方法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; 
} 
+1

答案不提供fling逻辑,OP正在寻找。 – Sipty 2015-07-27 14:29:34

0

如果你不希望创建一个单独的类或使代码复杂,
您可以只创建内部OnTouchListener一个GestureDetector变量,使你的代码更容易

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; 
     } 
    }); 
});