Ok, estive lendo e procurando por aí, e agora estou batendo minha cabeça contra a parede tentando descobrir isso. Aqui está o que tenho até agora:
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);
}
}
O "+5" nas medições existe como temporário; Pelo que entendi, vou precisar fazer algumas contas para determinar o tamanho que a sombra projetada adiciona à tela, certo?
Mas quando eu uso isso:
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;
}
no meu ImageView, ainda consigo apenas um ImageView normal quando executo o programa.
Alguma ideia? Obrigado.
EDIT: Falei com RomainGuy alguns no canal IRC, e estou trabalhando agora para imagens retangulares simples com o código abaixo. Ele ainda não vai desenhar a sombra diretamente na transparência do meu bitmap, então ainda estou trabalhando nisso.
@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
fonte
fonte
Respostas:
Ok, não prevejo mais respostas sobre este, então o que acabei fazendo por agora é apenas uma solução para imagens retangulares. Usei o seguinte NinePatch:
junto com o preenchimento apropriado em XML:
para obter um resultado razoavelmente bom:
Não é o ideal, mas serve.
fonte
Este foi retirado da apresentação de Romain Guy na Devoxx, pdf encontrado aqui .
Espero que isto ajude.
NOTAS
setLayerType(LAYER_TYPE_SOFTWARE, mShadow)
, caso contrário, você não verá sua sombra! (@Dmitriy_Boichenko)SetShadowLayer
não funciona com aceleração de hardware, infelizmente, por isso reduz bastante o desempenho (@Matt Wear) [1] [2]fonte
Eu acredito nessa resposta do UIFuel
fonte
Minha solução suja:
resultado:
fonte
Olha Você aqui. Defina a origem de ImageView estaticamente em xml ou dinamicamente no código.
A sombra aqui é branca.
fonte
Consigo aplicar borda gradiente usando este código ..
espero que isto ajude !
fonte
Isso funciona para mim ...
fonte
Aqui está a implementação da resposta de Paul Burke :
TODO: execute
setLayerType(LAYER_TYPE_SOFTWARE, mShadow);
apenas se o nível de API for> 10fonte
Desenvolvi a resposta acima - https://stackoverflow.com/a/11155031/2060486 - para criar uma sombra em torno de TODOS os lados.
Altere a cor da const conforme desejar.
fonte
Use esta classe para desenhar sombra em bitmaps
fonte
Se você quiser usar o imageView personalizado, sugiro que use este
A visualização parece perfeita e não usa nenhuma imagem de nove caminhos
fonte