我在可滚动视图中有一个ImageView。
<jp.vuph.TwoDScrollView
android:id="@+id/two_d_scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white">
<RelativeLayout
android:id="@+id/layout_drawing"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image_view_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="matrix"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:adjustViewBounds="true"
android:contentDescription="@string/contentDescription"/>
</RelativeLayout>
</jp.vuph.TwoDScrollView>
当我缩放图像时,ImageView不会扭曲所有缩放的图像,因此我无法看到它的一部分。这是我的代码
private class ScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
d = mImageViewMain.getDrawable();
mScale *= detector.getScaleFactor();
float xDiff = initialFocalPoints[0] - currentFocalPoints[0];
float yDiff = initialFocalPoints[1] - currentFocalPoints[1];
matrix.setScale(mScale, mScale, currentFocalPoints[0], currentFocalPoints[1]);
matrix.postTranslate(xDiff, yDiff);
mImageViewMain.setImageMatrix(matrix);
return true;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
float startX = detector.getFocusX();
float startY = detector.getFocusY();
initialFocalPoints = new float[]{startX, startY};
Matrix inverseTransformMatrix = new Matrix();
if(matrix.invert(inverseTransformMatrix))
inverseTransformMatrix.mapPoints(currentFocalPoints, initialFocalPoints);
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
return;
}
是否可以使Imageview
包裹所有缩放的图像?我尝试了很多方法,但仍然无法做到。
答案 0 :(得分:0)
如果我是对的,这就是正在发生的事情:你正在放大一个焦点,然后当你缩小另一个焦点时,你会看到图像边缘周围的空白区域,因为它不是居中。
我必须在我的自定义捏拉缩放图像视图中处理此问题。需要发生的是需要根据ImageView
本身的边界检查转换后图像的边界,如果任何边界在ImageView
内,则需要添加额外的转换才能更正为空白。
为此,我使用Matrix.mapRect()
来预览图像转换的样子。
这些属性,因此您只需分配一次RectF
:
RectF imageRect = new RectF(0, 0, bitmap.getIntrinsicWidth(), bitmap.getIntrinsicHeight());
RectF viewRect = new RectF(0, 0, mImageViewMain.getWidth(), mImageViewMain.getHeight());
RectF transform = new RectF();
请注意,在测量完所有内容之前,您无法执行此操作。
在onScale()
和setScale()
之后postTranslate()
mImageViewMain.setImageMatrix(matrix);
中
matrix.mapRect(transform, imageRect); // dst, src
// for this code to work, your matrix scaleX/Y can never be less that 1.0
float xAdj = 0F;
float yAdj = 0F;
if (transform.left > 0) { // blank space on left
xAdj = - transform.left;
} else if (transform.right < mImageViewMain.getWidth()) { // on right
xAdj = mImageViewMain.getWidth() - transform.right;
}
if (transform.top > 0) { // blank space on top
yAdj = - transform.top;
} else if (transform.bottom < mImageViewMain.getHeight()) { // on bottom
yAdj = mImageViewMain.getHeight() - transform.bottom;
}
matrix.postScale(xAdj, yAdj);
那段代码可能不完全正确,但你明白了。使用matrix.mapRect()
查看您是否有空格,然后拨打matrix.postScale()
以修复空格。
我遗漏了代码的部分是你必须进行一些更花哨的计算,因为图像的宽高比可能与ImageView
的宽高比不匹配,所以有时你想要要在内部的边界,但在这种情况下,您必须进行调整,以使图像居中。这只是很多数学。