我想在我的Android应用程序中实现fling个手势检测.

我有的是包含9ImageViewGridLayout.来源可以在这里找到:Romain Guys's Grid Layout.

我拿的那个文件是从罗曼·盖伊的Photostream application里拿来的,只是稍微改编了一下.

对于简单的点击情况,我只需要将我添加的每个ImageViewonClickListener设置为实现View.OnClickListener的主activity.要实现能够识别fling的东西似乎要复杂得多.我猜这是因为它可能跨越views米?

  • 如果我的活动实现

    public class SelectFilterActivity extends Activity implements
       View.OnClickListener, OnGestureListener { ...
    
  • 如果我的活动实现

    public class SelectFilterActivity extends Activity implements
        View.OnClickListener, OnTouchListener { ...
    
  • 如果我定制了一个View,比如GestureImageView扩展到ImageView,我不知道如何从视图中告诉活动发生了fling.在任何情况下,我try 了这个方法,当我touch 屏幕时,这些方法没有被调用.

我真的需要一个跨视图工作的具体例子.我应该在什么时候以何种方式附上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;
        }
    }
});

是否可以在我的屏幕顶部放置一个透明视图来捕捉狂欢?

如果我不从XML Select inflate个子图像视图,我可以将GestureDetector作为构造函数参数传递给我创建的ImageView个新的子类吗?

这是一个非常简单的活动,我试图让fling检测工作:SelectFilterActivity (Adapted from photostream).

我一直在寻找这些来源:

到目前为止,我什么都没做,我希望能得到一些建议.

推荐答案

感谢Code Shogun,我根据自己的情况修改了它的代码.

让你的活动像往常一样:

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

帖子上的"狂欢"舞是可选的,但受到鼓励.

Android相关问答推荐

Kotlin Gzip字符串未按预期工作

在Android上使用XSLT文件转换XML文件

保护所有程序包文件和类

在带有REACT-Native-CLI的开发和生产中使用Firebase的最佳实践

在Delphi中使用OpenCV for Android在使用JLIST时抛出错误

如何在Android中将以前的数据保存在复选框中?

如何制作安卓';s FileProvider在Android 11上使用外部存储+

看不到选项菜单栏

Android studio应用判断无法打开离线数据库

Color.Transparent 和 Color.Unspecified 之间的区别

面向Jetpack Compose的可组合放置问题

Android 应用程序从 Android Studio 安装,但不是作为 .apk 在外部安装.抛出java.lang.UnsatisfiedLinkError

在Android RoomDB中使用Kotlin Flow和删除数据时如何解决错误?

Android Studio 复制类 kotlin

在 Jetpack Compose 中包装内容

从 Firebase 云存储中获取照片会导致 Android Jetpack Compose 闪烁

Hilt 依赖注入重复绑定错误

Kotlin 调用带参数的函数 Any is xxx ||任何 yyy 都不起作用

如何在 flow.stateIn() 之后从流中的另一个函数发出emits ?

Android:如何获取具有纬度和经度的位置的图像