在项目中经常在同一个界面中会用到onTouch时间与onClick事件,这两个事件有时候会有冲突,或者导致其中一个事件监听不起作用。下面说一下关于这两个事件同时存在的时候的处理方法。先上代码。
/**小猫的监听事件**/
private void initCatListener(){
//左侧小猫的点击事件
anim_cat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
k++;
if(k%2>0){
anim_cat.layout(824, 400, 1024, 600);//
huanfu.setBackgroundResource(R.drawable.huanfu_selector);
honghua.setBackgroundResource(R.drawable.yuyin_selector);
}
else{
anim_cat.layout(824, 400, 1024, 600);
huanfu.setBackgroundResource(R.color.transparent);
honghua.setBackgroundResource(R.color.transparent);
}
v.setBackgroundResource(R.anim.sit_stand);
handler.post(st_thread);
}
});
//右侧小猫的触摸监听事件
anim_cat.setOnTouchListener(new OnTouchListener() {
int lastX, lastY,lastX1,lastY1;
@Override
public boolean onTouch(View v, MotionEvent event) {
DisplayMetrics dm = getResources().getDisplayMetrics();
int screenWidth = dm.widthPixels;
int screenHeight = dm.heightPixels;
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
lastX1 = (int) event.getRawX();
lastY1 = (int) event.getRawY();
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
return false;
//拖拽动画
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
if(Math.sqrt(dx*dx+dy*dy)>20){
int left = v.getLeft() + dx;
int top = v.getTop() + dy;
int right = v.getRight() + dx;
int bottom = v.getBottom() + dy;
// 设置不能出界
if (left < 0) {
left = 0;
right = left + v.getWidth();
}
if (right > screenWidth) {
right = screenWidth;
left = right - v.getWidth();
}
if (top < 0) {
top = 0;
bottom = top + v.getHeight();
}
if (bottom > screenHeight) {
bottom = screenHeight;
top = bottom - v.getHeight();
}
v.setBackgroundResource(R.anim.tuo_show);
v.layout(left, top, right, bottom);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
}
return false;
//单击弹出气泡,移动拖拽
case MotionEvent.ACTION_UP:
int lastX2 = (int) event.getRawX();
int lastY2 = (int) event.getRawY();
//右侧底角,判断是点击还是拖拽
if(lastX2>screenWidth/2 ){
//滑动的宽和高都小于1的时候,认为是点击事件,弹出泡泡
if(Math.abs(lastX2-lastX1)<1 && Math.abs(lastY2-lastY1)<1){
return false;
}else{
//恢复到右下角
anim_cat.layout(824, 400, 1024, 600);
anim_cat2.setVisibility(View.GONE);
cat_layout.setVisibility(View.VISIBLE);
anim_cat.setVisibility(View.VISIBLE);
anim_cat.setBackgroundResource(R.anim.sit_stand);
startAnimaton(anim_cat);
return true;
}
}
else{
//隐藏右下角,显示左下角小猫
anim_cat.setVisibility(View.GONE);
cat_layout2.setVisibility(View.VISIBLE);
anim_cat2.layout(0, 400, 200, 600);
anim_cat2.setVisibility(View.VISIBLE);
anim_cat2.setBackgroundResource(R.anim.sit_stand);
honghua.setBackgroundResource(R.color.transparent);
huanfu.setBackgroundResource(R.color.transparent);
startAnimaton(anim_cat2);
k = 0;//防止泡泡显示时拖拽到另一侧,又恢复到左侧,第一次点击小猫泡泡不显示的问题
return true;
}
}
return false;
}
});
前面是点击事件的监听,后面是触摸事件的监听,这两个事件的关键点在于onTouch事件的监听中。case MotionEvent.ACTION_DOWN:按钮被按下的时候,要做的操作,通常情况下,在switch中一个case中的方法执行完毕之后,要用break来结束。但是,在此处,要return false;这里的return false是什么意思呢?
onTouch事件的监听返回的是一个布尔型的值,在DOWN事件结束的时候,返回false,意思就是说监听没有结束,要继续往下进行。在MOVE事件中,返回的还是false,监听继续有效。在UP事件中,判断MOVE的距离,距离小于1,return false;默认拖动距离小于1当做点击事件处理,此时的onClickListener就起作用了。move距离大于1,return true;表示监听已经结束,不再继续往下执行,onClick事件不起作用。