¿Puedo dibujar fuera de los límites de un canvas de Android

Transmitimos una aplicación escrita en un entorno de gráficos que permite que el dibujo se realice fuera de los límites del rectángulo de recorte. ¿Alguna forma de hacer esto en Android?

Para dibujar fuera de los límites, debe expandir el clipRect del canvas.

Mira los métodos sobrecargados de clipRect en la clase Canvas.

Nota: Deberá especificar la operación Región porque la operación predeterminada es INTERSECCIÓN. Entonces algo como esto:

Rect newRect = canvas.getClipBounds(); newRect.inset(-5, -5) //make the rect larger canvas.clipRect (newRect, Region.Op.REPLACE); //happily draw outside the bound now 

intenta establecer

 android:clipChildren="false" 

a la vista principal

Puede dibujar donde lo desee, pero no se guardará nada fuera del rectángulo de recorte.

La respuesta @numan dio es casi correcta, el problema es la asignación de memoria con ese enfoque, por lo que deberíamos estar haciendo esto, en su lugar:

 // in constructor/elsewhere Rect newRect = new Rect(); // in onDraw canvas.getClipBounds(newRect); newRect.inset(0, -20); //make the rect larger canvas.clipRect(newRect, Region.Op.REPLACE); 

Eso resuelve el problema 🙂

Si desea dibujar texto fuera de límites en TextView, debería hacer esto en su lugar:

  

No funciona el uso de clipRect () como la respuesta de @ numan porque TextView clip es su propio rect en onDraw ():

 if (mShadowRadius != 0) { clipLeft += Math.min(0, mShadowDx - mShadowRadius); clipRight += Math.max(0, mShadowDx + mShadowRadius); clipTop += Math.min(0, mShadowDy - mShadowRadius); clipBottom += Math.max(0, mShadowDy + mShadowRadius); } canvas.clipRect(clipLeft, clipTop, clipRight, clipBottom); 

Por último, pero no menos importante, no olvides configurar android:clipChildren="false" y android:clipToPadding="false" en tu ViewGroup padre