Obscurcir par programme un View android

J'ai trouvé comment changer l'opacité d'une View , mais je dois vraiment assombrir une View . Ma meilleure idée est de mettre un rectangle noir transparent sur celui-ci, puis d'augmenter lentement l'opacité du rectangle.

Connaissez-vous une façon plus agréable de le faire?

  • Mon application lance souvent android.view.WindowLeaked exception -
  • Conversion de la chaîne vers l'objet json android
  • Android - Télécharger tous les fichiers d'un dossier sur le serveur
  • Comment écrire une notification qui ne fait absolument rien lorsque vous cliquez dessus?
  • Android EditText, événement de présentation / masquage clavier doux?
  • Comment envoyer un événement du service à l'activité avec le bus d'événement Otto?
  •  public class Page07AnimationView extends ParentPageAnimationView { private final String TAG = this.getClass().getSimpleName(); private ImageView overlay; private int mAlpha = 0; public Page07AnimationView(Context context) { super(context); } public Page07AnimationView(Context context, AttributeSet attrs) { super(context, attrs); } protected void init() { overlay = new ImageView(mContext); overlay.setImageResource(R.drawable.black_background); overlay.setAlpha(0); overlay.setWillNotDraw(false); // make the PageAniSurfaceView focusable so it can handle events setFocusable(true); } protected void draw_bitmaps(Canvas canvas) { overlay.draw(canvas); update_bitmaps(); invalidate(); } public void update_bitmaps() { if(mAlpha < 250) { mAlpha += 10; overlay.setAlpha(mAlpha); } } } 

    Le code ci-dessus ne fait pas ce que j'avais espéré. Page07AnimationView est ajouté à FrameLayout sur la vue que je dois assombrir. R.drawable.black_background pointe vers une image png noir de 787px x 492px.

    J'ai ajouté overlay.setWillNotDraw(false); Mais cela n'a pas aidé. J'ai changé le premier setAlpha(0) à setAlpha(255) mais cela n'a pas aidé. J'ai supprimé complètement les appels setAlpha() , mais cela n'a pas aidé.

    Cette technique de base PageNNAnimationView ajouter une PageNNAnimationView a été PageNNAnimationView pour dessiner des Bitmaps , mais pas pour dessiner une ImageView overlay . (J'utiliserais Bitmaps , mais ils ne semblent pas avoir de composant alpha).

    Edit2: c'est le parent de la classe ci-dessus:

     public class ParentPageAnimationView extends View { private final String TAG = this.getClass().getSimpleName(); protected Context mContext; public ParentPageAnimationView(Context context) { super(context); mContext = context; init(); } public ParentPageAnimationView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; init(); } protected void init() { } protected void draw_bitmaps(Canvas canvas) { // will be overridden by child classes } @Override protected void onDraw(Canvas canvas) { if(this.getVisibility() == View.VISIBLE) { if(canvas != null) { draw_bitmaps(canvas); } } } public void update_bitmaps() { // will be overridden by child classes } public void elementStarted(PageElement _pageElement) { // Nothing in parent class } public void elementFinished(PageElement mElement) { // Nothing in parent class } } 

    7 Solutions collect form web for “Obscurcir par programme un View android”

    Je préfère le faire de la manière opposée – mettre un rectangle sombre derrière la vue et définir l'opacité de la vue. Cela permet d'économiser la peinture du rectangle lorsque la vue est 100% opaque.

    Dans le cas d'un ImageView, voici une façon d'y parvenir:

     imageView.setColorFilter(Color.rgb(123, 123, 123), android.graphics.PorterDuff.Mode.MULTIPLY); 

    Je ferais quelque chose comme ça:

     view.getBackground().setColorFilter(color, PorterDuff.Mode.DARKEN); 

    Utilisez une couleur noire avec un alpha comme 0x7f000000 pour un assombrissement typique.

    C'est plus concis et vous pouvez également assombrir la View avec un événement d'animation ou de défilement par exemple. Il suffit de définir Color.argb(alpha, 0, 0, 0) comme couleur et animé alpha , ou le modifier en fonction du décalage de défilement.

    C'est ainsi que j'ai fini par le faire. La clé était d'utiliser un Paint avec son alpha défini sur tout ce que je voulais.

     public class Page07AnimationView extends ParentPageAnimationView { private final String TAG = this.getClass().getSimpleName(); private Bitmap bitmap; private BitmapDrawable drawable; private ImageView overlay; private int which = -1; private long last_time; private Page07State state; private int mAlpha; private int maxAlpha; private Paint mPaint; private int _alpha_step; private int minAlpha; public enum Page07State { WAITING, DARKENING, DARKENED } public Page07AnimationView(Context context) { super(context); } public Page07AnimationView(Context context, AttributeSet attrs) { super(context, attrs); } protected void init() { minAlpha = 0; mAlpha = minAlpha; _alpha_step = 5; maxAlpha = 255; mPaint = new Paint(); mPaint.setAlpha(minAlpha); state = Page07State.WAITING; overlay = new ImageView(mContext); overlay.setImageResource(R.drawable.black_background); drawable = (BitmapDrawable) overlay.getDrawable(); bitmap = drawable.getBitmap(); last_time = 0; } protected void draw_bitmaps(Canvas canvas) { if(state != Page07State.WAITING) { DebugLog.d(TAG, "drawing " + Integer.toString(which)); canvas.drawBitmap(bitmap, 0, 0, mPaint); } update_bitmaps(); invalidate(); } public void update_bitmaps() { if(state == Page07State.DARKENING) { if(mAlpha < maxAlpha) { if(System.currentTimeMillis() > last_time + 12) { last_time = System.currentTimeMillis(); mAlpha += _alpha_step; mPaint.setAlpha(mAlpha); } } else { state = Page07State.DARKENED; } } } public void runAnimation() { state = Page07State.DARKENING; } } 

    Ajout à la réponse du développeur Android:

     imageView.setColorFilter(Color.rgb(123, 123, 123), android.graphics.PorterDuff.Mode.MULTIPLY); 

    Vous pouvez configurerColorFilter sur n'importe quelle vue comme ceci:

     GradientDrawable gd = (GradientDrawable) textView.getBackground(); gd.setColor(color); //you can also set BG color to a textview like this gd.setColorFilter(Color.rgb(123, 123, 123), android.graphics.PorterDuff.Mode.MULTIPLY); 

    Vous pourriez essayer d'utiliser l'animation Alpha comme celle-ci (peut-être sur le rectangle):

      Animation animation = new AlphaAnimation(0.0f, 1.0f); animation.setDuration(350); 

    Cela provoquerait un rectangle progressivement devenu opaque pendant 350 secondes …

    Vous devriez vérifier la réponse d'iPaulPro dans cette question . Vous devrez étendre ImageView et remplacer la méthode onDraw() .

    En fonction de ce que vous allez faire, la réponse d'Alexandru Cristescu est également valide, mais vous devez appeler setFillAter (vrai) pour que l'animation persiste après avoir terminé.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.