2011-08-07 2 views
0

Comme un exercice, j'essaie d'étendre ImageButton pour ajouter quelques fonctionnalités que je pense serait utile. L'un, en particulier, est une ombre drow. J'ai frappé le mur proverbial avec celui-ci.Création d'une vue personnalisée: comment puis-je étendre une classe et accéder aux variables de membre privées de la classe de base?

Il me semble qu'une classe s'étendant BitmapDrawable est nécessaire. Cette classe contient un objet Paint utilisé pour dessiner le bitmap à l'écran. Si j'avais accès à cet objet Paint ... tout ce que je devrais faire, c'est appeler la méthode setShadowLayer() ... mais, hélas, c'est private. Il y a une méthode public, getPaint() qui retournera l'objet de peinture, mais toutes les modifications seraient inutiles sauf s'il y avait une méthode setPaint() correspondante. (Il n'y a pas.)

Actuellement, mon processus de pensée ressemble à quelque chose comme ce qui suit ...

  1. Créer une classe ShadowBitmapDrawable qui extends BitmapDrawable
  2. Au sein de cette classe, modifier en quelque sorte l'objet de PaintBitmapDrawable avec méthode setShadowLayer().
  3. Dans ma classe ImageButton personnalisée, appelez le setImageDrawable(Drawable d) et transmettez-le à mon objet ShadowBitmapDrawable.

L'étape 2 est le barrage routier. Que puis-je faire pour changer l'objet Paint de BitmapDrawable? Notez que j'ai ajouté mon processus de pensée seulement comme un indicateur de l'endroit où je suis dans ce problème. Je suis ouvert à d'autres suggestions.

Voici quelques références:



post-scriptum J'ai un mauvais pressentiment Je connais déjà la réponse que je vais recevoir, et je ne vais pas l'aimer. Je pensais que je posterais la question de toute façon et j'espère que tout ira pour le mieux. Que puis-je faire pour modifier l'objet Paint de BitmapDrawable?

Répondre

1

Clone BitmapDrawable dans votre projet, refactorisons dans votre propre paquet, faire le membre de données protected (ou fournir un poseur protected ou quelque chose), utilisez votre modification BitmapDrawable, et tester le diable hors de lui.

+0

Sons intéressants. Est-ce que je clone le référentiel Android, l'ajoute en tant que projet de bibliothèque dans eclipse, ajoute la bibliothèque à mon chemin de compilation et apporte mes modifications? Si non, pourriez-vous me diriger vers une ressource en ligne pour me lancer dans la bonne direction? – dfetter88

+0

"Dois-je cloner le dépôt Android, l'ajouter comme projet de bibliothèque dans eclipse, ajouter la bibliothèque à mon chemin de compilation et apporter mes modifications?" -- non. "Si non, pourriez-vous me diriger vers une ressource en ligne pour me lancer dans la bonne direction?" - cliquez sur le lien vers le code source de 'BitmapDrawable' dans votre message. Mettez en surbrillance le code source avec votre souris.Appuyez sur - pour le copier. Créez un nouveau fichier source Java dans votre projet. Collez le code que vous avez copié. Changez le nom du paquet en quelque chose d'autre que 'android.widget'. – CommonsWare

+0

Le seul problème est que la méthode 'inflate()' utilise 'Styleable' de' com.android.internal.R'. À ma connaissance, nous ne pouvons rien inclure de cette branche interne de l'arborescence des paquets. Aucune suggestion? – dfetter88

Questions connexes