6
votes

Les images sont pixélisées lorsque l'écran est touché

Je construis un petit jeu dans HTML / JS sur Android. Je rencontre un problème sur mon désir HTC (Android 2.2). Lorsque je touche l'écran, toutes les images ont l'air pixélisée et ils obtiennent un non-pixelé lorsque le toucher se termine.

Voici une capture d'écran:

Entrez la description de l'image ici

sur la droite, c'est lorsque l'écran est touché. Quelqu'un peut-il m'aider à comprendre ce qui cause cette question?

Notes:

  • Aucun problème lors des animations Si l'écran n'est pas touché
  • Je n'ai pas ce problème sur mon LG 540 Android 2.1
  • Il semble que des images obtiennent un nombre restreint de couleurs quand il est touché
  • J'utilise PhoneGap

2 commentaires

C'est à cause de la carte graphique, votre téléphone LG n'a probablement aucune accélération 3D, mais le désir a une gamme basse. Vous ne pouvez pas vraiment l'aider afaik


Est-ce que ma réponse mise à jour ci-dessous aidait?


3 Réponses :


2
votes

Autant que je puisse dire, ce comportement "pixelated" est une optimisation faite pour le défilement (à Froyo et au-dessus). Si le rendu est simplifié, cela donne des choses comme l'animation de défilement de flûte nécessite moins de traitement.

Si vous avez besoin de fonctionnalités de navigateur complètes, je ne suis pas sûr que vous puissiez l'aider beaucoup. P>

Depuis que vous avez dit que vous faites une partie, cependant, je pourrais avoir une solution de contournement. J'espère que votre jeu n'a pas besoin de défilement (un écran complet), de sorte que l'optimisation du défilement n'est pas nécessaire. P>

J'ai fait un test simple avec une vision Web. À TAP, comme vous l'avez mentionné, le rendu est simplifié et que les choses se ressemblent un peu. Ensuite, une fois que quelque chose a cliqué sur quelque chose (la Vieille Web ne suit plus de défilement est en cours), les choses retournent à la normale. P>

J'ai modifié ma mise en page en remplaçant une vision Web, avec un Framelayout. Le Framelayout contient la vision WebView et un bouton invisible (sur le dessus). Ce bouton attrape tous les événements tactiles. Ensuite, je choisis de manière sélective quels types d'événements sur le WebView doivent avoir besoin et les transmettre à la vision Web. Si une touche de touche et de retouche se rapproche de près, sans mouvement entre entre entre Betweeen, il n'y a aucune raison de faire défiler, donc je n'ai vu aucun de ce comportement "pixelated". P>

parce que c'était le plus simple pour cela Exemple, j'ai choisi de détecter l'événement "MotionEvent.Action_UP", et quand c'est complet, j'envoie une première fois, de sorte qu'il simule un véritable clic. Vous pouvez certainement déclencher sur Action_Down, mais vous obtiendrez plus d'un de ceux-ci si l'utilisateur passe ou que quelque chose, et je voulais garder la logique ici simple. Vous pouvez personnaliser comme vous le voyez, et probablement avec suffisamment de travail, même permettre de faire défiler dans certains cas. J'espère que le code ci-dessous suffit pour relâcher ce que je pense fonctionne. P> xxx pré>

édition: Si vous ne voulez pas éditer la source de PhoneGap, vous pourrez peut-être faire quelque chose comme ce qui suit pour changer la mise en page de téléphonesGap ... il est non testé, mais semble que cela devrait fonctionner: P>

@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);
}


3 commentaires

Merci pour votre message, cependant, comme je l'ai dit que j'utilise PhoneGap et que mon application est construite à 99% avec JavaScript, j'ai juste une classe Java appelée App.java, vous pouvez le voir ici PhoneGap.com/start#android Pensez-vous toujours que votre solution pourrait fonctionner si je peux vous intégrer en quelque sorte que votre code?


J'espère que l'exemple supplémentaire ci-dessus aidera.


J'ai essayé, après avoir importé les classes manquantes, je reçois l'application en cours d'exécution, mais l'écran est noir et je n'ai aucun avertissement ni information qui pourrait m'aider. Thx pour votre aide quand même.



0
votes

Je suis dans ce même problème. Une chose que vous pourriez essayer est d'ajouter Android: Hardwareaccelerated = "True" au manifeste de votre application dans la balise. Cela m'a arrêté le problème pour moi, mais l'application entière semble-t-elle un peu plus pixelle dans l'ensemble sur mon appareil, cela pourrait donc ne pas être la meilleure solution.


0 commentaires

0
votes

Vérifiez deux fois si vos images ont la même taille dans CSS en pixels que les fichiers eux-mêmes. Il semble être en quelque sorte lié. Si je prends une image importante et que je redoubliez avec un CSS généré à charge de l'appareil, je vois le problème. Sinon, il n'est pas présenté ou non visible. Je ne sais pas si le problème initial a été corrigé dans les derniers Androids, mais je supporte toujours 2.3, j'espère donc que cela aide.


0 commentaires