这两天研究了一下多点触控缩放,也参考了网上几个例子,但觉得不够完美。
先推荐大家看一篇很详细的介绍:http://blog.csdn.net/jj120522/article/details/8467810
这里面的例子有两个问题:
1. onClick事件和onLongClick时间,会在图像缩放或者移动时同时出发(这给我们带来很大困扰)
2. 图像缩小回弹成原大小时,图像会变形
于是我自己对代码做了一些修正。
//自己获取OnClickeListener & OnLongClickListener,在GuestureDetector里面调用,不让系统去调用
private OnClickListener mOnClickListener;
private OnLongClickListener mOnLongClickListener;
@Override
public void setOnClickListener(OnClickListener l) {
mOnClickListener = l;
}
@Override
public void setOnLongClickListener(OnLongClickListener l) {
mOnLongClickListener = l;
}
/***
* touch 事件
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
// 因为onTouchEvent()不知道 长时间移动或双手指缩放和长按事件的区别,所以配合GestureDetector来处理事件
mGestureDetector.onTouchEvent(event);
/** 处理单点、多点触摸 **/
switch (event.getAction() & MotionEvent.ACTION_MASK) {
// 多点触摸
case MotionEvent.ACTION_POINTER_DOWN:
onPointerDown(event);
break;
case MotionEvent.ACTION_UP:
mode = MODE.NONE;
break;
// 多点松开
case MotionEvent.ACTION_POINTER_UP:
mode = MODE.NONE;
/** 执行缩放还原 **/
if (isScaleAnim)
doScaleAnim();
break;
}
return true;
}
/** 防止onClick、LongClick跟缩放动作一起触发 */
@SuppressWarnings("deprecation")
GestureDetector mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDown(MotionEvent e) {
onTouchDown(e);
return false;
}
@Override
public void onLongPress(MotionEvent e) {
if (mOnLongClickListener != null)
mOnLongClickListener.onLongClick(DragImageView.this);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
if (mOnClickListener != null)
mOnClickListener.onClick(DragImageView.this);
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
onTouchMove(e2);
return false;
}
});
下载地址: