Android 4.3 ImageView 方法 getImageMatrix() 的错误

2024-02-26

我最近升级到 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];
    ....
}

这适用于我拥有的 Android 4.1.2 和 4.2.2 设备

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

调试打印输出:

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]}

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

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

UPDATE:我已经检查过将日志从 4.2 更改为 4.3 http://developer.android.com/sdk/api_diff/18/changes.html,但是在 Matrix 类上方我看不到任何内容,或者与 View 类相关的任何内容。

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


我发现了我认为的问题所在。我查看了源代码ImageView并发现了setImageMatrix(Matrix matrix)将矩阵保存在与以下不同的字段中getImageMatrix()正在返回...

Android 4.4 图像视图

public void setImageMatrix(Matrix matrix) {
    // collaps null and identity to just null
    if (matrix != null && matrix.isIdentity()) {
        matrix = null;
    }

    // don't invalidate unless we're actually changing our matrix
    if (matrix == null && !mMatrix.isIdentity() ||
            matrix != null && !mMatrix.equals(matrix)) {
        mMatrix.set(matrix);
        configureBounds();
        invalidate();
    }
}

这里矩阵被存储在字段中mMatrix

public Matrix getImageMatrix() {
    if (mDrawMatrix == null) { //<-- should be mMatrix == null
        return new Matrix(Matrix.IDENTITY_MATRIX);
    }
    return mDrawMatrix; //<-- NOT THE RIGHT FIELD TO RETURN
}

While getImageMatrix()回报mDrawMatrix...

Android 4.1.2 图像视图

public Matrix getImageMatrix() {
    return mMatrix;
}

public void setImageMatrix(Matrix matrix) {
    // collaps null and identity to just null
    if (matrix != null && matrix.isIdentity()) {
        matrix = null;
    }

    // don't invalidate unless we're actually changing our matrix
    if (matrix == null && !mMatrix.isIdentity() ||
            matrix != null && !mMatrix.equals(matrix)) {
        mMatrix.set(matrix);
        configureBounds();
        invalidate();
    }
}

两种方法都使用相同的字段 - mMatrix

所以问题就在那里——突然之间getImageMatrix()返回错误的字段...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 4.3 ImageView 方法 getImageMatrix() 的错误 的相关文章

随机推荐

  • 在其他php文件中运行php代码的一部分

    我有一个 php 我有 b php 我只想从 a php 获取代码 echo date Y m d 我能怎么做 如果我理解正确的话 您只需要多行 代码块 中的一行 Funtions 您可以将代码划分为函数 然后根据需要调用它们 文件a ph
  • Silverlight 4 中组合框的转换器

    我正在尝试选择一个组合框项来设置数据库中保存的值 在数据库中 它保存为 I 或 D 转换器返回 直接 或 间接 ComboBox 有两个具有 Direct 和 Indirect 值的 ComboBoxItem 这是我认为可行的代码
  • Python 2.7、Appengine 数据存储和 Unicode

    所以今晚我读了很多关于 Unicode 的内容 因为我正在考虑切换到 Jinja2 它要求在应用程序中的任何地方都使用 Unicode 我想我很清楚如何处理它 但在开始编写我的应用程序之前我想听听这是否合理 处理外部文本输入 通过 html
  • 是否可以在 Python 中保存 folium 对象?

    我正在尝试编写一个使用 folium 来显示两个 gpx 痕迹的脚本 一个是已经计算出来的 临时跟踪 另一个是我每天更新的 实际跟踪 但是 从 GPX 跟踪生成 folium PolyLine 对象的脚本运行时间相当长 因此 我想保存包含此
  • 在没有空 div 的情况下进行叠加

    我从中学到了这个问题 https stackoverflow com questions 7642030 transparent foreground如何进行叠加 然而 接受的答案使用一个空的div which 克里斯 科伊尔 http c
  • java.lang.IllegalArgumentException:无效的 Region.Op - 仅在按钮后台失败中进行交集和差异

    android 按钮后台失败 当我尝试添加时 android background drawable roundedbutton 进入 xml
  • 如何从二级查询缓存中获取条目?

    In my grails http www grails org应用程序 我想显示所有区域的二级缓存当前条目 我的代码如下 def getCacheStats StatisticsImpl stats sessionFactory stat
  • mysql 排序字符串编号

    我有一个 varchar 类型的列 它存储许多不同的数字 举例来说 有 3 行 17 95 199 95 和 139 95 我如何将该字段排序为 mysql 中的数字 最快 最简单 使用 1 select from tbl order by
  • 设计问题:哪种做法更好?

    我有 3 个不同的 Web 服务器来处理用户数据 用户名 密码 电子邮件等 我分别有 3 个不同的 Web 服务调用 因此我创建了 3 个不同的类 它们调用相同的信息 getUsername setUsername getEmail set
  • ImportError:Ubuntu 11.04 服务器上的 django 项目中没有名为 mysql.base 的模块

    我正在按照中的步骤操作姜戈书 http www djangobook com en 2 0 chapter05 到了作者解释我如何建立一个 django 项目来使用数据库的部分 我选择了mysql 我的设置在settings py are
  • didReceiveRemoteNotification 不在后台工作

    我正在开发一个带有大量遗留代码的大型应用程序 目前 有一个实现 void application UIApplication application didReceiveRemoteNotification NSDictionary use
  • WriteProcessMemory/ReadProcessMemory 失败

    我尝试在应用程序中同时使用 ReadProcessMemory 和 WriteProcessMemory 但在这两种情况下我都得到一个结果 仅完成了 ReadProcessMemory 或 WriteProcessMemory 请求的一部分
  • 从 DRF 中的令牌字符串获取用户对象?

    我有一个令牌字符串Django REST 框架令牌身份验证 http www django rest framework org api guide authentication tokenauthentication 我需要获取相应的用户
  • 使用列表中的数据创建填充等值线图

    我的数据集由 csv 文件中的 3 列组成 前两列是地图坐标 第三列是在相应地图坐标的钻孔中发现的锌的百分比 我想创建一个等高线图来显示锌浓度随距离的变化 我能够找到的所有代码示例都使用矩阵形式的数据 而我的代码示例则位于列表中 我尝试了几
  • 如何在 System.Net.WebUtility.UrlEncode 中强制使用 %20 而不是 +

    我需要在类库程序集中对 URL 进行编码 但我不想在其中引用 System Web URL包含多个空格 https query yahooapis com v1 public yql q select from yahoo finance
  • 阻止应用程序在 bluestacks、youwave 和其他模拟器中运行

    我想阻止我的应用程序在 bluestacks youwave 等模拟器中运行 我是否可以阻止甚至识别用户是否在 bluestacks youwave 中运行 我的应用程序具有登录功能 所以它也使用服务器 所以我不介意在客户端 服务器端阻止用
  • Excel 2010 - 在工作簿中存储功能区自定义

    我是 Excel 功能区自定义新手 将功能区自定义存储在工作簿中的最直接的方法是什么 以便在工作簿关闭时自定义消失得无影无踪 要更改工作簿的功能区 您需要更改 xlsx 文件 内部 的 XML 文件 只不过是 zip 一切都在这里得到了很好
  • 当 required 不为 true 时,jQuery 验证 `valid()` 方法返回 0

    我正在使用jQuery 验证插件 http docs jquery com Plugins Validation我有一个带有班级的文本框digits强制它仅是数字 但不是必需的 当我在表单上调用 validate 时 它 工作正常 但如果我
  • 为什么Web Workers不允许修改dom

    I know web workers作为一个单独的线程工作UI thread但我不明白为什么他们不允许修改DOM 我的意思是你可以允许线程间通信并保持DOM数据位于共享空间并具有web workers线程修改DOM 为什么浏览器不允许这样做
  • Android 4.3 ImageView 方法 getImageMatrix() 的错误

    我最近升级到 Android 4 4 我的应用程序的某些功能令人惊讶地停止工作 我有这段代码用于初始化然后绘制我的自定义视图 基本思想是调整缩放级别 使整个视图适合屏幕 private void initAtZoomLevel float