7
votes

Voir.Invalidate () ne semble pas appeler view.ondraw ()

J'ai une bibliothèque de dessin et avec elle, j'ai une vue personnalisée. Lorsque des mises à jour doivent être effectuées, la bibliothèque appelle la méthode Invalidate () () de la vue. Puis la méthode Ondraw () est appelée et tout fonctionne tout simplement bien.

Cependant, lorsque j'ajoute l'attribut de upsdkversion = "14" à mon fichier androidmanifest.xml , cela cesse de fonctionner. N'est plus mon point de vue ONDRAW () Méthode d'être appelé.

Plus d'infos: Il semble que lorsque j'appelle invalidate () à la suite d'une touche enfonce mon application, la vue mise à jour comme prévu. En outre, il y a une animation à l'intérieur de ma bibliothèque qui fonctionne correctement. Donc, apparemment parfois, cela fonctionne correctement. Mais la plupart du temps, il ne se fait pas de se redresser. Existe-t-il d'un état qu'une vue personnalisée peut être en ce sens que le système d'exploitation ignorerait la redessinant après Invalidate () est appelé?


5 commentaires

Est-ce que vous l'appelez toujours à partir du fil de l'interface utilisateur? sinon, vous devez utiliser postinvalidate ().


J'ai essayé de changer l'invalidation de Postinvalidate juste pour vérifier cela, et le problème existe toujours.


L'accélération matérielle est-elle sur ou éteinte?


J'ai changé la Minssdkversion en 11. Donc, je pouvais expliquer explicitement l'attribut hardwareaccepté à "faux" et le problème existe toujours.


Réponse: Donc, il s'avère que je devais appeler invalider () sur une autre vue aussi. Je n'avais pas à faire cela avant la modification du fichier androidmanifest.xml .


3 Réponses :


6
votes

de Android 3.0, lors de l'utilisation de l'accélération matérielle, le dessin des vues est enregistré et stocké au GPU.

Alors, lorsque vous avez deux vues: a ci-dessus B, et vous appelez b.invalidate , b.ondraw sera appelé et enregistré sur le GPU, mais A.ondraw ne sera pas appelé car il est déjà enregistré!

Ceci est la différence du mode d'accélération non matérielle lorsque toutes les vues Ondraw été appelée.


0 commentaires

2
votes

Par documents officiels:

Toutefois, comme l'accélération matérielle n'est pas prise en charge pour toutes les opérations de dessin 2D, le tournant sur peut affecter certaines de vos applications utilisant des vues personnalisées ou des appels de dessin. Les problèmes se manifestent généralement comme des éléments invisibles, des exceptions ou des pixels rendu à tort. P>

Pour remédier à cela, Android vous donne la possibilité d'activer ou de désactiver l'accélération matérielle aux niveaux suivants: P>

Application forte> P>

<application android:hardwareAccelerated="true">
  <activity ... />
  <activity android:hardwareAccelerated="false" />
</application>


0 commentaires

2
votes

Cela semble être un bogue dans Android. Au lieu de invalider () essayez d'utiliser la méthode du même nom avec quatre paramètres: xxx

d'ailleurs, il est préférable d'invalider cette région que change. Passez à gauche, en haut, à droite, coordonnées inférieures de la région invalidée.


0 commentaires