Dibuja un círculo en una vista (android)
Estoy empezando con mis primeros intentos de escribir una aplicación para Android. Me gustaría para visualizar la Monte-Carlo-Aproximación de pi. Por lo tanto, primero quiero dibujar un círculo en una vista, pero no lo hago funcionar! He intentado crear mi propia clase "CircleView" que extiende "Ver" y sobrescribir el método onDraw (…) como se explica aquí: ¿Cómo dibujar círculo por lienzo en Android?
Esta es mi clase CircleView
- Anular la disposición xml del marco de android
- Recorte de visualización de Android
- Problema XML en el ejemplo del menú básico
- Android: InflateException: Línea de archivo XML binario: Error al inflar la clase <unknown>
- Solo se muestra un elemento en la vista de reciclado
public class CircleView extends View { public CircleView(Context context) { super(context); } protected void onDraw(Canvas canvas){ super.onDraw(canvas); Paint paint = new Paint(); paint.setColor(150); canvas.drawCircle(50,50,20,paint); } }
He insertado el CircleView en un LinearLayout con el siguiente código XML
<com.tak3r07.montecarlopi.CircleView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/circleView" android:layout_weight="1"/>
(Btw Android Studio me está diciendo en la vista XML en el lado derecho: "Rendering Problems Vista personalizada CircleView no está usando los constructores de vista de 2 o 3 argumentos, los atributos XML no funcionarán")
La aplicación sólo se bloquea con el siguiente registro: http://pastebin.com/Gv1GaHtX
¿Puede alguien decir lo que hice mal?
Pensé que esta configuración crearía una actividad con una vista que muestra un círculo.
Saludos
Edit: Crash se corrige agregando el constructor de parámetros 2 y 3 en CircleView (consulte https://stackoverflow.com/a/13797457/3248708 )
Pero ahora todavía no veo ningún círculo en la actividad
- ¿Qué sucede si la minSdkVersion es menor que la targetSdkVersion?
- Establecer el ancho del botón en Android
- Error al inflarse al extender una clase
- Escala de imágenes en diferentes resoluciones XML
- Error al analizar XML: no se ha encontrado ningún elemento
- Creación de un WebService ASP.net que devuelve JSON en lugar de XML
- String-arrays de referencia en android strings.xml
- Edición de Android Dibujo de rutas largas en MapView mediante análisis XML
Un par de observaciones:
Debe tener en cuenta el ancho y la altura asignados a su vista al determinar el punto central y el radio de su círculo.
Debe tener en cuenta el relleno asignado a su vista para que no dibuje en esa parte reservada.
Debe evitar asignar objetos dentro de su método onDraw ya que esto se llama mucho.
Para permitir que su vista se especifique en un diseño XML, debe proporcionar al constructor que tome un Contexto y un AttributeSet. AttributeSet es el mecanismo por el cual sus atributos XML se pasan a su vista.
Probar esto:
package com.tak3r07.montecarlopi; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; public class CircleView extends View { private static final int DEFAULT_CIRCLE_COLOR = Color.RED; private int circleColor = DEFAULT_CIRCLE_COLOR; private Paint paint; public CircleView(Context context) { super(context); init(context, null); } public CircleView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } private void init(Context context, AttributeSet attrs) { paint = new Paint(); paint.setAntiAlias(true); } public void setCircleColor(int circleColor) { this.circleColor = circleColor; invalidate(); } public int getCircleColor() { return circleColor; } protected void onDraw(Canvas canvas) { super.onDraw(canvas); int w = getWidth(); int h = getHeight(); int pl = getPaddingLeft(); int pr = getPaddingRight(); int pt = getPaddingTop(); int pb = getPaddingBottom(); int usableWidth = w - (pl + pr); int usableHeight = h - (pt + pb); int radius = Math.min(usableWidth, usableHeight) / 2; int cx = pl + (usableWidth / 2); int cy = pt + (usableHeight / 2); paint.setColor(circleColor); canvas.drawCircle(cx, cy, radius, paint); } }
- Error: java.lang.UnsupportedOperationException: No se puede convertir a dimensión: type = 0x3
- La fusión de manifiesto ha fallado: uses-sdk: minSdkVersion 9 no puede ser menor que la versión L declarada en la biblioteca com.android.support