【问题标题】:Android ImaveView not wrap zoomed ImageAndroid ImaveView 不包装缩放图像
【发布时间】:2016-10-06 01:54:15
【问题描述】:

我在可滚动视图中有一个 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 包裹所有缩放的图像?我尝试了很多方法,但仍然无法做到。

【问题讨论】:

    标签: android imageview zooming android-imageview scale


    【解决方案1】:

    如果我是对的,这就是正在发生的事情:您正在放大一个焦点,然后当您缩小另一个焦点时,您会在图像边缘看到空白区域,因为它不是居中。

    我必须在我的自定义捏缩放图像视图中处理这个问题。需要发生的是,需要根据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 的纵横比不匹配,所以有时您想要 em> 边界在内部,但在这种情况下,您必须进行调整以使图像居中。这只是很多数学问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 2011-06-13
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      相关资源
      最近更新 更多