【问题标题】:How to detect gesture over ImageView?如何检测 ImageView 上的手势?
【发布时间】:2011-09-23 11:16:06
【问题描述】:

我想检测手指被拖过 ImageView。我得到我的 ImageView,创建 GestureDetector 和 View.OnTouchListener 的实例,然后将 View.OnTouchListener 设置为 ImageView。

OnTouchListener 检测到所有触摸(“触摸发生”)并将它们传递给 GestureDetector,但它从不调用其方法 onScroll 或 onFling。我做错了什么?下面你可以看到相关的来源:

    myImageView = (ImageView) findViewById(R.id.imageView1);

    myGestureDetector = new GestureDetector(this,
            new GestureDetector.OnGestureListener() {

                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    // TODO Auto-generated method stub
                    return false;
                }

                @Override
                public void onShowPress(MotionEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public boolean onScroll(MotionEvent e1, MotionEvent e2,
                        float distanceX, float distanceY) {
                    // TODO Auto-generated method stub
                    Log.d("gestures", "scroll");
                    return true;
                }

                @Override
                public void onLongPress(MotionEvent e) {
                    // TODO Auto-generated method stub

                }

                @Override
                public boolean onFling(MotionEvent e1, MotionEvent e2,
                        float velocityX, float velocityY) {
                    // TODO Auto-generated method stub
                    Log.d("gestures", "fling");
                    return true;
                }

                @Override
                public boolean onDown(MotionEvent e) {
                    // TODO Auto-generated method stub
                    return false;
                }

            });



    gestureListener = new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            if (myGestureDetector.onTouchEvent(event)) {
                Log.d("gestures", "here");
                return true;
            }

            Log.d("gestures", "touch occured");
            return false;
        }
    };

    myImageView.setOnTouchListener(gestureListener);

【问题讨论】:

  • 你能告诉我你要做什么吗?
  • 你实现了 OnGestureListener 吗?
  • 我想检测 ImageView 上的拖动动作并在 ImageView 中移动缩放的图像。另外,如果我只想将它分配给一个 ImageView,而不是整个 Activity 布局,为什么还要实现它。
  • 抱歉,各位 ATM 有很多工作,无法进行编程。几天后就会得到这些答案。
  • 最后我没有成功让 my​​GestureDetector 工作,我最终为 View.OnTouchListener() 编写了自己的 onTouch() 方法,该方法通过比较 MotionEvent.getX / getY 值来检测拖动

标签: android android-input-method


【解决方案1】:
OnGestureListener 的

onDown 方法必须始终返回 true 否则检测器不会对以下事件做出反应,因此不会调用 onScroll。

【讨论】:

  • 谢谢。它现在似乎反应了。我将尝试对手势大小进行一些过滤,如果此更改是完成此工作所需的唯一事情,我会接受您的回答。
【解决方案2】:

我认为您还需要重写 onTouchEvent 方法。我在 imageview 上检测到 onFling() 手势是这样的。

   @Override
    public boolean onTouchEvent(MotionEvent event){
                return myGestureDetector.onTouchEvent(event);
    }

在我最后工作的代码是:

 public class AddNewTask extends Activity implements OnClickListener,OnTouchListener ,GestureDetector.OnGestureListener
    {
  private GestureDetector gestures;
    private ImageView imgViewPreview;
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.addtask);

     gestures = new GestureDetector(AddNewTask.this,
                         this);
    imgViewPreview.setOnTouchListener(this);

    }

    public boolean onTouch(View v, MotionEvent event)
     {
        if(v==imgViewPreview)
          if(gestures.onTouchEvent(event))
             return true;


        return false;
    }

    @Override
     public boolean onTouchEvent(MotionEvent event) 
    {
       return gestures.onTouchEvent(event);      

     }

}

【讨论】:

  • 如果我添加这个,我会得到编译错误。我只通过没有@Override 表示法,但没有任何反应。据我了解,onTouchEvent() 方法应该确定手势的类型并调用某些方法,例如 onFling()。你有实际的代码吗?
  • 是的,你是对的。我可以知道你在编译时遇到的错误是什么吗?
  • 我在上面添加了工作代码,请检查这是否适用于您。 :)
  • 我不知道确切的原因,但是当我将 longclick 侦听器添加到 imageview 时,它工作正常。但是当我删除它时它不起作用。请尝试将 longclick 列表器添加到 imageview。
【解决方案3】:

尝试通过扩展SimpleOnGestureListener 来使用自定义的手势监听器类。同样通过这样做,您还可以覆盖上述所有方法。

【讨论】:

  • 我已经尝试过 SimpleOnGestureListener 但这些方法再次没有被回调。
【解决方案4】:

首先解决您在使用@Override 时遇到的错误。

这主要是因为较低的Java编译器配置[应用程序属性->Java编译器->编译器合规级别]确保它是1.6。

解决此问题后,请使用 @Override 表示法重试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2016-07-30
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多