簡體   English   中英

如何在 PhotoVIew 中縮放(縮放和移動)位圖的 x、y 坐標?

[英]How to scale (zoom and move) to x,y coordinates of Bitmap in PhotoVIew?

我使用 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 坐標在此處輸入圖片說明

我遇到了同樣的問題,終於成功了。

所以為了實現這一點,我嘗試了很多東西。 首先,您需要將坐標轉換為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完成時獲得通知?

如果你發現了一些有趣的東西,請告訴我。

我找到了一個更簡單的解決方案。 它基於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);
        });
    }
}
    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
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM