随机调整大小的问题安卓平板电脑



我在安卓市场上有一个名为Speed Anatomy的应用程序。它已经工作了几个月,而且很稳定。现在,在安卓3.2推出像素缩放功能之前,我的(基于画布的(应用程序在一些带有黑色大边框的平板电脑上看起来没有缩放。我最终自己实现了像素缩放,因此它没有使用新的3.2机制。这相当容易

public void setSurfaceSize(int width, int height) {
  synchronized (mSurfaceHolder) {
   matrix.reset();
   float cancasScaleFactorY=height/(480.0f*scale);
   float cancasScaleFactorX=width/(320.0f*scale);
   float cancasScaleFactor=Math.min(cancasScaleFactorY, cancasScaleFactorX);
   matrix.postScale(cancasScaleFactor,cancasScaleFactor);
   ...
public void doDraw(Canvas canvas) {
  canvas.setMatrix(matrix);
  ...
boolean doTouchEvent(MotionEvent event) {
  float[] xy=new float[2];
  xy[0]=event.getX();
  xy[1]=event.getY();
  matrixI.set(matrix);
  matrixI.invert(matrixI);
  //revert touch coordinate to the original unscaled coordinate space. 
  matrixI.mapPoints(xy);
  ...

这适用于我测试过的所有设备,包括大多数平板电脑、3.0、3.1等模拟器。

上周,我收到一位用户的电子邮件,说他有一台安卓3.2的索尼S平板电脑,触摸坐标偏离了几厘米。由于我没有真正的平板电脑,我去了当地的斯台普斯商店,那里有多台安卓平板电脑。在安卓3.2的eee Transformer和安卓3.1的Galaxy tab 10.1上加载了我的应用程序,他们都完美地运行了我的程序。

所以我认为用户犯了一个错误,使用了我的旧版本应用程序(尽管他特别告诉我他有安卓市场的最新版本应用程序(。

昨天晚上,我在一场音乐会上,有一个来自加拿大电信运营商Telus的展位,上面展出了一些Galaxy Tabs 10.1。当我在等一些朋友,有一些时间消磨时间时,我在上面加载了我的应用程序,进行最后一次测试。

令我惊讶的是,触摸检测完全关闭了!基本上,它的行为就像在doDraw((上完成的缩放一样,也就是说,该应用程序是全屏和像素缩放的(除了用我的方法以高分辨率渲染的文本(,但触摸坐标没有缩放,也就是,我必须触摸左上角320x480的屏幕,否则触摸会在屏幕外注册。

所以我有两个Galaxy标签10.1,上面有Android 3.1,其中一个可以正常缩放,但另一个不能。我也有一个用户声称在安卓3.2的索尼S上有问题,我让它在3.2的变压器上正常工作。对于那些不能正常工作的矩阵运算,似乎存在问题。要么是间歇性的问题,要么是我没有想到的其他因素。哦,我只是想了一个事实,第二个GT10.1很可能是3g,因为它在外面的街道上,而其他的都是wifi,(我不知道用户的(,但我看不出这会影响矩阵转换,对吧?

在此之前,我从未遇到过Android Fragmentation的问题,事实上,它比处理不同的iOS版本更容易。

有什么线索可以引起这种情况,以及我如何解决这个问题吗?

如果你想尝试,有一个免费版本的应用程序。请告诉我它是否在你的设备上运行。

编辑:我只是想到了别的事。安卓市场可能偶尔会随机提供我的旧版本应用程序吗?我不确定,但我认为这个错误可能存在于市场上短暂发布的版本中。然而,它在一个多月前就已经修复并更新了。

经过数周的努力,我相信我已经找到了方法中问题的根源:

void android.graphics.Matrix.mapPoints(float[] dst, float[] src)

自:API 1级

将此矩阵应用于src指定的2D点阵列,然后将变换后的点写入由dst。这两个数组将它们的"点"表示为一对浮点[x,y] 。参数

dstdst点阵列(x,y对(

srcsrc点的数组(x,y对(

在某些设备上,此函数不能为srcdst使用相同的数组。我自己从来没能复制这种虫子。我通过更改代码中的内容、发布并询问一些报告过问题的用户是否已修复,盲目地调试了这个问题。

更改的每个实例:

matrix.mapPoints(xy,xy);

float[] tempxy = new float[2];
tempxy[0] = xy[0]; tempxy[1] = xy[1];
matrix.mapPoints(xy,tempxy);

似乎有固定的东西。

我发现另一个开发人员在这里报告了这个问题:

http://androidforums.com/developer-101/172225-android-graphics-matrix-mappoints-fail.html

这个开发提到它只发生在旧版本的Android上,而对我来说,当用户升级到Gingerbread时,它似乎是一种回归。虽然它不会影响所有的姜饼设备,因为我的Galaxy SII X从未受到影响。我无法在Android模拟器上复制它。

姜饼受到影响的另一个迹象是,最近随着它越来越受欢迎,用户越来越频繁地报告这个问题,我的应用程序的活跃安装数量开始下降。在我实施修复后,它又开始上升。

我希望这能帮助到别人。

Matrix invert_m = new Matrix();
matrixI.invert(invert_m);
invert_m.mapPoints(xy );

您需要一个Matrix的新实例来返回反转实例;

最新更新