est-il un moyen de désactiver l'accélération matérielle uniquement pour android 4.0.3?
J'ai récemment tombé sur un problème avec android 4.0.3, où je suis l'Exception suivante dès que le démarrage de l'application (sur d'autres versions d'android, il fonctionne très bien):
java.lang.NullPointerException
at android.view.GLES20RecordingCanvas.drawPatch(GLES20RecordingCanvas.java:97)
at android.graphics.NinePatch.draw(NinePatch.java:125)
at android.graphics.drawable.NinePatchDrawable.draw(NinePatchDrawable.java:189)
at android.widget.ImageView.onDraw(ImageView.java:892)
at android.view.View.draw(View.java:10978)
at android.view.ViewGroup.drawChild(ViewGroup.java:2887)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.ViewGroup.drawChild(ViewGroup.java:2885)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10415)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597)
at android.view.View.getDisplayList(View.java:10380)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597)
at android.view.View.getDisplayList(View.java:10380)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597)
at android.view.View.getDisplayList(View.java:10380)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597)
at android.view.View.getDisplayList(View.java:10380)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:842)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:1910)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Cela est lié à avoir de l'accélération matérielle activée, dès que j'ai le désactiver sur le manifeste de l'application démarre, fonctionne très bien.
En faisant une recherche j'ai trouvé un journal (à l'intérieur que le doc de la recherche pour "drawPatch") sur une conversation de Romain Guy, où il discuter un peu de ce qui pourrait être à l'origine de ce, bien qu'il n'existe aucune solution de contournement ou d'un correctif proposé, je me demande si je dois désactiver l'accélération matérielle uniquement pour cette version d'android, ou si il y a une solution pour cela?
Merci pour votre temps.
source d'informationauteur Aldo Reyes
Vous devez vous connecter pour publier un commentaire.
Donc A-C le mentionne d'ailleurs dans son commentaire, mais permettez-moi de préciser.
Vous pouvez créer un booléen dans un fichier de valeurs et le coller dans le bon dossier de la version. Dans votre manifeste, en vertu de
Découvrez ce post: https://plus.google.com/+AndroidDevelopers/posts/DcsFABkyuYM.
Ressemble à de la cible values-v15/bools.xml
http://developer.android.com/reference/android/os/Build.VERSION_CODES.html#ICE_CREAM_SANDWICH_MR1
Il est actuellement impossible de désactiver l'accélération matérielle au niveau de la fenêtre par le code.
Ne l'activer. Je vous suggère de le Désactiver par défaut dans votre manifeste:
et puis l'activer pour toutes les autres versions:
Vous pouvez désactiver l'accélération matérielle pour un individu de vue au moment de l'exécution avec le code suivant:
Cette info est disponible dans Android - Le Contrôle De L'Accélération Matérielle
J'aime la réponse liée par @sgarman parce qu'il a un impact minime sur le code et est facilement maintenable. Juste pour s'étendre sur ce lien, voici ce que j'ai fait pour désactiver l'accélération matérielle uniquement pour Android v4.0.3 et seulement pour une certaine activité, et cela a fonctionné pour moi (n'oubliez pas d'ajouter le code xml en-têtes de la spécification de la version et de l'encodage pour les différents bool.xml fichiers, comme le wiki de l'éditeur ne m'a pas laissé le coller dans):
AndroidManifest.xml: identifier l'activité d'hébergement de la délinquance de la vue, et insérer cette activité:
chemin d'accès au fichier: res/values/bool.xml:
chemin d'accès au fichier: res/values-v14/bool.xml:
chemin d'accès au fichier: res/values-v16/bool.xml:
C'est un drôle de bug cause de l'accélération matérielle fonctionne (parfois). J'ai été chercher la réponse à cette depuis quelques jours. Il est documenté dans l'ICS, mais j'ai remarqué dans un de mes test de téléphones Samsung Galaxy S3 4.1.2 exécution la Plupart des gens suggèrent de désactiver l'accélération matérielle. Je n'ai pas envie de faire que la cause de l'accélération matérielle rend mes animations lisse et soyeux. Donc, ce que j'ai trouvé si je remplace draw() try et catch à l'exception de pointeur null le matériel fonctionnalités d'accélération de travail (la plupart du temps) et assez pour que vous ne remarquerez qu'ils ne sont pas de travail ou de jeter l'exception.
Dans mon cas, je faisais une vue personnalisée et avait coutume de dessin à faire. Le simple de vérifier la valeur null ne fonctionne pas (toile==null) c'est pourquoi ce bug est une douleur. Donc, ce que j'ai fait ceci:
ensuite silencieusement essayer et pris tous les NPE sur chaque tirage consolidés. Première fois que j'ai vu ce bug, j'ai entouré l'ensemble du tirage au sort() code dans un try et catch. Qui a travaillé pour la plupart des téléphones, mais sur le samsung s3 4.1.2 exécution qu'il provoque un scintillement. J'ai donc utilisé la méthode ci-dessus et ne silencieuse try catch sur chaque appel à someObject.tirage(mCanvas) et qui a résolu le problème en supprimant tous scintillement (disparité entre l'accélération matérielle du cache de la vue et de la nouvelle toile). Espérons que cette aide! Manière de mieux que de se tourner HWA off!