package net.naonedbus.widget; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.CornerPathEffect; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; public class ClockView extends View { private static final int DISABLED_ALPHA = 150; private static final int HAND_WIDTH = 2; private static final int HAND_HEIGHT = 2; private Paint mPaint; private Paint mBackgroundPaint; private float mHandWidth; private int mMinutes; public ClockView(final Context context, final AttributeSet attrs, final int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public ClockView(final Context context, final AttributeSet attrs) { this(context, attrs, 0); } public ClockView(final Context context) { this(context, null); } private void init() { setWillNotDraw(false); final float density = getContext().getResources().getDisplayMetrics().density; mHandWidth = HAND_WIDTH * density; mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setPathEffect(new CornerPathEffect(10f)); mPaint.setColor(Color.WHITE); mPaint.setStrokeWidth(mHandWidth); mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mBackgroundPaint.setStyle(Paint.Style.FILL); mBackgroundPaint.setColor(Color.LTGRAY); } @Override public void setBackgroundColor(final int color) { mBackgroundPaint.setColor(color); } public void setColor(final int color) { mPaint.setColor(color); } public void setMinutes(final int minutes) { mMinutes = minutes; } @Override public void setEnabled(final boolean enabled) { mPaint.setAlpha(enabled ? 255 : DISABLED_ALPHA); mBackgroundPaint.setAlpha(enabled ? 255 : DISABLED_ALPHA); } @Override protected void onDraw(final Canvas canvas) { super.onDraw(canvas); final int hour = mMinutes / 60; final int min = mMinutes - (hour * 60); final float x = getWidth() / 2f; final float y = getHeight() / 2f; final float minHandHeight = (getHeight() / 2f) * 0.6f; final float hourHandHeight = (getHeight() / 2f) * 0.4f; canvas.drawCircle(x, y, getWidth() / 2f, mBackgroundPaint); // Hour canvas.drawLine(x, y, (float) (x + hourHandHeight * Math.cos(Math.toRadians((hour / 12.0f * 360.0f) - 90f))), (float) (y + hourHandHeight * Math.sin(Math.toRadians((hour / 12.0f * 360.0f) - 90f))), mPaint); // Minute canvas.drawLine(x, y, (float) (x + minHandHeight * Math.cos(Math.toRadians((min / 60.0f * 360.0f) - 90f))), (float) (y + minHandHeight * Math.sin(Math.toRadians((min / 60.0f * 360.0f) - 90f))), mPaint); } }