Extension du cours Android View pour ajouter un dropshadow
Je veux prolonger LinearLayout
de sorte que lorsque ma mise en page est dessinée une ombre portée est ajouté en dessous. J'ai joué autour de substitution de la onDraw
méthode, mais je suis un peu perdu. Toute aide ou même de la bibliothèque suggestions seraient grandement appréciés!
Voici un exemple de l'ombre portée de vue, je suis en train de réaliser. Je ne crois pas que je peux utiliser un patch neuf ici parce que j'ai besoin le contenu de la vue à l'intérieur de la boîte blanche. Cela signifierait que j'aurais besoin de connaître la distance entre la frontière et la fin de la PNG. Cependant, je crois d'écran différent des densités de dire que cette distance sera toujours le même PX mais pas le même DP.
Donc, pour être clair j'ai besoin d'un moyen d'étendre la classe de la Vue, de sorte qu'une ombre portée est établi en vertu lorsqu'il est ajouté à un modèle. Pas de XML ou 9Patch des solutions s'il vous plaît.
Grâce
Jack
source d'informationauteur JackMahoney
Vous devez vous connecter pour publier un commentaire.
Je suis d'accord avec les commentaires sur votre question: programmatiques dropshadow effet est un mauvais choix, et vous pourriez obtenir le même effet avec un simple 9patch (ou un ensemble d'entre eux) comme indiqué ici.
BTW j'ai été trop curieux, et j'ai fini avec le piratage d'une solution après le travail.
Le code présenté est un test, et doit être conçu comme une simple preuve de concept (donc merci de ne pas downvote). Certaines des opérations indiquées sont assez cheret peut un sérieux impact sur les performances (Il existe de nombreux exemples autour, regarder iciici pour vous faire une idée). Il devrait être un la solution de dernier recours seulement pour un composant montré une fois-dans-un-tout.
Tout d'abord afin d'obtenir programmatique de l'ombre portée que vous avez à traiter avec
Paint.setShadowLayer(...)
comme indiqué ici. Fondamentalement, vous devez définir un ombre de la couche de pour laPaint
objet utilisé pour dessiner à l'Canvas
de votre vue personnalisée. Malheureusement, vous ne pouvez pas utiliser unPaint
objet pour dessiner un NinePatchDrawable, donc vous devez le convertir en une image Bitmap (1er bloc). En outre, il semble que l'ombre de calques ne peut pas fonctionner correctement avec ARGB_8888 images, de sorte que la seule façon que j'ai trouvée afin d'obtenir une bonne ombre a été de dessiner le masque alpha de la NinePatchDrawable (2e hack) juste en dessous de lui-même.Voici un couple de sshots (testé sur Android 2.3.3@mdpi et 4.2.2@xhdpi)
Edit: juste pour être complet, j'ai attaché les 9patch utilisé dans le test (placé dans
res/drawable/mdpi
)D'essayer cette technique.
container_dropshadow.xml
`
Alors vous pouvez l'appliquer à un fichier XML de mise en page comme un arrière-plan comme
LinearLayout android:background="@drawable/container_dropshadow"
`
C'est la façon la plus simple de l'ombre de toute chose mise en page, bouton, etc
background.xml
dans votre main.xml