我在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有可能偶尔随机提供我的应用程序的旧版本吗?我不确定,但我认为这个错误可能存在于市场上短暂出现的版本中。它已经修复并在一个多月前更新了。答案 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
的新实例才能返回反转的实例;