Хорошо, я читал и искал вокруг, и теперь я бьюсь головой о стену, пытаясь понять это. Вот что у меня есть на данный момент:
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» в измерениях там как временные; Насколько я понимаю, мне нужно будет выполнить некоторые вычисления, чтобы определить размер, который тень добавляет к холсту, верно?
Но когда я использую это:
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;
}
в моем ImageView я по-прежнему получаю обычный ImageView при запуске программы.
Есть предположения? Спасибо.
РЕДАКТИРОВАТЬ: Итак, я поговорил с RomainGuy в IRC-канале, и теперь он работает для простых прямоугольных изображений с приведенным ниже кодом. Тем не менее, он по-прежнему не будет рисовать тень непосредственно на прозрачности моего растрового изображения, поэтому я все еще работаю над этим.
@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
Кевин Коппок
источник
источник
Ответы:
Хорошо, я не предвижу больше ответов на этот вопрос, так что на данный момент я остановился на решении только для прямоугольных изображений. Я использовал следующий NinePatch:
вместе с соответствующими отступами в XML:
чтобы получить довольно хороший результат:
Не идеально, но годится.
источник
Это взято из презентации Ромена Гая на Devoxx, pdf можно найти здесь .
Надеюсь это поможет.
НОТЫ
setLayerType(LAYER_TYPE_SOFTWARE, mShadow)
, иначе вы не увидите свою тень! (@Dmitriy_Boichenko)SetShadowLayer
к сожалению, не работает с аппаратным ускорением, поэтому сильно снижает производительность (@Matt Wear) [1] [2]источник
Я верю этому ответу от UIFuel
источник
Мое грязное решение:
результат:
источник
Вот, пожалуйста. Установите источник ImageView статически в xml или динамически в коде.
Тень здесь белая.
источник
Мне удается применить градиентную границу с помощью этого кода ..
надеюсь это поможет !
источник
Это работает для меня ...
источник
Вот реализация ответа Пола Берка :
TODO: выполнять,
setLayerType(LAYER_TYPE_SOFTWARE, mShadow);
только если уровень API> 10источник
Я основывался на ответе выше - https://stackoverflow.com/a/11155031/2060486 - чтобы создать тень вокруг ВСЕХ сторон ..
Измените цвет в константе по своему усмотрению.
источник
Используйте этот класс для рисования тени на растровых изображениях
источник
Если вы хотите использовать пользовательский imageView, я предлагаю вам использовать этот
Просматривайте идеально и не используйте изображение с девятью путями
источник