随机调整大小问题Android平板电脑

时间:2011-09-25 16:47:55

标签: android matrix

我在Android Market上有一款名为Speed Anatomy的app。几个月来它一直在工作和稳定。现在,在Android 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等模拟器。

上周,我收到了一位用户发来的电子邮件,说他有一台带有Android 3.2平板电脑的索尼S,触摸坐标偏差几厘米。因为我没有真正的平板电脑,所以我去了我当地的Staples商店,他们在那里展示了多款Android平板电脑。在带有Android 3.2的eee Transformer和带有Android 3.1的Galaxy tab 10.1上加载了我的应用程序,它们都完美地运行了我的应用程序。

所以我认为用户犯了一个错误并使用了我的应用程序的旧版本(虽然他特别告诉我他从Android Market获得了我的应用程序的最新版本)。

昨天晚上我参加了一场音乐会,加拿大航空公司Telus有一个展位,展出了一些Galaxy Tabs 10.1。当我等待一些朋友并且有时间杀人时,我将我的应用程序加载到其上进行最后一次测试。

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

所以我有两个带有Android 3.1的Galaxy选项卡10.1,在一个上接触到正确的比例而不是另一个。我还有一个用户在索尼S上使用Android 3.2声称有问题,我在3.2的变压器上正常工作。对那些无法正常工作的矩阵运算似乎存在问题。这是一个间歇性的问题,还是有一些我没有想过的其他因素。哦,我只是想到第二个GT10.1很可能是3g,因为它在街上,而其他的是wifi,(我不知道用户的)但我看不到这个影响矩阵变换,对吗?

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

有什么可能导致这个以及我如何解决这个问题的线索?

如果您想要try it,可以使用该应用的免费版本。如果它适用于您的设备,请告诉我。

编辑:我只是想到别的东西。 Android Market有可能偶尔随机提供我的应用程序的旧版本吗?我不确定,但我认为这个错误可能存在于市场上短暂出现的版本中。它已经修复并在一个多月前更新了。

2 个答案:

答案 0 :(得分:3)

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

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

自:API Level 1

     

将此矩阵应用于src指定的2D点数组,和   将变换后的点写入指定的点数组中   DST。这两个数组代表它们的“点”作为浮动对[x,   Y]。   的参数

     

dst dst点数组(x,y对)

     

src src点数组(x,y对)

在某些设备上,此功能无法为 src dst 采用相同的数组。我自己从来没有能够重现这个bug。我通过更改代码中的内容,发布版本并询问已报告问题的用户是否已修复,盲目地调试了这一点。

更改:

的每个实例
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模拟器上重现它。

Gingerbread受到影响的另一个暗示是,最近其受欢迎程度越来越高,用户一直在更频繁地报告此问题,并且我的应用程序的有效安装数量开始下降。实施修复后,它又开始上升了。

我希望这有助于某人。

答案 1 :(得分:1)

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

您需要Matrix的新实例才能返回反转的实例;