Personalizable con ImageView
Ya tengo un 'ImageView' con estos parámetros:
android:layout_width="wrap_content" android:layout_height="wrap_content"
Y fijar personalizado Drawable
:
- Recortar una imagen con un marco especial
- Imágenes de escala baja en Android: ¿se puede hacer?
- ¿Cómo configuro una imagen de fondo de ListView vacía?
- Cambiar la forma de la imagen en android
- Voltear una imagen de mapa de bits horizontal o verticalmente
public class HexDrawable extends Drawable { private Path hexagonPath; private float mWidth, mHeight; private int mBackgroundColor; private int mStrokeColor; private int mStrokeWidth; public HexDrawable(){ init(); } public void setBackgroundColor(int color) { mBackgroundColor = color; } public void setStrokeWidth(int width) { mStrokeWidth = width; } public void setStrokeColor(int color) { mStrokeColor = color; } @Override public int getIntrinsicHeight() { return 60; } @Override public int getIntrinsicWidth() { return 60; } private void init() { hexagonPath = new Path(); mBackgroundColor = Color.BLUE; mStrokeColor = Color.GREEN; mStrokeWidth = 4; } private void calculatePath() { float p = mStrokeWidth / 2; float w = mWidth - 2 * p; float h = mHeight - 2 * p; float r = h / 2; float a = (float) (r / Math.sqrt(3)); PointF X = new PointF(p + a + r / 2, p); PointF Y = new PointF(p + a + r , p); PointF A = new PointF(p + a, p + 0f); PointF B = new PointF(p + 0f, p + r); PointF C = new PointF(p + a, p + 2 * r); PointF D = new PointF(p + w - a, p + 2 * r); PointF E = new PointF(p + w, p + r); PointF F = new PointF(p + w - a, p + 0); hexagonPath.moveTo(Yx, Yy); hexagonPath.lineTo(Ax, Ay); hexagonPath.lineTo(Bx, By); hexagonPath.lineTo(Cx, Cy); hexagonPath.lineTo(Dx, Dy); hexagonPath.lineTo(Ex, Ey); hexagonPath.lineTo(Fx, Fy); hexagonPath.lineTo(Xx, Xy); } @Override protected void onBoundsChange(Rect bounds) { mWidth = bounds.width(); mHeight = bounds.height(); calculatePath(); } @Override public void draw(Canvas canvas) { Paint paint = new Paint(); paint.setColor(mStrokeColor); // set the color paint.setStrokeWidth(mStrokeWidth); // set the size paint.setDither(true); // set the dither to true paint.setStyle(Paint.Style.STROKE); // set to STOKE paint.setStrokeJoin(Paint.Join.ROUND); // set the join to round you want paint.setStrokeCap(Paint.Cap.ROUND); // set the paint cap to round too paint.setPathEffect(new CornerPathEffect(mStrokeWidth)); // set the path effect when they join. paint.setAntiAlias(true); canvas.drawPath(hexagonPath, paint); canvas.clipPath(hexagonPath, Region.Op.INTERSECT); canvas.drawColor(mBackgroundColor); canvas.drawPath(hexagonPath, paint); canvas.save(); } @Override public void setAlpha(int alpha) { } @Override public void setColorFilter(ColorFilter colorFilter) { } @Override public int getOpacity() { return 0; } }
Parece que ImageView
utiliza todo el ancho en este caso.
¿Cómo implementar Drawable
correctamente para usarlo con ImageView
?
- Cambiar el logotipo que aparece en Android ActionBar por programa
- Cómo habilitar la función de zoom in / out (dos dedos) para una imagen en android
- Acceso rápido y manipulación de píxeles android
- Error Unparsed Aapt
- ¿Se puede dibujar con el selector?
- Xamarin.Forms ListView OutOfMemoryError excepción en Android
- Mover, escalar y recortar la imagen en android como facebook foto de perfil
- Cómo hacer una imagen de la partición de Android a su PC
La raíz del problema era el modo de clip.
Es mejor usar canvas.clipPath(hexagonPath, Region.Op.REPLACE);
También, el ejemplo de la pregunta trabaja bien con ImageView, pero después de la investigación profunda que undestand, eso en android 5.0 y arriba este drawable se utiliza en TextView
en TextView
. También su no necesidad de anular getIntrinsicHeight
Su código es absolutamente correcto:
Así es como lleno ImageView
(en onCreate()
de la actividad):
((ImageView)findViewById(R.id.hexImageView)).setImageDrawable(new HexDrawable());
Disposición de la Activity
en la captura de pantalla:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <ImageView android:id="@+id/hexImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </FrameLayout>
Si reemplazo wrap_content
con valor, hexágono como se espera está cambiando su tamaño.
Probado en Android 6.0 y 4.3.
Sólo un consejo – en lugar de los valores codificados en getIntrinsicHeight()
y getIntrinsicWidth()
, podría ser mejor utilizar dimens
en dimens
lugar.
- Enrutado del reproductor multimedia de Android
- Gradle ejecuta líneas de comandos en tareas personalizadas