我尝试中断我为ImageView声明的setOnTouchListener。 关键是当用户手指靠近屏幕顶部时,停止监听器并对其进行“重置”,并在我的ImaeView布局上进行“重置”。
我的步骤是: - >创建OnTouchListener - >存储手指位置 - >如果手指靠近屏幕顶部(100像素),请将活动布局xml文件中的ImageView布局重置为默认值,并中断监听器。 - >要重复使用OnTouchListener,用户必须放下手指。
我的代码是这样的:
private void readyDeck() {
// TODO Auto-generated method stub
backCard = (ImageView)findViewById(R.id.leader_backCardImg);
backCard.setVisibility(View.VISIBLE);
backCard.setAlpha(255);
backCard.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent me) {
int eid = me.getAction();
switch(eid){
case MotionEvent.ACTION_MOVE:
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int height = displaymetrics.heightPixels;
RelativeLayout.LayoutParams mParams = (RelativeLayout.LayoutParams) backCard.getLayoutParams();
int y = (int) me.getRawY();
mParams.topMargin = y-height+(backCard.getHeight()/(1+(1/2)));
backCard.setLayoutParams(mParams);
int limit = backCard.getHeight();
if(y > limit){
mParams.topMargin = limit;
backCard.setLayoutParams(mParams);
}
else if(y < 255){
backCard.setAlpha(y);
if(y < 100){
backCard.setVisibility(View.GONE);
backCard.setOnTouchListener(null);
sendData();
break;
}
}
break;
default:
break;
}
return true;
}
});
}
sendData()方法必须重置监听器,但如果我的代码如下:
public void sendData(){
readyDeck();
}
即使我们没有将手指放在屏幕外,手指的位置也会被存储和使用。
你可以通过在sendData()方法中添加一些操作来看到它,比如删除一个ArrayList的随机项,这里是logCat:
12-13 08:01:06.400: I/System.out(17171): s4 removed.New Size : 51
12-13 08:01:06.460: I/System.out(17171): h6 removed.New Size : 50
12-13 08:01:06.520: I/System.out(17171): h1 removed.New Size : 49
12-13 08:01:06.560: I/System.out(17171): c1 removed.New Size : 48
12-13 08:01:06.605: I/System.out(17171): hk removed.New Size : 47
12-13 08:01:06.630: I/System.out(17171): d9 removed.New Size : 46
12-13 08:01:06.655: I/System.out(17171): d2 removed.New Size : 45
12-13 08:01:06.695: I/System.out(17171): h2 removed.New Size : 44
12-13 08:01:06.730: I/System.out(17171): d8 removed.New Size : 43
12-13 08:01:06.760: I/System.out(17171): s10 removed.New Size : 42
12-13 08:01:06.800: I/System.out(17171): h7 removed.New Size : 41
12-13 08:01:06.830: I/System.out(17171): d6 removed.New Size : 40
12-13 08:01:06.850: I/System.out(17171): h9 removed.New Size : 39
12-13 08:01:06.900: I/System.out(17171): s6 removed.New Size : 38
12-13 08:01:07.250: I/System.out(17171): c4 removed.New Size : 37
12-13 08:01:07.275: I/System.out(17171): d3 removed.New Size : 36
12-13 08:01:07.300: I/System.out(17171): cv removed.New Size : 35
我们可以看到该方法不会停止监听器,因为在将其转换为null之后,监听器再次加载了boolen OnTouch()。
你有办法打断听众吗?还有更多,重置我的ImageView的布局?谢谢!
答案 0 :(得分:0)
我认为如果你在调用sendData()时只返回false,那么应该阻止对当前触摸事件的onTouch方法的进一步调用。来自developer website:
onTouch() - 返回一个布尔值,指示您的侦听器是否使用此事件。重要的是这个事件可以有多个相互跟随的动作。因此,如果在收到向下操作事件时返回false,则表示您尚未使用该事件,并且对此事件的后续操作也不感兴趣。因此,您不会在事件中调用任何其他操作,例如手指手势或最终的上行动作事件。