android - 如何缩放(缩放和移动)到 PhotoVIew 中位图的 x、y 坐标?

标签 android android-bitmap android-photoview

我用的是库 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

规模= 1f enter image description here

scale = 4f 我想通过程序将中心移动到 x,y 坐标 enter image description here

最佳答案

我遇到了同样的问题,终于解决了。

因此,为了实现这一点,我尝试了很多方法。首先,您需要将坐标转换为 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/

相关文章:

android - 任务 ':app:compileDebugKotlin'的执行失败。 >内部编译器错误。请参阅日志以获取更多详细信息

java - 在 Camera Intent 后更新 RecyclerView.Adapter

android - 在 GridView 中显示位图图像

java - Android 在 Canvas 上操作图像 - 使用触摸、移动、放大/缩小、缩放

android - ViewPager + Picasso + 来自 URL 字符串数组的多个图像

android - 无法在 list 文件中注册广播接收器

Android:有没有办法获取 RemoteViews 对象的大小?

android - 如何使位图适合圆角正方形?

android - android位图库中的getWidth()函数不返回真实图像高度

xamarin - 可以在 Xamarin PhotoView 组件中调整初始图像吗?