Случайные проблемы с изменением размера планшетов Android - PullRequest
2 голосов
/ 25 сентября 2011

У меня есть приложение в Android Market под названием Speed ​​Anatomy.Он работал и стабильно в течение нескольких месяцев.Теперь, до выхода 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 и т. Д.

На прошлой неделе я получил электронное письмо отПользователь сказал, что у него Sony S с планшетом на Android 3.2, а сенсорные координаты были на несколько сантиметров.Поскольку у меня нет реального планшета, я пошел в свой местный магазин Staples, где у них есть несколько планшетов Android на дисплее.Загрузил мое приложение на eee Transformer с Android 3.2 и Galaxy Tab 10.1 с Android 3.1, и они оба без проблем запустили мое приложение.

Поэтому я решил, что пользователь допустил ошибку и использовал старую версию моего приложения (хотя он специально сказал мне, что у него последняя версия моего приложения из Android Market).

Вчера вечером я был на концерте, и там был стенд от канадского оператора Telus с некоторыми Galaxy Tabs 10.1.Поскольку я ждал нескольких друзей и имел некоторое время, чтобы убить, я загрузил на него свои приложения, чтобы провести последний тест.

К моему удивлению, обнаружение касания было полностью отключено!По сути, он действовал так, как если бы масштабирование было выполнено в doDraw (), то есть приложение было полноэкранным и с пиксельным масштабированием (за исключением текста, который отображается в высоком разрешении с помощью моего метода), но координаты касания не были масштабированы, то естьпришлось касаться экрана в верхнем левом углу 320x480, иначе касания регистрировались бы за пределами экрана.

Таким образом, у меня есть две вкладки Galaxy 10.1 с Android 3.1 на ней, касания масштабируются правильно на одной, но не на другой.У меня также есть пользователь, который заявляет о проблемах на Sony S с Android 3.2, и он правильно работает на трансформаторе с 3.2.Кажется, есть проблема с матричными операциями на тех, которые работают неправильно.Либо это временная проблема, либо есть какой-то другой фактор, о котором я не задумывался.О, я просто подумал о том, что вполне вероятно, что второй GT10.1 был 3g, так как он был снаружи на улице, в то время как другие были Wi-Fi, (я не знаю о пользователе), но я не вижу этоговлияет на матричные преобразования, верно?

У меня никогда не было проблем с Android Fragmentation до этого, на самом деле это было проще, чем иметь дело с различными версиями iOS.

Любая подсказка, что может быть причиной, и как я могу исправитьпроблема?

Существует бесплатная версия приложения, если вы хотите попробовать .Дайте мне знать, если это работает на вашем устройстве.

РЕДАКТИРОВАТЬ: Я просто подумал о чем-то еще.Возможно ли, что Android Market время от времени случайно показывает старую версию моего приложения?Я не уверен, но я думаю, что эта ошибка могла существовать в версии, которая была кратко на рынке.Однако это было исправлено и обновлено более месяца назад.

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

После нескольких недель борьбы, я полагаю, я нашел источник проблемы в методе:

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

Поскольку: Уровень API 1

Примените эту матрицу кмассив 2D точек, заданных src, и записать преобразованные точки в массив точек, заданных dst.Два массива представляют свои «точки» как пары чисел с плавающей точкой [x, y]. Параметры

dst Массив точек dst (пары x, y)

src Массив точек src (x, y пары)

На некоторых устройствах эта функция не может принимать один и тот же массив для src и dst .Я сам никогда не был в состоянии воспроизвести ошибку.Я слепо отлаживал это, меняя код в моем коде, выпуская релизы и спрашивая некоторых пользователей, сообщивших о проблеме, если она была устранена.

Изменяя каждый экземпляр:

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 голос
/ 21 сентября 2012
Matrix invert_m = new Matrix();
matrixI.invert(invert_m);
invert_m.mapPoints(xy );

Вам нужен новый экземпляр Matrix для возврата инвертированного;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...