2012-02-10 18 views
9

Tengo DrawView. Si toco esta vista, dibuja círculos pequeños. No dibujaré círculos, pero no tocaré la vista, con la función de ayuda "setPoints". Lo que hago:¿Cómo obtener el lienzo actual?

package com.samples; 
import ... 

public class DrawView extends View { 
    ArrayList<Point> points = new ArrayList<Point>(); 

    Paint paint = new Paint(); 

    private int pSize = 5; 
    private int pColor = Color.BLACK; 

    public DrawView(Context context, AttributeSet attrs) { 

     super(context, attrs); 

     setFocusable(true); 
     setFocusableInTouchMode(true); 

     this.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       v.setOnTouchListener(this); 
        Point point = new Point(); 
        point.x = event.getX(); 
        point.y = event.getY(); 
        points.add(point); 
        invalidate(); 
       } 
       return true; 
      } 
     }); 
     requestFocus(); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     for (Point point : points) { 
      canvas.drawCircle(point.x, point.y, pSize, paint); 
     } 
    } 

    public void setPoints(Float xP, Float yP) 
    { 
     Point point = new Point(); 
     point.x = xP; 
     point.y = yP; 
     points.add(point); 
     postInvalidate(); 
    } 
} 

class Point { 
    float x, y; 

    @Override 
    public String toString() { 
     return x + ", " + y; 
    } 
} 

Dígame, ¿cómo funciona la función de los setPoints?

Actualización: Guau, es un problema realmente interesante. Mi DrawView contiene en HorizontalScrollView. Porque si configuro estas coordenadas a la derecha de DrawView, nadie sabe dónde están los círculos dibujables.

+0

Esta pregunta es difícil de entender. Revise – Raffaele

+0

No es fácil descifrar lo que quiere lograr :) Primero, elimine 'canvas2': no funciona como cree. Sospecho que quieres retener el círculo dibujado anteriormente, ¿verdad? Si este es su objetivo, debe mantener un historial de llamadas al sorteo, y puede hacerlo de dos maneras: 1) almacena un conjunto 'Punto []' y dibuja cada círculo en 'onDraw'; o 2) cada vez que se agrega un círculo, actualiza un caché el 'Mapa de bits' – Raffaele

+0

¡No dibujaré este círculo pero no tocaré la pantalla! – Leo

Respuesta

4

No puede. El lienzo es administrado por el sistema y se pasa a su onDraw(). No entiendo por qué lo necesitarías fuera de allí. Sólo redeclare setPoints como esto

public void setPoints(Canvas canvas, Float xP, Float Yp) 

Puede mantener una caché de los dibujos anteriores (o almacenar los puntos anteriores)

+0

Los puntos no son un problema, lo guardo. Acerca de "Canvas canvas": ¿Qué puedo hacer si nunca llamo a OnDraw? – Leo

+1

Parece que no sabe cómo dibujar Android Views. Cuando el sistema detecta que un widget necesita (re) pintar, toca la puerta de su widget y responde por 'onDraw (Canvas)'.Por lo tanto, tiene la garantía de que este método se llamará cada vez que sea necesario. Una forma de _trigger_ _the_ _repaint_ es invocando 'invalidate()' (o 'postInvalidate'). Por lo tanto, nunca tendrá que llamar OnDraw usted mismo, pero asegúrese de que Android lo llame cuando sea necesario. Debe proporcionar la devolución de llamada. Además, especifique a qué se refiere con "Quiero dibujar círculos pero no tocar vista" – Raffaele

+0

¿Puede darme un enlace o una palabra clave? – Leo

1

Intente declarar canvas2 como una variable pública en la clase DrawView.

+0

El problema está solo en la llamada de Canvas. – Leo

0

sacar sus círculos en onDraw(). Así se supone que funciona el View (técnicamente está en el método draw() pero lo ignoraremos). En setPoints(), establezca los puntos del círculo en las variables dentro del alcance de la clase, llame al invalidate(), luego dibuje el círculo así en onDraw(). Si sigues este método, estás siguiendo el flujo de clases para el que se diseñó la vista.

+0

hmm ... public void setPoints (Float xP, Float Yp) { canvas2.drawCircle (xP, yP, 5, paint); invalidar(); } ¿y entonces? – Leo

+0

No. 'canvas2.drawCircle (xP, yP, 5, paint);' entra en 'onDraw()'. Guarde los valores para 'xP',' yP' y luego invoque 'invalidate()' en 'setPoints()' – DeeV

+0

Vea el código actualizado, por favor – Leo