2011-09-26 15 views
15

¿Es posible enmascarar vistas? Por ejemplo, si tengo un diseño que requiere una vista de lista para ser visible dentro de una abertura de forma ovalada. ¿Hay alguna manera de crear una máscara para una vista? ¿Se llama algo más? Debido a que todas las referencias que encuentro para enmascarar en los documentos de Android están hablando de enmascarar un objeto canvas o drawable. Pero no creo que hacer un dibujable de un objeto interactivo como una vista de lista sería un buen enfoque. ¿Es esto solo una limitación para tratar por ahora?¿Es posible enmascarar una vista en Android?

Respuesta

30

Sí, es - usted tiene que reemplazar el método de dibujo de la vista - es decir:

...... 
final Path path = new Path(); 
path.addRoundRect(new RectF(0,0,getWidth(),getHeight()),10,10,Direction.CW); 
...... 
@Override 
protected void dispatchDraw(Canvas canvas){ 
    canvas.clipPath(path); 
    super.dispatchDraw(canvas); 
} 

Para ello se utilizará la vista sólo en los límites establecidos por ruta.

+1

También podría crear lo que sea "máscara" efecto deseado y sólo hay que poner en su propio punto de vista y lo puso sábana/frente a la vista de que se trate . Si solo necesita este efecto para 1 vista específica, esto le ahorrará la molestia de crear sus propias vistas y editar los métodos de dibujo. – FoamyGuy

+0

Eso sería un error, Tim. Ralentizará su aplicación al crear una jerarquía de vistas completamente innecesaria en una plataforma móvil donde el rendimiento es crucial. – asenovm

+0

Estoy de acuerdo en que se obtendría un peor rendimiento. Sostengo que si lo está aplicando para 1 vista dentro de 1 actividad, la diferencia en el rendimiento será imperceptible para el ojo humano en los dispositivos que están disponibles. Y que hacerlo con vistas separadas puede parecer menos desalentador para algunas personas que intentar crear su propia vista para que puedan anular los métodos de dibujo. Sé que hacer cosas así se vuelve trivial después de que tengas algunas en tu haber. Pero si nunca lo has hecho antes, para mí parece que podría ser un poco abrumador. – FoamyGuy

10

Sí, incluso puede enmascarar diseños completos. selfplug Shameless

<com.christophesmet.android.views.maskableframelayout.MaskableFrameLayout 
android:id="@+id/frm_mask_animated" 
android:layout_width="100dp" 
app:porterduffxfermode="DST_IN" 
app:mask="@drawable/animation_mask" 
android:layout_height="100dp"> 

<ImageView android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:scaleType="centerCrop" 
      android:src="@drawable/unicorn"/> 

usted lo puede encontrar here

Cuestiones relacionadas