http://www.eoeandroid.com/thread-98726-1-1.html
Android源码自带的Gallery不支持两个手指头缩放图片这样的多点触摸功能,所以这个得自己添加。
具体添加的代码很简单,修改一下/packages/apps/Gallery/src/com/android/camera/ViewImage.java中的rootListener就行了。
下面的代码只做了两点的情况,根据两点之间的距离长度的变化计算出缩放比例:
java代码:
float scale = value / baseValue;
复制代码
再乘上图片原本的缩放比例:
java代码:
originalScale = mImageView.getScale();
originalScale*scale
复制代码
得出图片的最终大小。
代码用到了ImageViewTouchBase提供的几个现成的方法:
mImageView.getScale()//当前的缩放比例。
mImageView.zoomTo(float scale, float centerX, float centerY)//最终缩放到多大比例。centerX和centerY是缩放的中心点,可以用两个手指的触摸点中间的那个点:[x0+x1)/2,(y0+y1)/2]。
java代码:
OnTouchListener rootListener = new OnTouchListener() {//modified by lianbing 2011.5.23
private float baseValue, lastScale;
private float originalScale;
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
baseValue = 0;
lastScale = 0;
originalScale = mImageView.getScale();
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (event.getPointerCount() == 2) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
float value = (float)Math.sqrt(x * x + y * y);//计算两点的距离
// System.out.println("value:" + value);
if (baseValue == 0) {
baseValue = value;
} else {
float scale = value / baseValue;//当前两点间的距离除以手指落下时两点间的距离就是需要缩放的比例。
if (Math.abs(lastScale - scale) > 0.1) {//只有比例变化大于0.1时才进行缩放。
lastScale = scale;
// scale the image
mImageView.zoomTo(originalScale*scale, x + event.getX(1), y + event.getY(1));
}
}
return true;
}
}
buttonListener.onTouch(v, event);
mGestureDetector.onTouchEvent(event);
// We do not use the return value of
// mGestureDetector.onTouchEvent because we will not receive
// the "up" event if we return false for the "down" event.
return true;
}
};
复制代码
另外,发现一部分机器上面有这样一个问题,在机器用USB连接到PC上时,触摸有些乱。平时用自己的机器在看小说时,如果手机正连着充电器,也会有触摸不准确的问题。
所以调试这一部分的程序时,最好拔掉USB线。
另外android.view.ScaleGestureDetector好像也是专门做这个的。
Android源码自带的Gallery不支持两个手指头缩放图片这样的多点触摸功能,所以这个得自己添加。
具体添加的代码很简单,修改一下/packages/apps/Gallery/src/com/android/camera/ViewImage.java中的rootListener就行了。
下面的代码只做了两点的情况,根据两点之间的距离长度的变化计算出缩放比例:
java代码:
float scale = value / baseValue;
复制代码
再乘上图片原本的缩放比例:
java代码:
originalScale = mImageView.getScale();
originalScale*scale
复制代码
得出图片的最终大小。
代码用到了ImageViewTouchBase提供的几个现成的方法:
mImageView.getScale()//当前的缩放比例。
mImageView.zoomTo(float scale, float centerX, float centerY)//最终缩放到多大比例。centerX和centerY是缩放的中心点,可以用两个手指的触摸点中间的那个点:[x0+x1)/2,(y0+y1)/2]。
java代码:
OnTouchListener rootListener = new OnTouchListener() {//modified by lianbing 2011.5.23
private float baseValue, lastScale;
private float originalScale;
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
baseValue = 0;
lastScale = 0;
originalScale = mImageView.getScale();
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (event.getPointerCount() == 2) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
float value = (float)Math.sqrt(x * x + y * y);//计算两点的距离
// System.out.println("value:" + value);
if (baseValue == 0) {
baseValue = value;
} else {
float scale = value / baseValue;//当前两点间的距离除以手指落下时两点间的距离就是需要缩放的比例。
if (Math.abs(lastScale - scale) > 0.1) {//只有比例变化大于0.1时才进行缩放。
lastScale = scale;
// scale the image
mImageView.zoomTo(originalScale*scale, x + event.getX(1), y + event.getY(1));
}
}
return true;
}
}
buttonListener.onTouch(v, event);
mGestureDetector.onTouchEvent(event);
// We do not use the return value of
// mGestureDetector.onTouchEvent because we will not receive
// the "up" event if we return false for the "down" event.
return true;
}
};
复制代码
另外,发现一部分机器上面有这样一个问题,在机器用USB连接到PC上时,触摸有些乱。平时用自己的机器在看小说时,如果手机正连着充电器,也会有触摸不准确的问题。
所以调试这一部分的程序时,最好拔掉USB线。
另外android.view.ScaleGestureDetector好像也是专门做这个的。