1

アナログ時計ウィジェットを開発しており、時計の文字盤はイメージです。画像のように円弧セグメントを描きたいです(オレンジで示されているように)。

paint.setColor(Color.GREEN);
paint.setStrokeWidth(20);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
canvas.drawCircle(100, 100, 200, paint);

drawcircle と drawArc を試してみましたが、完全な円弧ではなく円弧の一部だけが必要なため、続行できませんでした。何か案は ?

ここに画像の説明を入力

4

2 に答える 2

1

このクラスが役に立てば幸いです。すべての変数はスペイン語ですが、非常にシンプルです。

コンストラクター SemiCirculo は、パラメーターとして半円の RGB と解像度 (半円の三角形の数) を使用します。

CalcularPuntosPorcentaje メソッドは、パラメータとして円の中心、開始角度、角度の幅、およびラジオを使用します。

メソッドImprimeCirculoはキャンバスをパラメータとして使用し、前述の方法で半円の点を計算した後、半円を描画するために使用されます。

CalcularPuntosPorcentaje メソッドは CalcularPuntosPorcentaje に似ていますが、開始と幅の角度パラメーターの代わりに、0 から 100 までの % を使用します。

最後に、SetOffset と SetColor を使用して、半円の角度と色のデフォルトの開始点の参照を変更します。

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;


public class SemiCirculo {

    private Path circulo;
    private Paint color;
    private float px, py, radio, anguloI, anchoa,offset;
    private int r, g, b;
    private int resolucion;
    private float puntox[],puntoy[];


    public SemiCirculo(int r1, int g1, int b1, int resolucion1) {

        this.offset = 0;
        this.color = new Paint();
        this.r = r1;
        this.g = g1;
        this.b = b1;
        this.color.setColor(Color.rgb(r, g, b));
        color.setAntiAlias(true);
        circulo = new Path();
        this.resolucion = resolucion1;
        this.puntox = new float[this.resolucion];
        this.puntoy = new float[this.resolucion];
        this.anguloI = 0;
        this.anchoa = 1;

    }

    public void SetOffset(float off) {
        this.offset = off;
    }

    public void SetColor(int r1,int g1, int b1){        
        this.r=r1;
        this.g=g1;
        this.b=b1;
        this.color.setColor(Color.rgb(r, g, b));
    }

    public void CalcularPuntosPorcentaje(float px1, float py1,
            float porcentaje, float radio1) {
        this.anguloI = 0 + this.offset;
        this.px = px1;
        this.py = py1;
        this.radio = radio1;
        this.anguloI = 0;
        this.anchoa = porcentaje / 100 * 360;

        this.CalcularPuntos(px, py, anguloI, anchoa, radio);
    }

    public void CalcularPuntos(float px1, float py1, float anguloI1,
            float anchoangulo, float radio1) {
        this.anguloI = anguloI1 + this.offset;

        this.anchoa = anchoangulo;
        this.px = px1;
        this.py = py1;
        this.radio = radio1 ;

        float angulo = 360 - this.anguloI - this.anchoa;

        for (int i = 0; i < resolucion; i++) {
            this.puntox[i] = this.px - (float) Math.sin(Math.toRadians(angulo))
                    * this.radio;
            this.puntoy[i] = this.py - (float) Math.cos(Math.toRadians(angulo))
                    * this.radio;
            angulo = (360 - this.anguloI - this.anchoa)
                    + ((this.anchoa / (float) (this.resolucion)) * (i + 2));
        }

        this.circulo.reset();

        this.circulo.moveTo(this.px, this.py);
        for (int i = 0; i < resolucion; i++) {
            this.circulo.lineTo(this.puntox[i], this.puntoy[i]);
        }

    }

    public void ImprimeCirculo(Canvas canvas) {

        canvas.drawPath(this.circulo, this.color);

    }

}
于 2014-02-22T19:50:31.460 に答える
0

この方法を使用する必要があります。

canvas.drawArc(innerRect, -11.0f, 11.0f + 6.0f, true, paintx);

ドキュメントについては、ここを参照してください:

http://developer.android.com/reference/android/graphics/Canvas.html#drawArc%28android.graphics.RectF,%20float,%20float,%20boolean,%20android.graphics.Paint%29

角度パラメータを正しく設定してください。そしてフロートを使用してください!

最初の角度は円弧の始点で、2 番目の角度パラメーターはスイープ角度です。つまり、角度の長さは時計回りに測定されます。

試してみてください、それは確かにうまくいくでしょう。少し遊んでみる必要があります:-)

于 2012-05-10T06:42:28.950 に答える