1bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio/* 2bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * Copyright (C) 2014 The Android Open Source Project 3bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * 4bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * Licensed under the Apache License, Version 2.0 (the "License"); 5bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * you may not use this file except in compliance with the License. 6bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * You may obtain a copy of the License at 7bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * 8bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * http://www.apache.org/licenses/LICENSE-2.0 9bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * 10bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * Unless required by applicable law or agreed to in writing, software 11bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * distributed under the License is distributed on an "AS IS" BASIS, 12bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * See the License for the specific language governing permissions and 14bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * limitations under the License. 15bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio */ 16bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 17bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Megliopackage android.widget; 18bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 19bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.content.Context; 20bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.content.res.Resources; 21bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.content.res.TypedArray; 22bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.graphics.Canvas; 23bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.graphics.Paint; 24bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.graphics.Typeface; 25bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport android.util.AttributeSet; 26bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 27bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioimport com.android.internal.R; 28bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 29bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioclass TextViewWithCircularIndicator extends TextView { 30bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 31bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio private static final int SELECTED_CIRCLE_ALPHA = 60; 32bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 33bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio private final Paint mCirclePaint = new Paint(); 34bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 35bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio private final String mItemIsSelectedText; 36bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio private int mCircleColor; 37bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio private boolean mDrawIndicator; 38bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 39bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio public TextViewWithCircularIndicator(Context context) { 40bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio this(context, null); 41bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 42bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 43bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio public TextViewWithCircularIndicator(Context context, AttributeSet attrs) { 44bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio this(context, attrs, 0); 45bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 46bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 47bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio public TextViewWithCircularIndicator(Context context, AttributeSet attrs, int defStyleAttr) { 48bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio this(context, attrs, defStyleAttr, 0); 49bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 50bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 51bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio public TextViewWithCircularIndicator(Context context, AttributeSet attrs, 52bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio int defStyleAttr, int defStyleRes) { 53bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio super(context, attrs); 5460727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette 55bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 56bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio // Use Theme attributes if possible 57bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio final TypedArray a = mContext.obtainStyledAttributes(attrs, 58bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio R.styleable.DatePicker, defStyleAttr, defStyleRes); 5960727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette final int resId = a.getResourceId(R.styleable.DatePicker_yearListItemTextAppearance, -1); 60bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio if (resId != -1) { 61bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio setTextAppearance(context, resId); 62bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 63bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 6460727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette final Resources res = context.getResources(); 65bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio mItemIsSelectedText = res.getString(R.string.item_is_selected); 66bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 67bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio a.recycle(); 68bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 69bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio init(); 70bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 71bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 72bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio private void init() { 73bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio mCirclePaint.setTypeface(Typeface.create(mCirclePaint.getTypeface(), Typeface.BOLD)); 74bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio mCirclePaint.setAntiAlias(true); 75bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio mCirclePaint.setTextAlign(Paint.Align.CENTER); 76bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio mCirclePaint.setStyle(Paint.Style.FILL); 77bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 78bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 79bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio public void setCircleColor(int color) { 80bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio if (color != mCircleColor) { 81bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio mCircleColor = color; 82bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio mCirclePaint.setColor(mCircleColor); 83bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio mCirclePaint.setAlpha(SELECTED_CIRCLE_ALPHA); 84bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio requestLayout(); 85bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 86bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 87bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 88bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio public void setDrawIndicator(boolean drawIndicator) { 89bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio mDrawIndicator = drawIndicator; 90bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 91bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 92bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio @Override 93bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio public void onDraw(Canvas canvas) { 94bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio super.onDraw(canvas); 95bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio if (mDrawIndicator) { 96bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio final int width = getWidth(); 97bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio final int height = getHeight(); 98bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio int radius = Math.min(width, height) / 2; 99bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio canvas.drawCircle(width / 2, height / 2, radius, mCirclePaint); 100bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 101bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 102bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio 103bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio @Override 104bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio public CharSequence getContentDescription() { 105bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio CharSequence itemText = getText(); 106bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio if (mDrawIndicator) { 107bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio return String.format(mItemIsSelectedText, itemText); 108bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } else { 109bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio return itemText; 110bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 111bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio } 112bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio}