La création de forme d'anneau dans le code Android
J'ai la forme suivante XML:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:a="http://schemas.android.com/apk/res/android"
a:shape="ring"
a:innerRadiusRatio="3"
a:thicknessRatio="8"
a:useLevel="false">
<!-- some other stuff goes here -->
</gradient>
</shape>
Je voudrais utiliser le code au lieu de créer cette forme, étant donné que certaines choses doivent être calculées à la volée avant que je le fais, donc statique de mise en page prédéfinis ne coupe pas.
Je suis nouveau sur Android et n'arrive pas à comprendre comment XML se traduit par un code, et il n'y a pas RingShape classe héritant de Forme.
En plus de répondre juste à cette question, si il y a un guide quelque part que les détails de la relation entre le XML et le code Java et XML est traitée afin d'arriver sur l'écran, je vous serais reconnaissant un lien trop. Merci.
- Un bon point de départ pour la relation entre le xml et le code Java, serait à l'origine de LayoutInflater - > grepcode.com/file/repository.grepcode.com/java/ext/...
- cheers
- Pouvez-vous expliquer pourquoi avez-vous besoin de faire cela? Ce résultat yo voulez obtenir?
- Je veux dessiner un anneau avec changement dynamique de balayage de gradient.
Vous devez vous connecter pour publier un commentaire.
Anneau et les autres formes sont
GradientDrawables
.Si vous regardez le code source pour GradientDrawable, vous verrez que ça ressemble à certaines propriétés (comme innerRadius) peut seulement être défini par XML... ils ne sont pas exposés à travers des méthodes accesseurs. L'état est également unhelpfully privé de la classe, sous-classement est d'aucune aide non plus.
android.graphics.LinearGradient
? Comme un autre, (un peu) sans rapport avec pas, je trouve que si bizarre que Google aurait choisi de ne pas autoriser les développeurs à faire dans le code ce que vous pouvez faire en XML.android.graphics.SweepGradient
et le dessiner sur uneCanvas
de la création de l'anneau de moi-même? Agaçant, encore, que la fonctionnalité est joliment emballés dans un haut niveau d'API déjà, mais seulement exposés via XML.Reuben l'a déjà souligné, la plupart la plupart des observations utiles, donc je vais juste me concentrer sur la mise en œuvre du côté de l'histoire. Il y a plusieurs approches à l'aide de la réflexion qui va probablement vous donner ce que vous cherchez.
Première est de (ab)utiliser la GradientDrawable constructeur qui prend un GradientState de référence. Malheureusement, ce dernier est une dernière sous-classe avec un paquet de la visibilité, de sorte que vous ne pouvez pas obtenir facilement l'accès. Pour l'utiliser, vous avez besoin de plonger plus loin dans l'utilisation de la réflexion ou de l'imiter sa fonctionnalité dans votre propre code.
Deuxième approche consiste à utiliser la réflexion pour obtenir la variable membre privée mGradientState, qui, heureusement, a un getter dans le formulaire de
getConstantState()
. Cela vous donnera la ConstantState, qui au moment de l'exécution est vraiment un GradientState et par conséquent, nous pouvons utiliser la réflexion pour l'accès de ses membres et de les modifier au moment de l'exécution.Afin de soutenir les déclarations ci-dessus, voici un peu de base de la mise en œuvre de créer une bague en forme de drawable de code:
RingDrawable.java
Ci-dessus peuvent être utilisés comme suit pour créer une RingDrawable de code et l'afficher dans un standard de l'ImageView.
Cela fera apparaître un simple, opaque bleu anneau dans le ImageView (10 unités de rayon intérieur, 20 unités d'épaisseur). Vous aurez besoin pour vous assurer de ne pas mettre l'ImageView la largeur et la hauteur de
wrap_content
, sauf si vous les ajoutezring.setSize(width, height)
de code ci-dessus dans l'ordre pour qu'il s'affiche.Espère que cela vous aide en quelque sorte.
Vous pouvez faire quelque chose comme ceci:
Il est possible de le faire à partir de code:
Pour moi, il fonctionne comme suit: (aussi pour la version Android > sucette)