Android图像视图matrix比例+翻译

我正试图手动获取图像中的图像中心和适合的屏幕。 我需要做一个matrix(我会稍后dynamic地改变matrix转换)。

问题是我无法得到在视图中心的图像(规模是适当的)。 这里是代码:

// Compute the scale to choose (this works) float scaleX = (float) displayWidth / (float) imageWidth; float scaleY = (float) displayHeight / (float) imageHeight; float minScale = Math.min(scaleX, scaleY); // tx, ty should be the translation to take the image back to the screen center float tx = Math.max(0, 0.5f * ((float) displayWidth - (minScale * imageWidth))); float ty = Math.max(0, 0.5f * ((float) displayHeight - (minScale * imageHeight))); // Compute the matrix Matrix m = new Matrix(); m.reset(); // Middle of the image should be the scale pivot m.postScale(minScale, imageWidth/2, imageHeight/2); // Translate m.postTranslate(tx, ty); imageView.setImageMatrix(m); 

如果我不把图像的中心放在图像中心上,上面的代码可以工作(但是我需要稍后再做,所以我现在需要弄清楚公式)。

我认为做下面的事情会纠正这个问题,但是图像仍然是偏移的(向下和向右)。

 tx += 0.5*imageWidth*minScale; ty += 0.5*imageHeight*minScale; 

我有一些值: – 图像:200×133 – 显示:800×480 – minScale:2.4 – 图像的最后左上angular:100,67(应该是17,0)

Solutions Collecting From Web of "Android图像视图matrix比例+翻译"

有一个方便的方法称为Matrix.setRectToRect(RectF,RectF,ScaleToFit)来帮助你在这里。

 Matrix m = imageView.getImageMatrix(); RectF drawableRect = new RectF(0, 0, imageWidth, imageHeight); RectF viewRect = new RectF(0, 0, imageView.getWidth(), imageView.getHeight()); m.setRectToRect(drawableRect, viewRect, Matrix.ScaleToFit.CENTER); imageView.setImageMatrix(m); 

这应该将matrixm设置为具有缩放和翻译值的组合,这些值用于显示可绘制的居中和适合ImageView小部件。

下面是我如何解决我的问题,使用matrix(在另一个答案joakime要求):

 private void setImageTransformation(float tx, float ty, float scale) { savedMatrix.reset(); savedMatrix.postTranslate(-imageWidth / 2f, -imageHeight / 2f); savedMatrix.postScale(scale, scale); savedMatrix.postTranslate(tx, ty); imageView.setImageMatrix(savedMatrix); } public void resetImageMatrix() { if (!isImageLoaded()) return; imageWidth = imageView.getDrawable().getIntrinsicWidth(); imageHeight = imageView.getDrawable().getIntrinsicHeight(); float scaleX = (float) displayWidth / (float) imageWidth; float scaleY = (float) displayHeight / (float) imageHeight; minScale = Math.min(scaleX, scaleY); maxScale = 2.5f * minScale; initialTranslation.set( Math.max(0, minScale * imageWidth / 2f + 0.5f * (displayWidth - (minScale * imageWidth))), Math.max(0, minScale * imageHeight / 2f + 0.5f * (displayHeight - (minScale * imageHeight)))); currentScale = minScale; currentTranslation.set(initialTranslation); initialImageRect.set(0, 0, imageWidth, imageHeight); setImageTransformation(initialTranslation.x, initialTranslation.y, minScale); } 

我在这里有一点欺骗,因为捏是不是真正居中在用户手指之间,这在我的情况是可以接受的。

或者使用

  m.postScale(minScale, minScale); //keep aspect ratio float tx = (getWidth() - bitmap1.getWidth()* scale) * 0.5f ; float ty = (getHeight() - bitmap1.getHeight()* scale) * 0.5f ; matrix.postTranslate(tx, ty ); 

getWidth是你的imageView的宽度。 为我完美的作品

嘿,我有同样的问题,你是如此接近! 这是一个操作问题的顺序,至less对我来说。 以下为我工作:

 tx = (width - imgWidth) * 0.5f * scale;