2015-10-14 1 views
4

J'ai besoin d'une vue d'image personnalisée qui dessine d'abord certaines formes derrière l'image avant de dessiner l'image elle-même en utilisant la même "Mise à l'échelle" appliquée à l'image elle-même. Tout fonctionne très bien, sauf que j'ai un AlphaAnimation pour fondre le ImageView personnalisé. Il estompe la partie BitmapDrawable mais pas ma forme. La forme est dessinée en pleine opacité à tout moment. J'ai essayé de mettre l'alpha de la peinture que j'utilise à la getAlpha de la vue mais sans chance. Voici ma fonction onDraw dans ma classe ImageView personnalisée:Dessiner un rectangle derrière ImageView non animé

@Override 
protected void onDraw(Canvas canvas) { 
    float[] f = new float[9]; 
    getImageMatrix().getValues(f); 

    final float scaleX = f[Matrix.MSCALE_X]; 
    final float scaleY = f[Matrix.MSCALE_Y]; 

    final Drawable d = getDrawable(); 
    final int origW = d.getIntrinsicWidth(); 
    final int origH = d.getIntrinsicHeight(); 

    final int actW = Math.round(origW * scaleX); 
    final int actH = Math.round(origH * scaleY); 

    canvas.drawRect(Math.max((getWidth() - actW)/2, 0) + 1, Math.max((getHeight() - actH)/2, 0) + 1, Math.max((getWidth() - actW)/2, 0) + actW - 1, Math.max((getHeight() - actH)/2, 0) + actH - 1, paint); 
    super.onDraw(canvas); 
} 
+0

Final Dessinable d = getDrawable(); d.setAlpha (1); pour votre forme dessinable –

+0

Cela ne produit aucun changement. J'ai trouvé que onDraw() est seulement appelé une fois et pas dans chaque image de l'animation –

Répondre

1

Une solution rapide pour votre problème sera pour ajouter l'affichage personnalisé à un conteneur de vue, puis simplement animer le conteneur à la place.

+0

Ceci est un moyen simple de le faire fonctionner correctement grâce à. –

0

Ceci est la source code version: 5.0.0_r1, la méthode onDraw de imageView

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    if (mDrawable == null) { 
     return; // couldn't resolve the URI 
    } 

    if (mDrawableWidth == 0 || mDrawableHeight == 0) { 
     return;  // nothing to draw (empty bounds) 
    } 

    if (mDrawMatrix == null && mPaddingTop == 0 && mPaddingLeft == 0) { 
     mDrawable.draw(canvas); 
    } else { 
     int saveCount = canvas.getSaveCount(); 
     canvas.save(); 

     if (mCropToPadding) { 
      final int scrollX = mScrollX; 
      final int scrollY = mScrollY; 
      canvas.clipRect(scrollX + mPaddingLeft, scrollY + mPaddingTop, 
        scrollX + mRight - mLeft - mPaddingRight, 
        scrollY + mBottom - mTop - mPaddingBottom); 
     } 

     canvas.translate(mPaddingLeft, mPaddingTop); 

     if (mDrawMatrix != null) { 
      canvas.concat(mDrawMatrix); 
     } 
     mDrawable.draw(canvas); 
     canvas.restoreToCount(saveCount); 
    } 
} 

Comme vous pouvez le voir, il n'y a pas d'utilisation de Paint ici, alors je parie que c'est votre problème. Essayez de créer de nouveaux Paint et définir son alpha Drawable.getAlpha()

Depuis Drawable.getAlpha() API nécessitent 19, vous pouvez envelopper dans votre propre Drawable comme ceci:

class MyDrawable extends Drawable { 

    final Drawable originalDrawable; 
    private int mAlpha = 1; 

    @Override 
    public int getAlpha() { 
     return mAlpha; 
    } 

    public MyDrawable(Drawable drawable){ 
     originalDrawable = drawable; 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     originalDrawable.draw(canvas); 
    } 

    @Override 
    public void setAlpha(int alpha) { 
     mAlpha = alpha; 
     originalDrawable.setAlpha(alpha); 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) { 
     originalDrawable.setColorFilter(cf); 
    } 

    @Override 
    public int getOpacity() { 
     return originalDrawable.getOpacity(); 
    } 
} 
+0

J'ai parcouru le code Android avant de poster. Sur ma question j'ai dit que j'ai essayé de mettre l'alpha de ma peinture à getAlpha(). n'a pas fonctionné. getDrawable(). getAlpha() est minSDK 19 donc ne peut pas l'utiliser non plus. –

+0

Merci pour votre tentative, malheureusement, il ne fait rien. J'ai même essayé d'élever mon min sdk juste pour tester et utiliser getDrawable(). GetAlpha(). Toujours n'affaiblit pas la forme dans. Seulement le drawable. –

+0

Je devine que l'AlphaAnimation ne définit pas réellement la propriété alpha. J'ai même essayé d'utiliser un ViewPropertyAnimator –