我有一个我在其上设置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();
}
因此,从上面的代码中,如果您长时间单击视图并移动手指(甚至在视图之外)而不抬起手指,则只会显示以下日志: “长时间点击激活”
答案 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()