2017-08-10 1 views
0

Je souhaite créer une ombre portée personnalisée différente de la vue en cours de déplacement (en fait, c'est une version modifiée de la vue qui est déplacée).Modification de l'ombre du drag sans modification de la vue du drag-start

Je peux passer une vue au constructeur View.DragShadowBuilder comme ceci:

View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(myView); 

Le problème est tout changement que je fais à myView affecte également la vue en cours de déplacement (et c'est que des vues ne peuvent pas être clonés). How do I clone a View?

Sinon, je peux étendre View.DragShadowBuilder et dessiner ma vue personnalisée avec un bitmap dans la méthode onDraw(Canvas canvas) fournie. Mais j'ai du mal à générer une ombre en premier lieu (je suppose que c'est une approche valable).

Inversement, est-il possible de créer une ombre personnalisée à partir d'une vue attachée à l'écran? Tout pointeur ou solution serait très utile.

Mes recherches jusqu'à présent n'a pas donné de résultats utiles: How to create a custom drag shadow? How to show custom DragShadow instead of ListViewFragment row?

Répondre

0

Permanence propre question. L'argument passé à View.DragShadowBuilder(View view) doit être visible (et attaché à un conteneur de disposition approprié). Une vue agrandie de xml ou une vue créée dynamiquement qui n'est attachée à aucun ViewGroup/View ne génère aucune ombre portée.

La clé ici est d'étendre la classe View.DragShadowBuilder et remplacer la méthode onDrawShadow(Canvas canvas)

@Override 
onDrawShadow(Canvas canvas) { 
    final View view = mView.get(); 

    /* give drag shadow a blue background, this also changes the drag-start view 
    attached to the screen */ 
    view.setBackgroundColor(Color.BLUE); 

    view.draw(canvas); 

    /* bring the drag-start view back to its original state (does not affect drag-shadow) */ 
    view.setBackgroundColor(Color.TRANSPARENT); 
} 

Si votre exigence est de changer l'ombre de glisser de sorte qu'il semble différent du point de vue drag-start attaché à l'écran, modifier le avant d'appeler le view.draw(canvas) et de le ramener à son état d'origine après la méthode view.draw(canvas).

Cela fait le travail, mais se présente comme un hack. Pour résumer la clé ici est de manipuler la vue avant la méthode draw(canvas) et le réinitialiser à son état d'origine après la même méthode. J'espère que c'était utile.