最近几天在做一个瀑布流的小项目,为了实现以下功能:图片的手指放大、移动,点击后关闭当前的自定义窗口,无论怎么设置,ontouch事件和onclick就是发生冲突,无法实现想要功能,刚开始以为是手指放大移动功能的方法以及图片的获取问题,后来意识到是这两个方法发生了冲突。后来查找各种资料,终止解决了这个问题。处理方法:
取消onclick方法,定义两个变量 float x,float y,在case MotionEvent.ACTION_MOVE:中放入代码
x = event.getX();
y = event.getY();
在case MotionEvent.ACTION_UP:加入下面代码,进行判断
if(x>5 || y>5){
x=y=0;
}else{
popWin.dismiss();//关闭自定义的窗口
}
break;
实现手指放大、移动,点击后关闭窗口的类如下:
public class ZoomListener implements OnTouchListener {
float Ospace;
PointF start = new PointF(0, 0);
String Mode;
private Swiper swp;
private float x,y;
private PopupWindow popWin;
private MyView myView ;
public ZoomListener(Context context,MyView myView) {
this.myView = myView;
}
public ZoomListener(){}
public ZoomListener(PopupWindow popWin,String[] image_filenames,String path){
this.popWin = popWin;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO 自动生成的方法存根
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
start.set(event.getX(), event.getY());
Log.i("info", start.x + ":" + start.y);
Mode = "DRAG";
break;
case MotionEvent.ACTION_POINTER_DOWN:
Ospace = spacing(event);
Mode = "ZOOM";
Log.i("info", "原始面积" + Ospace);
break;
case MotionEvent.ACTION_UP:
if(x>5 || y>5){
x=y=0;
}else{
popWin.dismiss();
}
break;
case MotionEvent.ACTION_POINTER_UP:
Mode = "NONE";
if(((MyView) v).getZoom() == 1){
float sx = start.x - event.getX();
float sy = start.y - event.getY();
if (Math.abs(sx) > Math.abs(sy)) {
// swp.Swipe(v, sx/10);
}
}
start.set(event.getX(), event.getY());
break;
case MotionEvent.ACTION_MOVE:
if (Mode == "DRAG") {
if (((MyView) v).getZoom() > 1) {
float sx = start.x - event.getX();
float sy = start.y - event.getY();
if(Math.sqrt(sx*sx+sy*sy)>20){
((MyView) v).setPan((int) (start.x - event.getX()),
(int) (start.y - event.getY()));
Log.i("info", "平移:" + ((MyView) v).getPan().x + ":"
+ ((MyView) v).getPan().y);
start.set(event.getX(), event.getY());
}
}
} else if (Mode == "ZOOM") {
float nspace = spacing(event);
float zoom = 1 + (nspace - Ospace) / Ospace;
if(Math.abs(nspace - Ospace)>3){
((MyView) v).setZoom(zoom);
Log.i("Info", "缩放为:" + ((MyView) v).getZoom());
Ospace=nspace;
}
}
x = event.getX();
y = event.getY();
break;
}
return true;
// return detector.onTouchEvent(event);
}
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
public Swiper getSwp() {
return swp;
}
public void setSwp(Swiper swp) {
this.swp = swp;
}
public interface Swiper {
public void Swipe(View v, float length);
}