D'accord, j'ai lu et cherché, et je me cogne la tête contre le mur pour essayer de comprendre. Voici ce que j'ai jusqu'à présent:
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);
}
}
Les "+5" dans les mesures sont là comme temporaires; D'après ce que j'ai compris, je vais devoir faire des calculs pour déterminer la taille que l'ombre portée ajoute à la toile, non?
Mais quand j'utilise ceci:
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, j'obtiens toujours juste un ImageView normal lorsque j'exécute le programme.
Des pensées? Merci.
EDIT: J'ai donc parlé avec RomainGuy dans le canal IRC, et je le fais maintenant fonctionner pour des images rectangulaires simples avec le code ci-dessous. Cependant, cela ne dessinera toujours pas l'ombre directement sur la transparence de mon bitmap, donc je travaille toujours là-dessus.
@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);
}
android
overriding
imageview
dropshadow
Kevin Coppock
la source
la source
Réponses:
D'accord, je ne prévois plus de réponses sur celui-ci, donc ce que j'ai fini par faire pour l'instant, c'est juste une solution pour les images rectangulaires. J'ai utilisé le NinePatch suivant:
avec le remplissage approprié en XML:
pour obtenir un assez bon résultat:
pas idéal, mais ça ira.
la source
Ceci est tiré de la présentation de Romain Guy à Devoxx, pdf disponible ici .
J'espère que cela t'aides.
REMARQUES
setLayerType(LAYER_TYPE_SOFTWARE, mShadow)
, sinon vous ne verrez pas votre ombre! (@Dmitriy_Boichenko)SetShadowLayer
ne fonctionne malheureusement pas avec l'accélération matérielle donc cela réduit considérablement les performances (@Matt Wear) [1] [2]la source
Je crois cette réponse d' UIFuel
la source
Ma sale solution:
résultat:
la source
Vous voilà. Définissez la source d'ImageView de manière statique en xml ou dynamiquement dans le code.
L'ombre est ici blanche.
la source
J'arrive à appliquer une bordure dégradée en utilisant ce code.
J'espère que cela t'aides !
la source
Cela fonctionne pour moi ...
la source
Voici la mise en œuvre de la réponse de Paul Burke :
TODO: exécuter
setLayerType(LAYER_TYPE_SOFTWARE, mShadow);
uniquement si le niveau d'API est> 10la source
J'ai construit sur la réponse ci-dessus - https://stackoverflow.com/a/11155031/2060486 - pour créer une ombre autour de TOUS les côtés.
Changez la couleur dans le const comme bon vous semble.
la source
Utilisez cette classe pour dessiner une ombre sur des bitmaps
la source
Si vous souhaitez utiliser l'imageView personnalisée, je vous suggère d'utiliser celle-ci
La vue est parfaite et n'utilise aucune image à neuf chemins
la source