Android中实现双指缩放的功能
安卓中实现将图片缩放的功能提供了一个很好的类:ScaleGestureDetector,本章就介绍使用canvas和ScaleGestureDetector类实现缩放的功能,如果要想详细了解ScaleGestureDetector请参考博文Android的ScaleGestureDetector缩放类详解
1. 先初始化缩放比和图片居中绘制的坐标点
float posX, posY; //图片的坐标
int viewWidth, viewHeight; //屏幕的宽高
float widthScale, heightScale; //宽高缩放比
boolean hasInitViewSize; //是否已经初始化视图
public void initSize() {
viewWidth = getWidth(); //得到屏幕宽度
viewHeight = getHeight(); //得到屏幕高度
if (viewWidth < 0 && viewHeight < 0) {
return;
}
hasInitViewSize = true;
widthScale = viewWidth / imgWidth; //宽高缩放比=屏幕的宽高/屏幕的宽高
heightScale = viewHeight / imgHeight;
scaleFactor = Math.min(widthScale, heightScale); //总缩放比取宽高缩放比中最小的
posX = viewWidth / 2 - imgWidth / 2; //使图片居中绘制
posY = viewHeight / 2 - imgHeight / 2;
}
2. 创建两个内部类分别继承SimpleOnScaleGestureListener和SimpleOnGestureListener来动态获取缩放比和坐标
class MySimpleOnGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
posX -= distanceX; //X轴的坐标=X轴的坐标-在X轴方向的移动距离
posY -= distanceY; //y轴的坐标=y轴的坐标-在y轴方向的移动距离
invalidate(); //刷新view
return true;
}
}
class MySimpleScaleOnGestureDetector extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
scaleFactor *= detector.getScaleFactor(); //缩放比=缩放比*动态获取的缩放比
scaleFactor = scaleFactor < 0.75 ? (float) 0.75 : scaleFactor > 3 ? 3 : scaleFactor; //控制缩放倍率在0.75-3之间
invalidate(); //刷新view
return true;
}
}
3. 为了移动图片时不超出屏幕,还得进行控制,原则是:图片较小时任意一条边都不能出了边界,图片较大任意一条边都不能进入边界。宽度和高度分别独立计算。
public void checkBounds() {
if (scaleFactor > widthScale) {
//宽度方向已经填满
posX = Math.min(posX, (scaleFactor - 1) * (imgWidth / 2));
posX = Math.max(posX, viewWidth - imgWidth - (scaleFactor - 1) *