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.
Vous devez vous connecter pour publier un commentaire.
D'accord, je ne prévois plus de réponses sur ce coup, donc ce que j'ai fini par aller avec maintenant, c'est juste une solution pour des images rectangulaires. J'ai utilisé le suivant NinePatch:
le long avec le rembourrage en XML:
pour obtenir un assez bon résultat:
Pas l'idéal, mais ça va le faire.
Ceci est pris à partir de Romain Guy de présentation à Devoxx, pdf ici.
Espère que cette aide.
NOTES
setLayerType(LAYER_TYPE_SOFTWARE, mShadow)
, sinon vous ne verrez pas votre ombre! (@Dmitriy_Boichenko)SetShadowLayer
n'ne pas travailler avec l'accélération matérielle, malheureusement, il a grandement
réduit les performances (@Matt Usure) [1] [2]
Je crois que cette réponse de UIFuel
Mon sale solution:
résultat:
Vous êtes ici. Définir la source de l'ImageView de manière statique en xml ou dynamiquement dans le code.
Ombre est ici blanc.
J'ai réussi à appliquer le dégradé de la frontière à l'aide de ce code..
espérons que cette aide !
Cela fonctionne pour moi ...
Ici la mise en Œuvre de Paul Burkes réponse:
TODO:
exécuter
setLayerType(LAYER_TYPE_SOFTWARE, mShadow);
seulement si l'API de Niveau > 10J'ai construit en fonction de la réponse ci - dessus https://stackoverflow.com/a/11155031/2060486 - pour créer une ombre autour de TOUS les côtés..
Changer la couleur de la const que vous voyez l'ajustement.
Utiliser cette classe pour dessiner l'ombre sur les bitmaps
Si vous souhaitez utiliser la coutume imageView, je vous suggère d'utiliser cette une
Afficher un look parfait et ne pas utiliser tout neuf chemin de l'image