3

我使用 lib 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 在此处输入图像描述

scale = 4f 我想以程序方式将中心移动到 x,y 坐标 在此处输入图像描述

4

3 回答 3

1

我遇到了同样的问题,终于成功了。

所以为了实现这一点,我尝试了很多事情。首先,您需要将坐标转换为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完成时得到通知?

如果你发现了一些有趣的东西,请告诉我。

于 2019-07-23T14:08:45.373 回答
0

我找到了一个更简单的解决方案。它基于dispatchTouchEvent()方法。

public class YourActivity extends AppCompatActivity {

    private float mTapX;
    private float mTapY;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        mTapX = ev.getX();
        mTapY = ev.getY();
        return super.dispatchTouchEvent(ev);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        PhotoView photoView = findViewById(R.id.photo_view);
        mPhotoView.setImageResource(R.drawable.pic1);
        mPhotoView.setOnPhotoTapListener((view, x, y) -> {
            mPhotoView.setScale(photoView.getMaximumScale(), mTapX, mTapY, true);
        });
    }
}
于 2020-07-21T15:55:30.493 回答
0
    var photoView=findViewById(R.id.photoView)
    var zoomBtn=findViewById(R.id.zoomBtn)
    zoomBtn.setOnClickListener {
        if (photoView.scale!=photoView.minimumScale)
             photoView.scale = photoView.minimumScale
        else photoView.scale = photoView.maximumScale
    }
于 2020-10-04T11:56:33.430 回答