キャンバスに円を描いています。この円の上に、現在の時間に等しい円の部分から始まる角度を描きます。
次に、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;
}