Personnalisé ImageView avec ombre portée

Ok, j'ai été la lecture et la recherche autour, et je suis maintenant à se taper la tête contre le mur en essayant de comprendre cela. Voici ce que j'ai à ce jour:

package com.pockdroid.sandbox;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.widget.ImageView;

public class ShadowImageView extends ImageView {

private Rect mRect;
private Paint mPaint;

public ShadowImageView(Context context)
{
    super(context);
    mRect = new Rect();
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setShadowLayer(2f, 1f, 1f, Color.BLACK);
}

@Override
protected void onDraw(Canvas canvas) 
{
    Rect r = mRect;
    Paint paint = mPaint;

    canvas.drawRect(r, paint);
    super.onDraw(canvas);
}

@Override
protected void onMeasure(int w, int h)
{
    super.onMeasure(w,h);
    int mH, mW;
    mW = getSuggestedMinimumWidth() < getMeasuredWidth()? getMeasuredWidth() : getSuggestedMinimumWidth();
    mH = getSuggestedMinimumHeight() < getMeasuredHeight()? getMeasuredHeight() : getSuggestedMinimumHeight();
    setMeasuredDimension(mW + 5, mH + 5);
}

}

Le "+5", dans les mesures sont là que temporaire; à Partir de ce que je comprends, je vais avoir besoin de faire quelques calculs pour déterminer la taille de l'ombre portée s'ajoute à la toile, à droite?

Mais quand je l'utilise:

public View getView(int position, View convertView, ViewGroup parent) {
    ShadowImageView sImageView;
    if (convertView == null) {
        sImageView = new ShadowImageView(mContext);
        GridView.LayoutParams lp = new GridView.LayoutParams(85, 85);
        sImageView.setLayoutParams(lp);

        sImageView.setScaleType(ImageView.ScaleType.CENTER);
        sImageView.setPadding(5,5,5,5);
    } else {
        sImageView = (ShadowImageView) convertView;
    }

    sImageView.setImageBitmap(bitmapList.get(position));
    return sImageView;
}

dans mon ImageView, je reçois toujours un ImageView quand je lance le programme.

Toute pensée? Merci.

EDIT: Alors j'en ai parlé avec RomainGuy certains dans le canal IRC, et je travaille maintenant pour la plaine images rectangulaires avec le code ci-dessous. Il persiste à ne pas attirer l'ombre directement à mon image de transparence si, si je suis encore en train de travailler sur ce.

@Override
protected void onDraw(Canvas canvas) 
{
    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.omen);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setShadowLayer(5.5f, 6.0f, 6.0f, Color.BLACK);
    canvas.drawColor(Color.GRAY);
    canvas.drawRect(50, 50, 50 + bmp.getWidth(), 50 + bmp.getHeight(), paint);
    canvas.drawBitmap(bmp, 50, 50, null);       
}
  • "il travaille maintenant pour la plaine images rectangulaires" ... il ne fonctionne pas pour les non-rectangulaire images, et puis je suppose que ça ne fonctionnera pas non plus pour 9patch-images, correct? Avez-vous entre-temps le faire fonctionner? La Cause de cette approche par Romain Guy ne fonctionne pas pour moi dans mon test encore.
  • Hmm, c'est une question intéressante. Je pense que vous pourriez probablement prendre votre Vue à l'aide de la 9-patch, et l'envelopper dans un FrameLayout, et de donner la FrameLayout l'ombre portée 9-patch arrière-plan. Mais oui, il ne fonctionne que pour les images rectangulaires, car il n'y a aucun moyen pour un 9-patch pour suivre la transparence des contours. Malheureusement, je n'ai pas trouvé une meilleure solution, cependant, je n'ai pas vraiment essayé de nouveau depuis.
InformationsquelleAutor kcoppock | 2010-09-12