2011-09-25 68 views
2

我在Android电子市场上有一款名为Speed Anatomy的应用程序。它已经工作并且稳定了好几个月。现在,在Android 3.2推出像素缩放功能之前,我的(基于画布)应用在一些带有大黑边的平板电脑上显得无法缩放。我最终自己实现了像素缩放,因此它不使用新的3.2机制。这是很容易随机调整大小问题Android平板电脑

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等

上周我收到一封电子邮件从一个用户,他说:索尼S拥有Android 3.2平板电脑,触摸坐标偏离了几厘米。由于我没有实际的平板电脑,我去了当地的Staples商店,他们在那里展示了多款Android平板电脑。我的应用程序加载了Android 3.2的eee Transformer和Android 3.1的Galaxy tab 10.1,他们都完美地运行了我的应用程序。

所以我觉得用户犯了一个错误,并使用了我的应用程序的旧版本(尽管他明确告诉我他有Android Market的我的应用程序的最新版本)。

昨天晚上我在一场音乐会上,加拿大运营商Telus和一些Galaxy Tabs 10.1展出了一个摊位。当我在等待一些朋友,并有一些时间杀死,我加载了我的应用程序来做最后一个测试。

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

所以我有两个银河标签10.1与Android 3.1上,触及一个正确的规模,但没有其他。我也有一个用户在索尼S上用Android 3.2声称有问题,并且我在3.2的变压器上正常工作。对那些无法正常工作的矩阵操作似乎存在问题。要么是间歇性问题,要么还有其他一些我没有想到的因素。哦,我刚才想到的事实是,第二台GT10.1可能是3g,因为它在大街上,而其他的是WiFi,(我不知道用户的),但我看不到这个影响矩阵变换,对吗?

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

任何线索可能会导致这种情况以及我如何解决问题?

如果你想try it有一个免费版本的应用程序。让我知道它是否适用于您的设备。

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

回答

3

斗争的周后,相信我已经发现该方法中的问题的来源:

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

自:API级别1

应用此矩阵以2D点阵列由src指定,并且 写入变换点到由 DST指定的点的阵列。两个阵列代表他们的“点”作为对浮[X, Y]的。 参数

DST的DST点(X,Y对)的阵列

SRC的SRC点(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

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

另一种暗示,即姜饼受到影响的是,最近其日益普及,用户已经报告更频繁的问题,我的应用程序的有效安装数量开始下降。在我执行修复程序后,它又开始上升。

我希望这可以帮助别人。

+1

我想我应该用mapPoints的单参数版本已。我不知道为什么我使用这两个参数版本。代码可能是从使用两个点的数组发展而来的,并且我没有想到切换到单个参数版本。我没有测试过单个参数版本,所以我不能确认它是否解决了这个问题。 –

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

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

相关问题