Android dibujar círculo con ruta
Estoy tratando de animar dibujando un círculo. En mi vista personalizada, tengo
private final Paint mPaint = new Paint() { { setDither(true); setStyle(Paint.Style.STROKE); setStrokeCap(Paint.Cap.ROUND); setStrokeJoin(Paint.Join.ROUND); setColor(Color.BLUE); setStrokeWidth(30.0f); setAntiAlias(true); } }; ... protected void onDraw(Canvas canvas) { super.onDraw(); if (mOval == null) { mOval = new RectF(getLeft(), getTop(), getRight(), getBottom()); } if (mPath == null) { mPath = new Path(); mPath.moveTo(0, getHeight() / 2); } float sweepAngle = Math.min((float) mElapsedTime / 1000 * 60 * 1, 1) * 360; if (sweepAngle == 0) { mPath.reset(); } else if (mCurrentAngle != sweepAngle) { mPath.arcTo(mOval, mCurrentAngle, sweepAngle); } mCurrentAngle = sweepAngle; canvas.drawPath(mPath, mPaint); }
A intervalos, estoy actualizando mElapsedTime
y llamando a invalidate()
. Sin embargo, nada se dibuja en la pantalla. He intentado varias variaciones, pero en vano. ¿Hay algo que estoy haciendo mal? ¿Hay alguna forma más fácil de hacer esto? Dado un porcentaje de un círculo, quiero ser capaz de hacer que gran parte del círculo sea lo que se dibuja en la pantalla.
- Determinar la vista que aparece en LayoutManager pre-layout
- Uso de la animación en un ViewPager y setFillAfter
- ¿Cómo hago pausas la animación de los cuadros usando AnimationDrawable?
- Iniciar animación en carga de página, detener en página cargada
- Android - Botón con imagen giratoria / giratoria de "carga" cuando se pulsa
- Error de JNI en la animación de transición de escena - Capa supera el máximo
- Facebook lide slideout menu (No utiliza esa biblioteca)
- Android: Animación de la posición de la vista
- Actualizar la actividad de la fuente antes de la transición de salida
- Animación personalizada para Toast entrar / salir?
- El atributo Alpha sólo funciona en Android Lollipop, ¿por qué?
- ¿Cómo puedo animar el cambio de color de la barra de estado y la barra de herramientas (como la nueva aplicación de calendario)
- animateLayoutChanges no animar la eliminación de la flecha hacia atrás desde la barra de herramientas
Hay dos cosas aquí:
-
Tienes que llamar a
canvas.drawOval(...)
antes de dibujar el arco sobre el óvalo. De lo contrario, no aparecerá. Es por eso que mi método no funcionó. -
Canvas
tiene un métododrawArc
que toma un ángulo de inicio y un grados para barrer. Consulte http://developer.android.com/reference/android/graphics/Canvas.html#drawArc%28android.graphics.RectF,%20float,%20float,%20boolean,%20android.graphics.Paint%29 . Esto es lo que estaba buscando para dibujar círculos.
EDIT: aquí está el código relevante de mi subclase View
:
private final Paint mArcPaint = new Paint() { { setDither(true); setStyle(Paint.Style.STROKE); setStrokeCap(Paint.Cap.ROUND); setStrokeJoin(Paint.Join.ROUND); setColor(Color.BLUE); setStrokeWidth(40.0f); setAntiAlias(true); } }; private final Paint mOvalPaint = new Paint() { { setStyle(Paint.Style.FILL); setColor(Color.TRANSPARENT); } }; @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); RectF mOval = new RectF(left, top, right, bottom); //This is the area you want to draw on float sweepAngle = 270; //Calculate how much of an angle you want to sweep out here canvas.drawOval(mOval, mOvalPaint); canvas.drawArc(mOval, 269, sweepAngle, false, mArcPaint); //270 is vertical. I found that starting the arc from just slightly less than vertical makes it look better when the circle is almost complete. }
- ¿Cómo detengo mi menú desplegable AutoCompleteTextView de desplazarse sobre mi AutoCompleteTextView?
- Cómo utilizar Java 8 Stream API bajo Android 6.0