0

キャンバスに円を描いています。この円の上に、現在の時間に等しい円の部分から始まる角度を描きます。

次に、onTouchEvent で、円上の点に基づいて、始点 (現在の時間) から終点まで角度を再描画する必要があります。

問題は、メソッド onTouchEvent で動的にスイープ角度を計算することです。

さまざまな Stackoverflow の投稿/提案から取得したさまざまな計算を試しましたが、期待どおりに機能するものはありませんでした。角度の反応、onTouchEvent は、常に少し予測不能でした。

私のコードスニペット:

@Override
public void draw(Canvas canvas) {
    super.draw(canvas);

    int radius = getRadius();
    int startAngle = getStartAngle();

    canvas.drawCircle(getWidth() / 2, getHeight() / 2, radius, this.bkgPaint);

    this.arcRect = new RectF((getWidth() / 2) - radius, (getHeight() / 2) - radius, (getWidth() / 2) + radius, (getHeight() / 2) + radius);
    canvas.drawArc(this.arcRect, startAngle, sweepAngle, true, arcPaint);
}

@Override
public boolean onTouchEvent(MotionEvent e) {
    if (e.getAction() == MotionEvent.ACTION_MOVE) {
        sweepAngle = (int) ((360.0D + Math.toDegrees(Math.atan2(e.getX() - 360.0D, 360.0D - e.getY()))) % 360.0D);
        invalidate();
    }
    return true;
}

private int getStartAngle() {
    Calendar cal = Calendar.getInstance();
    int minutes = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
    if (minutes > 720) {
        minutes -= 720;
    }
    int angle = minutes / 2;
    return (angle += 270) % 360;
}

private int getRadius() {
    return ((80 * getWidth()) / 100) / 2;
}
4

1 に答える 1

2

カラーピッカーで同様の計算を使用しました。これはオープン ソースです。ソースはこちらから入手できます。

あなたの場合、次のように終了角度の計算から始めます。

@Override
public boolean onTouchEvent(MotionEvent e) {
    int action = e.getAction();
    switch (action) {
    case MotionEvent.ACTION_DOWN:
    case MotionEvent.ACTION_MOVE:

        int x = (int) e.getX();
        int y = (int) e.getY();
        int cx = x - getWidth() / 2;
        int cy = y - getHeight() / 2;

        endAngle = (float) (Math.toDegrees(Math.atan2(cy, cx)) + 360f) % 360f;

        invalidate();

        return true;
    }
    return super.onTouchEvent(e);
}

モジュロで 360 度を追加する必要があります。この操作の後、円の右側が 0 度、下が 90 度、左が 180 度、上が 270 度になります。

これで、スイープ角度は になりますendAngle - startAngle。以上です!

于 2013-09-07T13:48:56.437 に答える