【问题标题】:OnTouchEvent right after onLongClickonLongClick 之后的 OnTouchEvent
【发布时间】:2014-12-31 06:43:38
【问题描述】:

我有一个图像视图,我在其上设置了 OnLongClickListener。同时,我正在监听 Activity 通用的 OnTouchEvent。我希望检测到对视图的长按,然后他们开始使用 onTouchEvent MOVE 动作移动它。

问题是,如果我长按然后拖动手指,则不会调用 OnTouchEvent。我必须抬起手指然后再按一次才能发生 OnTouchEvent。

我尝试在 onLongClick 上返回 true 并返回 false,但没有成功。

有什么理由吗??

编辑:为澄清而添加的代码

MainActivity A extends Activity implements OnLongClickListener{


   public void onCreate(){
     super.OnCreate();
     setContentView(R.layout.myLayout);
     ImageView iv =  (ImageView) findViewById(R.id.myImage;
     iv.setOnLongClickListener();
  }

  public Boolean OnLongClick(View v){
     Log.i("On Long Click activated");
     return true;
  }
  public Boolean OnTouchEvent(MotionEvent event){
     Log.i("OnTouch event activated");
     return super.OnTouchEvent();
  }   

所以从上面的代码中,如果你长按一个视图并移动你的手指(甚至在视图之外)而不抬起你的手指,那么只会显示以下日志: “长按激活”

【问题讨论】:

  • 请贴一些代码,你尝试了什么
  • 希望我能从你的话中理解,这不是你假设在onTouchEvent 之后称为OnLongClickListener 的内容。但是,当您简单地触摸时,意味着只有onTouchEvent 事件应该调用,而当长按时,只有OnLongClickListener 应该调用。
  • 我添加了代码供参考。
  • Mobi 我想你误解了我的问题..查看代码进行澄清
  • 长按可点击的视图会消耗所有的触摸事件,即使在执行长按之后,也不管长按是否被处理。因此,不允许将任何触摸事件传递到Activity 级别。你应该在ImageView 上设置一个触摸监听器。

标签: android android-gesture


【解决方案1】:

我有你的问题的答案

//var
float dX, dY ;
 yourImageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.d(TAG,"onTouch");
            Display display = getWindowManager().getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            float right = size.x - yourImageView.getWidth();
            float bottom = size.y - yourImageView.getHeight() * 1.5f;
            switch (event.getAction()) {

                case MotionEvent.ACTION_DOWN:
                    Log.d(TAG,"actionDown");

                    dX = yourImageView.getX();
                    dY = yourImageView.getY();
                    Log.d(TAG, "Valores: " + String.valueOf(dX) + " " + String.valueOf(dY));
                   return true;
                case MotionEvent.ACTION_MOVE:
                    Log.d(TAG,"actionMove");

                    yourImageView.animate()
                            .x(event.getRawX() - yourImageView.getWidth())
                            .y(event.getRawY() - yourImageView.getHeight())
                            .setDuration(0)
                            .start();
                    return true;

                case MotionEvent.ACTION_UP:
                    Log.d(TAG,"actionUp");
                    if(dX == yourImageView.getX() && dY == yourImageView.getY()){
                        onclick_yourImageView(v); // this is the event todo when you click over image
                        return true;
                    }
                    if (yourImageView.getY() > 1000) {
                        float left = event.getRawX();
                        if (left < 0) {
                            left = 0;
                        }
                        yourImageView.animate()
                                .x(left - yourImageView.getWidth())
                                .y(bottom)
                                .setDuration(200)
                                .start();
                    } else if (yourImageView.getX() < size.x / 2) {
                        yourImageView.animate()
                                .x(0)
                                .y(event.getRawY() - yourImageView.getHeight())
                                .setDuration(400)
                                .start();
                    } else {
                        yourImageView.animate()
                                .x(right)
                                .y(event.getRawY() - yourImageView.getHeight())
                                .setDuration(400)
                                .start();
                    }
                    return true;
                default:
                    return false;
            }
        }
    });

将此代码粘贴到您的项目中,当仅单击图像的位置时不会改变,为此,请执行 onclick_yourImageView(v);

方法

【讨论】:

    【解决方案2】:

    我曾遇到过类似的问题,并相信我可能有一个更简单的解决方案。我发现如果 onTouch 或 onTouchEvent 也被触发,来自 OnLongClickListener 的 onLongClick 将无法正常运行。我仍然不完全确定为什么,但是 onLongClick 在每次点击时被触发,不管多长时间。

    我的解决方案是实现 OnLongClickListener,当 onLongClick 被触发时,附加我想要的 onTouchListener。在您的情况下,一旦 onLongClick 触发,您附加 touchListener 以允许移动视图。我发现 OnTouchListener 比重写 View 的 onTouchEvent 效果更好,并为您提供所有相同的信息。

    解决方案的最后一步是移除 ACTION_UP 或 ACTION_CANCEL 上的 onTouchListener。这样,您将不会再次开始移动对象,直到再次长按。请参阅下面的存根代码:

    public class MyView extends ViewGroup implements View.OnLongClickListener {
    
        public MyView(Context context, AttributeSet attrs) {
            super(context, attrs);
            //perform other view setup based on attributes
            setOnLongClickListener(this); 
        }
    
        @Override
        public boolean onLongClick(View v) {
            setOnTouchListener(touchListener);
            return false; //if you want haptics on the long click, return true
        }
    
        private OnTouchListener touchListener = new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getActionMasked()) {
                    case MotionEvent.ACTION_UP:
                        setOnTouchListener(null);
                        return true;
                    case MotionEvent.ACTION_CANCEL:
                        setOnTouchListener(null);
                    case MotionEvent.ACTION_MOVE:
                        //do your moving stuff
                        return true;
                }
                return false;
           }
       };
    }
    
    
    
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      相关资源
      最近更新 更多