2012-09-04 15 views
11

creé una vista personalizada Circleview así:lienzo no dibuja en vista personalizada

public class CircleView extends LinearLayout { 

    Paint paint1; 
    public CircleView(Context context) { 
     super(context); 
     init(); 
    } 
    public CircleView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 
    public void init() { 
     paint1 = new Paint(); 
     paint1.setColor(Color.RED); 
    }  
    protected void onDraw(Canvas canvas) { 
     //super.onDraw(canvas);   
     canvas.drawCircle(50, 50, 25, paint1); 
     this.draw(canvas); 
    } 
} 

Entonces lo incluí en mi raíz de disposición de Actividad <RelativeLayout>:

<com.turkidroid.test.CircleView 
     android:id="@+id/circle_view" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_centerInParent="true" /> 

Sin embargo, nada se ha elaborado!

  • ¿Estoy implementando la Vista personalizada derecho?
  • ¿O es así como utilicé la Vista personalizada?

algo de información:

  • Tanto Circleview y MyActivity están en el mismo paquete: com.turkidroid.test.
  • En el método onDraw(), traté de incluir super.onDraw() y comentarlo.
  • Sé que puedo dibujar un círculo con enfoques mucho más simples, pero mi CircleView contiene contiene más que dibujar un círculo. Necesito hacer que sea una Vista personalizada.

Respuesta

27

Su método onDraw nunca se llama, debe llamar a setWillNotDraw (falso) en el constructor de su Custom View para poder llamar realmente a onDraw.

Como se indica en Android SDK:

Si este punto de vista no hace ningún dibujo en sí mismo, establece este indicador para permitir optimizaciones adicionales. De forma predeterminada, este indicador no está configurado en Ver, pero se puede establecer en algunas subclases de Vista como ViewGroup. Normalmente, si reemplaza onDraw (android.graphics.Canvas), debe borrar esta bandera .

+0

Se lanza 'java.lang.StackOverflowError' después de añadir el método de los constructores! ¿Algunas ideas? – iTurki

+0

Tu sugerencia funcionó como un amuleto después de que 'no comento super.onDraw() 'desde mi código. ¡Gracias! – iTurki

+0

No estoy seguro de lo que era, mi llamada super.overraw faltaba y la bandera de arriba también se estableció en el valor predeterminado, pero después de poner ambas magia sucedió !!^_^ –

0

¿Dónde está su método this.draw()?

Esto debería funcionar definitivamente:

protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas);   
    canvas.drawCircle(50, 50, 25, paint1); 
    //this.draw(canvas); where is this method? 
} 
+0

'this.draw()' es el ['View.draw()'] (http: //developer.android.com/reference/android/view/View.html#draw%28android.graphics.Canvas%29) método. ¡Aún no funcionó! – iTurki

+0

Después de que agregué 'setWillNotDraw (false)' a los constructores, ¡SI FUNCIONA! ¡No sé por qué! – iTurki

+2

Si necesita una vista personalizada, siempre debe extenderse desde Ver y no desde LinearLayout a menos que realmente necesite el comportamiento específico también. – WarrenFaith

Cuestiones relacionadas