OnLongClick之后的OnTouchEvent

时间:2014-12-31 06:43:39

标签: android android-gesture

我有一个我在其上设置OnLongClickListener的imageview。同时,我正在监听Activity泛型OnTouchEvent。我希望能够检测到长时间点击某个视图,并使用onTouchEvent MOVE操作开始移动它。

问题是如果我长按然后拖动我的手指,OnTouchEvent就不会被调用。我必须抬起手指,然后再次按下OnTouchEvent。

我尝试返回true并返回false onLongClick但没有运气。

任何原因??

编辑:为澄清添加了代码

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

因此,从上面的代码中,如果您长时间单击视图并移动手指(甚至在视图之外)而不抬起手指,则只会显示以下日志: “长时间点击激活”

2 个答案:

答案 0 :(得分:0)

我有你问题的答案

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

将此代码粘贴到您的proyect中,当只是单击图像的位置时不会更改,对于这种罕见的方法,请执行方法 onclick_yourImageView(v);

答案 1 :(得分:0)

我在一个类似的问题上苦苦挣扎,并相信我可能有一个更简单的解决方案。我发现,如果还触发了onTouch或onTouchEvent,则来自OnLongClickListener的onLongClick将无法正常运行。我仍然不确定为什么,但是无论多长时间,每次点击都会触发onLongClick。

我的解决方案是实现OnLongClickListener,并在触发onLongClick时,附加所需的onTouchListener 。就您而言,一旦onLongClick触发,您就可以附加touchListener来移动视图。我发现OnTouchListener比覆盖View的onTouchEvent更好,并且为您提供了所有相同的信息。

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


import io
import pandas as pd

data = """
day   temperature        Expected
0       89               0
1       91               0
2       93               1
3       88               0
4       91               0
5       91               1
6       93               1
"""

data = io.StringIO(data)
df = pd.read_csv(data, sep='\s+')

df['Result'] = ((df['temperature'].shift(1) > 90) & (df['temperature'] > 90)).astype(int)

# Validation
(df['Result'] == df['Expected']).all()