java - programacion - manual de android en pdf
Android Vista de recorte (7)
Crear diseño personalizado con overridden onDraw(Canvas canvas)
llamar a canvas.clipRect(0, 0, mCanvasWidth, mCanvasHeight);
esto recortará todas las vistas que salgan del límite del diseño.
Y no se olvide de llamar a setWillNotDraw(false)
en el constructor, para que su onDraw se ejecute
¿Hay alguna manera de definir la región del clip de un ViewGroup en Android (Honeycomb)? Por ejemplo, tengo un ListView con un fondo de imagen que tiene esquinas redondeadas. Mientras me desplazo por la lista, los niños sobresalen más allá de las esquinas del fondo, prefiero que se graben en las esquinas redondeadas.
La imagen de la izquierda es lo que está haciendo actualmente, y la derecha es lo que me gustaría.
Estaba mirando ClipDrawable, pero parece que esto solo se puede usar para barras de progreso.
Además, estoy tratando de hacer esto en un widget. Así que no puedo usar una vista personalizada y reemplazar onDraw para enmascarar.
¡Gracias!
Give android: clipToPadding a try. Solucionará tu problema.
Pruebe subclassing ViewGroup y sobreescribiendo el método OnDraw de la siguiente manera, sustituyendo en valores para RADIUS_IN_PIXELS:
@Override
protected void onDraw(Canvas canvas) {
Path clipPath = new Path();
clipPath.addRoundRect(new RectF(canvas.getClipBounds()), RADIUS_IN_PIXELS, RADIUS_IN_PIXELS, Path.Direction.CW);
canvas.clipPath(clipPath);
super.onDraw(canvas);
}
... y también crear un dibujable personalizado como este llamado algo así como ''redondeado'', sustituyendo en YOUR_BACKGROUND_COLOR y RADIUS_IN_DP, asegurándose de hacer coincidir el redondeo del rectángulo en DP con su radio de recorte anterior en PX:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="RADIUS_IN_DP" />
<solid android:color="YOUR_BACKGROUND_COLOR"/>
</shape>
Luego puede usar esa subclase en su diseño, agregando las líneas
android:background="@drawable/rounded"
android:clipChildren="true"
Todos los niños se ajustarán a los límites especificados en la anulación de OnDraw (), y se agregará un fondo en función de su dibujo ''redondeado''.
Puede ser que haya utilizado el método Canvas.clipRegion para recortar las diferencias de las vistas.
Qué tal esto: cómo renderizar una vista de Android en un mapa de bits , luego recortar ese mapa de bits.
O bien, otra idea, use FrameLayout
, apile su máscara de clip encima de su ViewGroup. La máscara de clip tendría bordes opacos medios y transparentes.
En ambos casos, supongo que será difícil manejar la entrada del usuario ...
Si WhatsUp un vistazo a WhatsUp , puedes ver que en la imagen de contacto hay una imagen redondeada por un borde redondeado. Para hacer esto, he puesto ImageView dentro de FrameLayout (FrameLayout porque uso ProgressBar delante de la imagen para notificar la carga [realmente invisible]) que tiene borde redondeado. La imagen tiene forma cuadrada, pero para refinarla, debe trabajar con lienzo.
Eche otro vistazo a este link que resolverá su problema;)
Path p = new Path()
// define your clipping path...
canvas.clipPath(p);