2011-05-27 9 views
11

Está bien, he estado tratando de hacer esto por un par de días y no estoy obteniendo ningún lugar. Así que tengo los siguientes dos imágenes:Android Gauge Animation Pregunta

El primero es un medidor de RPM

RPM Gauge

La segunda imagen es un gráfico blanco por completo en representación de calibre rpm estar lleno:

Full Gauge

Quiero hacer lo siguiente:

  1. preguntar al usuario para una entrada RPM, si por ejemplo entran en el indicador 1.2 se llenará de la siguiente manera:

output

que tienen la entrada del usuario a trabajar Necesito ayuda con la animación. Aquí es lo que he intentado:

  1. He intentado usar PorterDuff pero también clips de la galga en el fondo no sólo la barra blanca
  2. He intentado dividir la imagen en pequeños mapas de bits y almacenarlas en matrices para que pueda recuperar partes, pero esto fue lento y, a menudo se estrelló
  3. Hice algunos progresos mediante la aplicación de la Gauge primero en el lienzo y luego guardar el lienzo: canvas.save(); luego recorte un camino en la imagen blanca y luego restaure el lienzo. Sin embargo, no sé cómo recortar de forma circular desde abajo a la izquierda hasta 180 grados hacia abajo a la derecha (CW). Es esta la mejor manera?

Sé que es probable que haya una manera más fácil o más eficiente de hacer esto, simplemente no tengo ni idea. ¿Alguien con buenas ideas?

* Nota Todas las imágenes son de PNG

Gracias de antemano!

Respuesta

9

Como ya encontrado, me gustaría utilizar el clip:

  • imagen de fondo empate
  • acortar el sistema
  • llamar la imagen en primer plano

usaría

Canvas.clipPath() 

con una ruta parecida a la tarta sl partida de hielo en el centro del círculo, como esto:

Clip path

Para crear clip de uso trayectoria algo como:

public class PieView extends View { 

    private int width = 200; 
    private int angleStart = 135; 
    private int sweep = 270; 

    private Path p; 

    private Paint paint = new Paint(); 

    public PieView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
     p = new Path(); 
     //move into center of the circle 
     p.setLastPoint(width/2, width/2); 
     //add line from the center to arc at specified angle 
     p.lineTo(width/2+(float)Math.cos(Math.toRadians(angleStart))*(width/2), 
       width/2+(float)Math.sin(Math.toRadians(angleStart))*(width/2)); 
     //add arc from start angle with specified sweep 
     p.addArc(new RectF(0, 0, width, width), angleStart, sweep); 
     //from end of arc return to the center of circle 
     p.lineTo(width/2, width/2); 

     paint.setColor(Color.RED); 
     paint.setStrokeWidth(1); 
     paint.setStyle(Style.STROKE); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     canvas.drawRect(0,0,width,width, paint); 
     canvas.drawPath(p,paint); 
    } 
} 
+0

bien, daré una oportunidad. Sin embargo, ¿cómo lo haría lucir animado? como si se estuviera llenando? –

+1

implementar algún bucle y cambiar el recorte en consecuencia – Ludevik

+0

estoy un poco confundido en la parte de recorte. Está bien, entonces hay un rectángulo que es el cuadro delimitador del indicador en el que se encuentra el rectángulo: RectF bounds = new RectF (0,0,200,200); y quiero hacer un clip.addArc (saltos, ángulo de inicio, ángulo de barrido); Asumiendo, ¿cuál sería mi ángulo de inicio y barrido? He intentado con 180 a 0 pero no parece producir la imagen correcta. –