Menú círculo Android como notas de captura
Trato de hacer círculo de menú como en esta aplicación.
- ¿Cómo dividir la pantalla en tres partes verticalmente?
- Widget de Android que parece exactamente un icono de lanzador
- (Java / Android) Calcular días entre 2 fechas y presentar el resultado en un formato específico
- Poner muro de facebook en Android
- ¿Cómo crear un diálogo de alerta con un título de varias líneas?
En el modo "expandido" dibujo este componente como sigue:
<RelativeLayout android:id="@+id/bigCircle"> <!--color full borders--> <my.custom.component android:id="@+id/middleCircle"> <!--circle for buttons--> <RelativeLayout android:id="@+id/smallCircle"> <!--minus button--> </RelativeLayout> </my.custom.component> </RelativeLayout>
En el método onDraw de my.custom.component
círculo en 8 partes usando android.graphics.Path
con android.graphics.Paint
y algunas matemáticas.
Visualmente tengo exactamente como se muestra en la captura de pantalla. Pero cuando presiono en parte del círculo, necesito redibujar esta parte en otro color para demostrar al usuario qué algo está pasando.
Cómo puedo volver a dibujar la parte de la tela del componente que corta fuera de otra parte del lienzo por android.graphics.Path
por ejemplo.
En otra palabra sé qué redibujar lienzo debo hacer en el método onDraw, sé que puedo mostrar algunos bitmap de drawables pintado en photoshop y tener algunos "problemas de pantalla múltiple", sé cómo puedo determinar la parte que el usuario presionado. Pero no sé cómo puedo seleccionar parte del lienzo y volver a dibujarlo.
- ¿Cómo hacer un RatingBar más pequeño?
- ¿Cómo puedo hacer que mi diseño se mueva horizontal y verticalmente?
- Cómo manejar el evento de clic en cada celda de un diseño de tabla
- Cómo personalizar el ancho y la altura cuando se muestra una actividad como un cuadro de diálogo
- Widget minHeight = "72dp" da 2 filas de altura
- Tamaño del mapa de bits de Android Widget
- ¿Cómo configurar este Layout que se ajuste a cualquier altura de pantalla?
- ¿Por qué el teclado levanta el tabhost a la tapa?
Desarrollador de Catch aquí. Si estoy entendiendo su problema, tiene problemas para entender cómo dibujar específicamente el indicador de selección / selección en una sección de su menú circular.
Si bien hay un montón de maneras diferentes se podría implementar, lo que se está inclinando hacia (utilizando android.graphics.Path
) es cómo lo hicimos. En la jerarquía de vista de nuestro botón de captura, hay un elemento que sirve como el lienzo en el que se dibuja el color de resaltado de la selección (si hay una selección activa).
Si tuviera una View
personalizada similar en su diseño, podría duplicar este comportamiento de la misma forma. Primero, necesitará el Path
que define la selección para un segmento de círculo particular. Usando Path.addArc(RectF, float, float)
podemos obtener el camino en forma de rebanada de pizza que necesitamos:
private Path getPathForSegment(float startAngle, float sweep) { Point center = new Point(getWidth() / 2, getHeight() / 2); RectF rect = new RectF(0f, 0f, getWidth(), getHeight()); Path selection = new Path(); selection.addArc(rect, startAngle, sweep); selection.lineTo(center.x, center.y); selection.close(); return selection; }
Los getWidth()
y getHeight()
anteriores son para el objeto de visualización personalizado adjunto, por lo que definen el cuadro delimitador que contiene el círculo en el que se dibuja la selección.
Luego, en la vista personalizada onDraw(Canvas)
, si su código ha determinado una selección debe dibujarse para un segmento:
@Override protected void onDraw(Canvas canvas) { // Assume one has the rest of these simple helper functions defined if (shouldDrawSelection()) { float startAngle = getStartAngleOfSelectedSegment(); float sweep = getSweepAngle(); Paint paint = getPaintStyleForSelectedSegment(); Path path = getPathForSegment(startAngle, sweep); canvas.drawPath(path, paint); } // ... super.onDraw(canvas); }
En las otras áreas de su código que son los toques de seguimiento, simplemente invoque invalidate()
en la vista personalizada para que vuelva a dibujar (o no) la ruta de selección basada en cambios en la entrada o el estado.
Recuerde que es una buena práctica evitar new
objetos en onDraw()
, por lo que la mayoría de estos bloques de construcción ( Path
s, Paint
s, etc.) pueden ser construidos antes de tiempo (o una vez, en la primera aparición) y reutilizados.
Espero que esto está cerca de lo que estaban pidiendo!
- Puntos que debe recordar al probar la aplicación de Android
- Android: ¿es el método View.onClick () invocado en el hilo principal de la interfaz de usuario?