Okay, ich habe gelesen und gesucht und stoße jetzt meinen Kopf gegen die Wand, um das herauszufinden. Folgendes habe ich bisher:
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);
}
}}
Die "+5" in den Messungen sind dort als vorübergehend; Soweit ich weiß, muss ich etwas rechnen, um die Größe zu bestimmen, die der Schlagschatten der Leinwand hinzufügt, oder?
Aber wenn ich das benutze:
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;
}
In meiner ImageView erhalte ich immer noch nur eine normale ImageView, wenn ich das Programm ausführe.
Irgendwelche Gedanken? Vielen Dank.
EDIT: Also habe ich mit RomainGuy einige im IRC-Kanal gesprochen, und ich habe es jetzt für einfache rechteckige Bilder mit dem folgenden Code arbeiten. Der Schatten wird jedoch immer noch nicht direkt auf die Transparenz meiner Bitmap gezogen, daher arbeite ich immer noch daran.
@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
quelle
quelle
Antworten:
Okay, ich sehe keine weiteren Antworten auf diese Frage. Was ich jetzt gemacht habe, ist nur eine Lösung für rechteckige Bilder. Ich habe das folgende NinePatch verwendet:
zusammen mit dem entsprechenden Auffüllen in XML:
um ein ziemlich gutes Ergebnis zu erzielen:
Nicht ideal, aber es wird reichen.
quelle
Dies stammt aus Romain Guys Präsentation bei Devoxx, pdf hier .
Hoffe das hilft.
ANMERKUNGEN
setLayerType(LAYER_TYPE_SOFTWARE, mShadow)
, sonst werden Sie Ihren Schatten nicht sehen! (@Dmitriy_Boichenko)SetShadowLayer
funktioniert leider nicht mit Hardwarebeschleunigung, so dass die Leistung stark reduziert wird (@Matt Wear) [1] [2]quelle
Ich glaube diese Antwort von UIFuel
quelle
Meine schmutzige Lösung:
Ergebnis:
quelle
Hier sind Sie ja. Legen Sie die Quelle von ImageView statisch in XML oder dynamisch in Code fest.
Der Schatten ist hier weiß.
quelle
Mit diesem Code kann ich einen Verlaufsrand anwenden.
hoffe das hilft !
quelle
Das funktioniert bei mir ...
quelle
Hier die Umsetzung von Paul Burkes Antwort:
TODO:
setLayerType(LAYER_TYPE_SOFTWARE, mShadow);
Nur ausführen , wenn die API-Ebene> 10 istquelle
Ich habe auf der obigen Antwort aufgebaut - https://stackoverflow.com/a/11155031/2060486 - um einen Schatten um ALLE Seiten zu erzeugen.
Ändern Sie die Farbe in der Konstante nach Belieben.
quelle
Verwenden Sie diese Klasse, um Schatten auf Bitmaps zu zeichnen
quelle
Wenn Sie die benutzerdefinierte Bildansicht verwenden möchten, empfehle ich die Verwendung diese zu verwenden
Die Ansicht sieht perfekt aus und verwendet kein Bild mit neun Pfaden
quelle