Android 4.3 ImageView方法的错误getImageMatrix()

kbu*_*ach 6 android android-custom-view android-4.3-jelly-bean android-4.4-kitkat

我最近升级到Android 4.4,我的应用程序的某些功能令人惊讶地停止了工作.

我有这个代码用于初始化然后绘制我的自定义视图.基本思路是调整缩放级别,使整个视图适合屏幕.

private void initAtZoomLevel(float zoomLevel){
    ....
    Matrix transformMatrix = new Matrix();
    transformMatrix.setScale(initialZoomLevel, initialZoomLevel);
    float yTransCenter = (screenHeight - mapHeight)/2.0f;
    setImageMatrix(transformMatrix);
}

protected void onDraw(Canvas canvas){

    super.onDraw(canvas);
    float[] values = new float[9];
    getImageMatrix().getValues(values);
    scaleFactor = values[0];
    ....
}
Run Code Online (Sandbox Code Playgroud)

这是在ANDROID 4.1.2和4.2.2设备上工作的

但是在Android 4.4/4.3上getImageMatrix().getValues(values)停止了工作! 它返回一个单位矩阵,而不是我在app启动时期望的变换矩阵!

DEBUG PRINT-OUT:

4.1.2:@ setImageMatrix(transformMatrix): transformMatrix = Matrix{[0.025122833, 0.0, 0.0][0.0, 0.025122833, 566.5][0.0, 0.0, 1.0]}

@ getImageMatrix().getValues(values):transformMatrix = Matrix{[0.025122833, 0.0, 0.0][0.0, 0.025122833, 566.5][0.0, 0.0, 1.0]}

4.4:@ setImageMatrix(transformMatrix): transformMatrix = Matrix{[0.025122833, 0.0, 0.0][0.0, 0.025122833, 553.0][0.0, 0.0, 1.0]}

@ getImageMatrix().getValues(values):transformMatrix = Matrix{[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]}

我环顾四周,似乎无法找到任何相关的文档.不知何故,我的视图的图像矩阵正在重置; 安卓4.4改变了我们应该这样做的方式吗?还有其他人遇到过这个问题吗?

注意:问题似乎源自Android 4.3 - 在模拟器上运行时会出现同样的问题

更新:我已经检查了从4.2到4.3更改日志,但是我在矩阵类上面或者与View类相关的任何内容上都没有任何内容.

更新2:我的捏缩放也不起作用,使用相同的setImageMatrix()方法 - 它显然没有坚持,因为没有发生在getImageMatrix().getValues()

kbu*_*ach 0

虽然我之前的回答确实概述了总体问题,但实际上它可能不是一个错误。正如通用假日名称所指出的,mDrawMatrix 应该mMatrix在方法中设置为configureBounds()- 这将消除这个问题/错误/任何东西。

然而,我必须添加几行代码才能configureBounds()实际工作:

private void configureBounds() {
    if (mDrawable == null || !mHaveFrame) {
        return;
    }

    int dwidth = mDrawableWidth;
    int dheight = mDrawableHeight;

    ...

    if (dwidth <= 0 || dheight <= 0 || ScaleType.FIT_XY == mScaleType) {
        /* If the drawable has no intrinsic size, or we're told to
            scaletofit, then we just fill our entire view.
        */
        mDrawable.setBounds(0, 0, vwidth, vheight);
        mDrawMatrix = null;
    } else {
             //here's the where mDrawMatrix == mMatrix IF using scaleType.MATRIX
             ...
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,为了真正让它按照我期望的 4.2 及以下版本工作,您需要确保:

  1. mDrawable != null。这以前不是问题,但就我而言,我没有使用可绘制对象,所以一切都失败了(该return语句立即被击中)
  2. 'dwidth >0 && dheight >0。如果你有一个真正的可绘制对象,这不是问题,但就像我说的,我没有。
  3. mHaveFrame = true。我不知道这是什么——从未使用过它。将其设置为 true 的唯一方法是调用setFrame(int, int, int, int).

为了让我的缩放代码再次工作,我必须添加以下内容:

 //potentially a fix for the "bug" that appears in Android 4.3+
 //mDrawable cannot be null anymore for getImageMatrix to work---stupid
 //therefore the imageview class MUST set a drawable for matrix scaling to work
 //so here I am using a "empty" drawable to get around this
 ShapeDrawable fakeDrawable = new ShapeDrawable(); //so mDrawable != null
 fakeDrawable.setIntrinsicHeight(1); //so dwidth and dheight are > 0
 fakeDrawable.setIntrinsicWidth(1);

 setImageDrawable(fakeDrawable);

 setFrame(0, 0, viewWidth, viewHeight); //setting a frame so mHaveFrame = true
Run Code Online (Sandbox Code Playgroud)

哎呀