我一直在这个问题上停留了八个小时,所以我觉得是时候得到一些帮助。画布捏缩放到点范围内
在开始我的问题之前,我只会让我们知道我已经浏览过此网站和Google,而且我找到的答案都没有帮助。 (This是一个,another和another)
这里的交易:我有一个扩展SurfaceView
类(姑且称之为MySurface
),并覆盖在它的许多方法。通常,它会绘制几个正方形和文本框,这很好。只要用户开始触摸,它就会转换为Bitmap
,然后绘制直到用户释放的每个帧。
这里是蹭:我想实现这样的功能,用户可以将两个手指放在屏幕上,捏缩放,也可以平移(但只有两个手指向下)。
我发现捏到变焦的几个实现,并通过以下他们适应我Canvas
对象MySurface
:
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.scale(mScaleVector.z, mScaleVector.z); // This is the scale factor as seen below
canvas.translate(mScaleVector.x, mScaleVector.y); // These are offset values from 0,0, both working fine
// Start draw code
// ...
// End draw code
canvas.restore();
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
float factor = detector.getScaleFactor();
if (Math.abs(factor - 1.0f) >= 0.0075f) {
mScaleVector.z *= factor;
mScaleVector.z = Math.max(MIN_ZOOM, Math.min(mScaleVector.z, MAX_ZOOM));
}
// ...
invalidate();
return true;
}
}
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
if (event.getPointerCount() == 2) {
if (action == MotionEvent.ACTION_POINTER_DOWN && pointerIndex == 1) {
// The various pivot coordinate codes would belong here
}
}
detector.onTouchEvent(event); // Calls the Scale Gesture Detector
return true;
}
虽然这两个元素做工精细 - 来回捏滚动 - 缩放 - 有一个大问题。缩放到缩放时,放大到点0,0
,而不是放大到手指点。
我已经尝试了很多办法来解决这个问题:
- 使用
canvas.scale(mScaleVector.z, mScaleVector.z, mScaleVector.x, mScaleVector.y);
;显然,这会产生不想要的结果,因为mScaleVector
x和y值是0偏移量。 - 管理使用与
translate()
方法相同的偏移量的“数据透视”坐标,但这会产生相同的0,0
问题,或者在触摸视图时跳转。 - 许多其他的事情......我已经做了很多与上述枢轴坐标,试图将其位置基于用户的第一次触摸,并将其相对于触摸每个连续的手势。
此外,此画布必须是有界的,所以用户不能永久滚动。但是,当我使用.scale(sx, sy, px, py)
方法时,它会将事物推到我在.translate()
中设置的任何边界之外。
我很...在这一点上很开放。我知道可以添加此功能,因为它可以在Android 4.0图库中查看(查看单个图像时)。我试图追踪处理这个问题的源代码,但无济于事。
我个人直接使用'onTouchEvent'处理两个手指位置。有了这个,你可以很容易地找到中点,以及需要多大的缩放比例。 – Doomsknight
如果你已经解决了我面临同样问题的问题,你可以请发布解决方案,我的客户是...... :(或者你能告诉我你是如何解决问题的吗?谢谢 – AkashG