Está bien, he estado leyendo y buscando, y ahora estoy golpeando mi cabeza contra la pared tratando de resolver esto. Esto es lo que tengo hasta ahora:
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);
}
}
Los "+5" en las medidas son temporales; Por lo que tengo entendido, tendré que hacer algunos cálculos matemáticos para determinar el tamaño que la sombra paralela agrega al lienzo, ¿verdad?
Pero cuando uso esto:
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;
}
en mi ImageView, todavía obtengo solo un ImageView normal cuando ejecuto el programa.
¿Alguna idea? Gracias.
EDITAR: Así que hablé con RomainGuy en el canal IRC, y ahora lo tengo funcionando para imágenes rectangulares simples con el siguiente código. Sin embargo, todavía no dibujará la sombra directamente en la transparencia de mi mapa de bits, así que todavía estoy trabajando en eso.
@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
fuente
fuente
Respuestas:
De acuerdo, no preveo más respuestas en este caso, por lo que terminé yendo con una solución para imágenes rectangulares. He usado el siguiente NinePatch:
junto con el relleno apropiado en XML:
para obtener un resultado bastante bueno:
no es ideal, pero servirá.
fuente
Esto está tomado de la presentación de Romain Guy en Devoxx, pdf que se encuentra aquí .
Espero que esto ayude.
NOTAS
setLayerType(LAYER_TYPE_SOFTWARE, mShadow)
, de lo contrario no verás tu sombra! (@Dmitriy_Boichenko)SetShadowLayer
Lamentablemente, no funciona con la aceleración de hardware, por lo que reduce considerablemente el rendimiento (@Matt Wear) [1] [2]fuente
Creo esta respuesta de UIFuel
fuente
Mi sucia solución:
resultado:
fuente
Aquí estás. Establezca la fuente de ImageView estáticamente en xml o dinámicamente en el código.
La sombra es aquí blanca.
fuente
Me las arreglo para aplicar un borde degradado usando este código.
espero que esto ayude !
fuente
Esto funciona para mí ...
fuente
Aquí la implementación de la respuesta de Paul Burke :
TODO: ejecutar
setLayerType(LAYER_TYPE_SOFTWARE, mShadow);
solo si el nivel de API es> 10fuente
Me basé en la respuesta anterior, https://stackoverflow.com/a/11155031/2060486 , para crear una sombra alrededor de TODOS los lados.
Cambie el color de la constante como mejor le parezca.
fuente
Utilice esta clase para dibujar sombras en mapas de bits
fuente
Si desea utilizar el imageView personalizado, le sugiero que utilice este
Vea el aspecto perfecto y no use ninguna imagen de nueve rutas
fuente