/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.holoeverywhere.widget.datetimepicker.time; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.util.Log; import android.view.View; import org.holoeverywhere.R; /** * Draws a simple white circle on which the numbers will be drawn. */ public class CircleView extends View { private static final String TAG = "CircleView"; private final Paint mPaint; private final int mPointerRadius; private boolean mIs24HourMode; private int mCircleBackground; private int mPointerColor; private float mCircleRadiusMultiplier; private float mAmPmCircleRadiusMultiplier; private boolean mIsInitialized; private boolean mDrawValuesReady; private int mXCenter; private int mYCenter; private int mCircleRadius; public CircleView(Context context) { this(context, null); } public CircleView(Context context, AttributeSet attrs) { this(context, attrs, R.attr.dateTimePickerStyle); } public CircleView(Context context, AttributeSet attrs, int defStyle) { super(context); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DateTimePicker, defStyle, R.style.Holo_DateTimePicker); mCircleBackground = a.getColor(R.styleable.DateTimePicker_timeCircleColor, 0); mPointerColor = a.getColor(R.styleable.DateTimePicker_timeCenterPointerColor, 0); mPointerRadius = a.getInteger(R.styleable.DateTimePicker_timeCenterPointerRadius, 0); a.recycle(); mPaint = new Paint(); mPaint.setAntiAlias(true); mIsInitialized = false; } public void initialize(Context context, boolean is24HourMode) { if (mIsInitialized) { Log.e(TAG, "CircleView may only be initialized once."); return; } Resources res = context.getResources(); mIs24HourMode = is24HourMode; if (is24HourMode) { mCircleRadiusMultiplier = Float.parseFloat( res.getString(R.string.time_circle_radius_multiplier_24HourMode)); } else { mCircleRadiusMultiplier = Float.parseFloat( res.getString(R.string.time_circle_radius_multiplier)); mAmPmCircleRadiusMultiplier = Float.parseFloat(res.getString(R.string.time_ampm_circle_radius_multiplier)); } mIsInitialized = true; } @Override public void onDraw(Canvas canvas) { int viewWidth = getWidth(); if (viewWidth == 0 || !mIsInitialized) { return; } if (!mDrawValuesReady) { mXCenter = getWidth() / 2; mYCenter = getHeight() / 2; mCircleRadius = (int) (Math.min(mXCenter, mYCenter) * mCircleRadiusMultiplier); if (!mIs24HourMode) { // We'll need to draw the AM/PM circles, so the main circle will need to have // a slightly higher center. To keep the entire view centered vertically, we'll // have to push it up by half the radius of the AM/PM circles. int amPmCircleRadius = (int) (mCircleRadius * mAmPmCircleRadiusMultiplier); mYCenter -= amPmCircleRadius / 2; } mDrawValuesReady = true; } mPaint.setColor(mCircleBackground); canvas.drawCircle(mXCenter, mYCenter, mCircleRadius, mPaint); mPaint.setColor(mPointerColor); canvas.drawCircle(mXCenter, mYCenter, mPointerRadius, mPaint); } }