2010-07-26 26 views
32
public class POCII extends Activity { 

    myView mv = new myView(this); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(mv); 
    } 
} 


class myView extends View { 

    public myView(Context context) { 
     super(context); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

     Paint paint = new Paint(); 

     canvas.drawRect(0,0,100,100, paint); 
     canvas.clipRect(0,0,50,50); 
    } 
} 

Mi pregunta es, ¿no debería el código anterior dibujar un rectángulo y luego recortar la parte superior izquierda? El rectángulo no se está recortando.Uso de clipRect - explicación

Explique qué hace clipRect. ¿Qué es realmente recorte? ¿Se recorta en forma de rectángulo, dadas las coordenadas? Si es así, ¿por qué el código anterior no funciona?

+2

cheque http://youtu.be/vkTn3Ule4Ps?list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu –

Respuesta

66

Lona. clipRect(left, top, right, bottom) reduce la región de la pantalla en la que las operaciones de dibujo futuras pueden escribir. Establece los clipBounds como la intersección espacial del rectángulo de recorte actual y el rectángulo especificado. Hay muchas variantes del método clipRect que aceptan diferentes formas para regiones y permiten diferentes operaciones en el rectángulo de recorte. Si desea establecer explícitamente la región de recorte, pruebe:

canvas.clipRect(left, top, right, bottom, Region.Op.REPLACE); 

El quinto argumento significa sustituir el rectángulo de recorte en lugar de crear la intersección con la versión anterior.

Intenta mover la instrucción clipRect antes de la instrucción drawRect. O bien, intente agregar:

paint.setColor(Color.YELLOW); 
drawRect(0,0,75,75); 

después de su actual instrucción clipRect. Debería dibujar un cuadrado amarillo de 50x50 sobre lo que tenía antes.

Otra nota: (después de una larga frustración con el aparentemente, en gran parte no documentado View/ViewGroup/código de dibujo) encontré que canvas.translate (x, y) también ajusta el clipRect. La interacción de clipRect y la matriz de dibujo es muy confusa. Es útil imprimir:

canvas.getMatrix() 

y

canvas.getClipBounds() 

antes y después de las modificaciones a la tela y antes de sacar las cosas.

+2

La nota sobre canvas.translate (x, y) de jugar con la clipRect era muy útil. Me salvó mucha frustración. ¡Gracias! –

+0

Los métodos con 'Region.Op' aparentemente están en desuso ahora. – Suragch

+0

¿Cómo obtener el lienzo original del lienzo recortado? –

3

Para recortar la parte superior izquierda, haga:

canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE); 
// secondly... 
canvas.drawRect(0,0,100,100, paint); 
4

ICS y por encima de ...

modos XOR, la diferencia y la pinza ReverseDifference se ignorados por el ICS si se habilita la aceleración de hardware.

Sólo desactivar la aceleración de hardware 2D en su opinión:

myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);

Referencia Android: Howto use clipRect in API15