Изображения касаются экрана при касании экрана - PullRequest
6 голосов
/ 28 января 2012

Я создаю небольшую игру в HTML / JS для Android.У меня проблема с HTC Desire (Android 2.2).Когда я касаюсь экрана, все изображения выглядят пикселизированными, и они не пикселируются, когда касание заканчивается.

Вот снимок экрана:

enter image description here

НаПравильно, когда к экрану прикасаются.Может ли кто-нибудь помочь мне выяснить причину этой проблемы?

Примечания:

  • Нет проблем во время анимации, если к экрану не прикасаться
  • У меня нетэта проблема на моем LG 540 Android 2.1
  • кажется, что изображения получают ограниченное количество цветов при касании
  • Я использую Phonegap

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012

Насколько я могу судить, это «пиксельное» поведение - это оптимизация, сделанная для прокрутки (в Froyo и выше). Если рендеринг упрощен, то такие вещи, как анимация прокрутки, требуют меньше обработки.

Если вам нужна полная функциональность браузера, я не уверен, что вы сможете ей сильно помочь.

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

Я провел простой тест с WebView. На касании, как вы упомянули, рендеринг упрощается, и все выглядит немного не так. Затем, когда что-то нажимается (WebView знает, что прокрутка больше не происходит), все возвращается в норму.

Я изменил свой макет, заменив WebView на FrameLayout. FrameLayout содержит WebView и невидимую кнопку (сверху). Эта кнопка захватывает все сенсорные события. Затем я выборочно выбираю, какие типы событий должны быть в WebView, и передаю их в WebView. Если касание и касание происходят близко друг к другу, без движения в промежутке между ними, нет никакой причины для прокрутки, поэтому я не видел ни одного из этого «пиксельного» поведения.

Поскольку для этого примера это было проще всего, я решил обнаружить событие «MotionEvent.ACTION_UP», и, когда оно завершено, я сначала отправляю сигнал вниз, чтобы он имитировал реальный щелчок. Вы, конечно, можете активировать ACTION_DOWN, но вы получите более одного из них, если пользователь проведет пальцем или что-то в этом роде, и я хотел бы сохранить здесь простую логику. Вы можете настроить его так, как считаете нужным, и, возможно, при достаточной работе даже включить прокрутку в некоторых случаях. Надеюсь, приведенного ниже кода достаточно, чтобы передать то, что, на мой взгляд, работает.

WebView wv = new WebView(this);
View dummyView = new Button(this);
dummyView.setBackgroundColor(0x00000000);
dummyView.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            MotionEvent down = MotionEvent.obtain(100, 100,
                MotionEvent.ACTION_DOWN, event.getX(),
                event.getY(), 0);
            wv.onTouchEvent(down);
            wv.onTouchEvent(event);
        }
        return false;
    }
});
FrameLayout fl = new FrameLayout(this);
fl.addView(wv);
fl.addView(dummyView);
topLayout.addView(fl);

EDIT: Если вы не хотите редактировать исходный код PhoneGap, вы можете сделать что-то вроде следующего, чтобы изменить макет PhoneGap ... Он не проверен, но, похоже, должен работать:

@Override
public void onCreate(Bundle arg0) {
    super.onCreate(arg0);
    super.loadUrl("file:///android_asset/www/index.html");
    // Get the "root" view from PhoneGap
    LinearLayout droidGapRoot = super.root;
    // Create a new "root" that we can use.
    final LinearLayout newRoot = new LinearLayout(this);
    for (int i = 0; i < droidGapRoot.getChildCount(); i++) {
        // Move all views from phoneGap's LinearLayout to ours.
        View moveMe = droidGapRoot.getChildAt(i);
        droidGapRoot.removeView(moveMe);
        newRoot.addView(moveMe);
    }
    // Create an invisible button to overlay all other views, and pass
    // clicks through.
    View dummyView = new Button(this);
    dummyView.setBackgroundColor(0x00000000);
    dummyView.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // Only pass "UP" events to the specific view we care about, but
            // be sure to simulate a valid "DOWN" press first, so that the
            // click makes sense.
            if (event.getAction() == MotionEvent.ACTION_UP) {
                MotionEvent down = MotionEvent.obtain(100, 100,
                        MotionEvent.ACTION_DOWN, event.getX(),
                        event.getY(), 0);
                newRoot.onTouchEvent(down);
                newRoot.onTouchEvent(event);
            }
            return false;
        }
    });
    // Layer the views properly
    FrameLayout frameLayout = new FrameLayout(this);
    frameLayout.addView(newRoot);
    frameLayout.addView(dummyView);
    // Add our new customized layout back to the PhoneGap "root" view.
    droidGapRoot.addView(frameLayout);
}
0 голосов
/ 18 октября 2013

Проверьте дважды, имеют ли ваши изображения тот же размер в пикселях, что и сами файлы. Кажется, это как-то связано. Если я беру большое изображение и масштабирую его с помощью сгенерированного CSS, зависящего от устройства, я вижу проблему. В противном случае он либо не представлен, либо не виден. Не уверен, что исходная проблема была исправлена ​​в последних версиях Android, но я все еще поддерживаю 2.3, поэтому надеюсь, что это поможет.

0 голосов
/ 14 ноября 2012

Я сталкиваюсь с этой же проблемой. Вы можете попробовать добавить android: hardwareAccelerated = "true" в манифест вашего приложения в теге. Это остановило проблему для меня, однако теперь все приложение выглядит немного более точечно в целом на моем устройстве, поэтому это может быть не лучшим решением.

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