我曾经面临同样的问题,但最终解决了它。
为了实现这一点,我尝试了很多方法。首先,您需要将您的坐标转换为 PhotoView
:
int bitmapWidth = bitmap.getWidth();
int bitmapHeight = bitmap.getHeight();
float x = 1209f;
float y = 944f;
float focalX = x*photoView.getRight()/bitmap.getWidth();
float focalY = y*photoView.getBottom()/bitmap.getHeight();
float targetScale = 4f;
attacher.setScale(targetScale, focalX, focalY, false);
来源:GitHub aslansari
这个答案适用于缩放部分。当放大时,为了使您的对象中心在屏幕中心上进行编程移动,我做了这个。
var event = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, focalX, focalY, 0)
mPhotoView.dispatchTouchEvent(event)
val centerImageX = showResultCoinDetectionPhotoView.displayRect.centerX()
val centerImageY = showResultCoinDetectionPhotoView.displayRect.centerY()
var event = event = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE, centerImageX, centerImageY, 0)
mPhotoView.dispatchTouchEvent(event)
如果你不需要缩放动画,那么你就不需要更多了。
如果你想使用动画
我已经找到问题所在,但还无法修复。以下是我的想法。
这不起作用,因为它在另一个线程中调用动画。
mImageView.post(new AnimatedZoomRunnable(getScale(), scale, focalX, focalY));
同时,我尝试模拟移动以将点重新居中于屏幕中心。
var event = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, focalX, focalY, 0)
mPhotoView.dispatchTouchEvent(event)
val centerImageX = showResultCoinDetectionPhotoView.displayRect.centerX()
val centerImageY = showResultCoinDetectionPhotoView.displayRect.centerY()
var event = event = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE, centerImageX, centerImageY, 0)
mPhotoView.dispatchTouchEvent(event)
但是当代码的这部分被执行时,比例尺还没有完成,因此移动无法发生,因为图像是全尺寸的,我们无法拖动全尺寸的图像。
所以为了解决这个问题,我删除了动画。
mPhotoView.setScale(5f, focalX, focalY, false)
另一种解决方案可以使用回调或协程来进行缩放和同时进行移动,因为我们将处于顺序代码部分。但是
AnimatedZoomRunnable
在另一个线程中,所以我们将一直执行到:
if (animate) {
mImageView.post(new AnimatedZoomRunnable(getScale(), scale, focalX, focalY));
}
并返回到协程的下一行。
所以实际上我没有更多的选择。也许可以放置一个按钮,使点能够居中于屏幕中央,就像在GoogleMap中一样,并在用户单击时执行“模拟拖动”?
或者有没有一种方法可以在AnimatedZoomRunnable
完成时得到通知?
如果您发现了有趣的东西,请告诉我。
scale = 1f
,在第二个scale = 4f
,我想通过编程将中心移动到x,y坐标。 - NickUnuchek