Okej, czytałem i szukałem, a teraz walę głową w ścianę, próbując to rozgryźć. Oto, co mam do tej pory:
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);
}
}
„+5” w pomiarach jest tymczasowe; Z tego, co rozumiem, będę potrzebował trochę matematyki, aby określić rozmiar, jaki cień dodaje do płótna, prawda?
Ale kiedy używam tego:
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;
}
w moim ImageView, po uruchomieniu programu nadal otrzymuję zwykły ImageView.
jakieś pomysły? Dzięki.
EDYCJA: Więc rozmawiałem z RomainGuyem na kanale IRC i mam go teraz działającego dla zwykłych prostokątnych obrazów z poniższym kodem. Jednak nadal nie będzie rysował cienia bezpośrednio na przezroczystości mojej mapy bitowej, więc nadal nad tym pracuję.
@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
źródło
źródło
Odpowiedzi:
Okay, nie przewiduję więcej odpowiedzi na ten temat, więc na razie skończyłem jako rozwiązanie dla prostokątnych obrazów. Użyłem następującego NinePatch:
wraz z odpowiednim dopełnieniem w XML:
aby uzyskać dość dobry wynik:
nie jest idealny, ale wystarczy.
źródło
To jest zaczerpnięte z prezentacji Romaina Guya w Devoxx, pdf znajdującej się tutaj .
Mam nadzieję że to pomoże.
UWAGI
setLayerType(LAYER_TYPE_SOFTWARE, mShadow)
, w przeciwnym razie nie zobaczysz swojego cienia! (@Dmitriy_Boichenko)SetShadowLayer
niestety nie działa z akceleracją sprzętową, więc znacznie zmniejsza wydajność (@Matt Wear) [1] [2]źródło
Wierzę w tę odpowiedź od UIFuel
źródło
Moje brudne rozwiązanie:
wynik:
źródło
Tu masz. Ustaw źródło ImageView statycznie w formacie XML lub dynamicznie w kodzie.
Cień jest tutaj biały.
źródło
Udało mi się zastosować obramowanie gradientowe za pomocą tego kodu.
mam nadzieję że to pomoże !
źródło
To działa dla mnie ...
źródło
Oto implementacja odpowiedzi Paula Burke'a :
TODO: wykonaj
setLayerType(LAYER_TYPE_SOFTWARE, mShadow);
tylko wtedy, gdy poziom API jest> 10źródło
Oparłem się na powyższej odpowiedzi - https://stackoverflow.com/a/11155031/2060486 - aby utworzyć cień wokół WSZYSTKICH stron.
Zmień kolor w const według własnego uznania.
źródło
Użyj tej klasy do rysowania cienia na bitmapach
źródło
Jeśli chcesz użyć niestandardowego imageView, proponuję użyć tego
Widok wygląda idealnie i nie używaj żadnego obrazu z dziewięcioma ścieżkami
źródło