【发布时间】:2012-01-01 02:24:22
【问题描述】:
请参阅下面的每个部分,以三种不同的方式描述我的问题。希望能帮助人们回答。
问题:在给定原始比例点和比例因子的情况下,当您只有以缩放图像表示的坐标时,您如何找到在画布/用户空间中表示的一对坐标? p>
实践中的问题:
我目前正在尝试复制画廊/地图等应用程序中使用的缩放功能,当您可以捏合以缩放/缩小时,缩放向捏合点的中点移动。
向下保存缩放的中心点(基于当前屏幕的 X、Y 坐标)。然后,当检测到“缩放”手势时,我会执行此功能:
class ImageScaleGestureDetector extends SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
if(mScaleAllowed)
mCustomImageView.scale(detector.getScaleFactor(), mCenterX, mCenterY);
return true;
}
}
CustomImageView的缩放功能如下:
public boolean scale(float scaleFactor, float focusX, float focusY) {
mScaleFactor *= scaleFactor;
// Don't let the object get too small or too large.
mScaleFactor = Math.max(MINIMUM_SCALE_VALUE, Math.min(mScaleFactor, 5.0f));
mCenterScaleX = focusX;
mCenterScaleY = focusY;
invalidate();
return true;
}
缩放图像的绘制是通过覆盖 onDraw 方法实现的,该方法围绕中心缩放画布并将图像绘制到它。
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.translate(mCenterScaleX, mCenterScaleY);
canvas.scale(mScaleFactor, mScaleFactor);
canvas.translate(-mCenterScaleX, -mCenterScaleY);
mIcon.draw(canvas);
canvas.restore();
}
当从 ScaleFactor 1 缩放时,这一切正常,这是因为初始 mCenterX 和 mCenterY 是基于设备屏幕的坐标。设备上的 10, 10 是画布上的 10, 10。
然而,在你已经缩放之后,下次你点击位置 10, 10 时,由于已经执行了缩放和变换,它将不再对应画布中的 10, 10。
抽象问题:
下图是围绕中心点 A 进行缩放操作的示例。每个框表示在该比例因子(1、2、3、4、5)下视图的位置和大小。
在示例中,如果您在 A 周围按 2 倍缩放,然后单击位置 B,则报告为 B 的 X、Y 将基于屏幕位置,而不是相对于初始位置 0,0 的位置画布。
我需要想办法得到B的绝对位置。
【问题讨论】:
-
Android的标准View缩放+设置轴心点不行吗?
-
不确定“标准视图缩放和枢轴点设置”是什么意思?如果您可以扩展它,那就太好了。
-
我的意思是使用
setScaleX()和setScaleY(()进行缩放,使用setPivotX()和setPivotY()设置缩放中心。它们都是 View 的方法,但我刚刚读到这些方法的 minSdkVersion 是 11(Honeycomb),所以如果您针对早期版本,这些信息可能对您毫无用处。 -
不幸的是 2.3 :( 不过感谢您的建议!希望将来能对某人有所帮助!
-
Sony-Ericson 对缩放有一定的了解,这可能会有所帮助。 blogs.sonyericsson.com/wp/2010/05/18/…