我用的是库 https://github.com/chrisbanes/PhotoView
开始时我有位图和位图上的 x,y 点。
如何缩放图片到位图的x,y坐标?
int bitmapWidth = bitmap.getWidth();//2418
int bitmapHeight = bitmap.getHeight();//1889
float x = 1209f;
float y = 944f;
float targetScale = 4f;
attacher.setScale(targetScale, x,y, false);//it doesnt work
最佳答案
我遇到了同样的问题,终于解决了。
因此,为了实现这一点,我尝试了很多方法。首先,您需要将坐标转换为 PhotoView
:
int bitmapWidth = bitmap.getWidth();//2418
int bitmapHeight = bitmap.getHeight();//1889
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)
如果您不需要比例上的动画,则不需要更多。
如果要使用动画
我发现了这个问题,但还不能解决。这是我的想法。
那是行不通的,因为它在另一个线程中调用了动画。
//PhotoViewAttacher.java
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
完成时得到通知?
如果您发现了一些有趣的事情,请告诉我。
关于android - 如何缩放(缩放和移动)到 PhotoVIew 中位图的 x、y 坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48961771/