我使用lib https://github.com/chrisbanes/PhotoView
一开始我有Bitmap和x,y指向Bitmap。
如何将图像缩放并缩放到位图的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
答案 0 :(得分: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
完成时有没有办法得到通知?
如果您发现有趣的东西,请告诉我。
答案 1 :(得分: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);
});
}
}
答案 2 :(得分: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
}