1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.example.android.renderscriptintrinsic;
18 
19 import android.graphics.Bitmap;
20 import android.graphics.Color;
21 import android.graphics.Paint;
22 import android.graphics.drawable.BitmapDrawable;
23 import android.graphics.drawable.Drawable;
24 import android.graphics.drawable.LayerDrawable;
25 import android.graphics.drawable.ShapeDrawable;
26 import android.graphics.drawable.StateListDrawable;
27 import android.graphics.drawable.shapes.RectShape;
28 import android.os.Build;
29 import android.view.Gravity;
30 import android.widget.RadioButton;
31 import android.content.Context;
32 import android.util.AttributeSet;
33 
34 /*
35  A button with Thumbnail which extends Radio Button.
36  The widget override a background drawable of Radio Button with a StateList Drawable.
37  Each state has a LayerDrawable with a Thumbnail image and a Focus rectangle.
38  It's using original Radio Buttons text as a label, because LayerDrawable showed some issues with Canvas.drawText().
39  */
40 public class ThumbnailRadioButton extends RadioButton {
ThumbnailRadioButton(Context context)41     public ThumbnailRadioButton(Context context) {
42         super(context);
43         init();
44     }
45 
ThumbnailRadioButton(Context context, AttributeSet attrs)46     public ThumbnailRadioButton(Context context, AttributeSet attrs) {
47         super(context, attrs);
48         init();
49     }
50 
ThumbnailRadioButton(Context context, AttributeSet attrs, int defStyle)51     public ThumbnailRadioButton(Context context, AttributeSet attrs, int defStyle) {
52         super(context, attrs, defStyle);
53         init();
54     }
55 
init()56     private void init() {
57         setButtonDrawable(android.R.color.transparent);
58     }
59 
setThumbnail(Bitmap bitmap)60     public void setThumbnail(Bitmap bitmap) {
61         //Bitmap drawable
62         BitmapDrawable bmp = new BitmapDrawable(getResources(), bitmap);
63         bmp.setGravity(Gravity.CENTER);
64 
65         int strokeWidth = 24;
66         //Checked state
67         ShapeDrawable rectChecked = new ShapeDrawable(new RectShape());
68         rectChecked.getPaint().setColor(0xFFFFFFFF);
69         rectChecked.getPaint().setStyle(Paint.Style.STROKE);
70         rectChecked.getPaint().setStrokeWidth(strokeWidth);
71         rectChecked.setIntrinsicWidth(bitmap.getWidth() + strokeWidth);
72         rectChecked.setIntrinsicHeight(bitmap.getHeight() + strokeWidth);
73         Drawable drawableArray[] = new Drawable[]{bmp, rectChecked};
74         LayerDrawable layerChecked = new LayerDrawable(drawableArray);
75 
76         //Unchecked state
77         ShapeDrawable rectUnchecked = new ShapeDrawable(new RectShape());
78         rectUnchecked.getPaint().setColor(0x0);
79         rectUnchecked.getPaint().setStyle(Paint.Style.STROKE);
80         rectUnchecked.getPaint().setStrokeWidth(strokeWidth);
81         rectUnchecked.setIntrinsicWidth(bitmap.getWidth() + strokeWidth);
82         rectUnchecked.setIntrinsicHeight(bitmap.getHeight() + strokeWidth);
83         Drawable drawableArray2[] = new Drawable[]{bmp, rectUnchecked};
84         LayerDrawable layerUnchecked = new LayerDrawable(drawableArray2);
85 
86         //Statelist drawable
87         StateListDrawable states = new StateListDrawable();
88         states.addState(new int[]{android.R.attr.state_checked},
89                 layerChecked);
90         states.addState(new int[]{},
91                 layerUnchecked);
92 
93         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
94             setBackground(states);
95         else
96             setBackgroundDrawable(states);
97 
98         //Offset text to center/bottom of the checkbox
99         Paint paint = new Paint();
100         paint.setAntiAlias(true);
101         paint.setTextSize(getTextSize());
102         paint.setTypeface(getTypeface());
103         float w = paint.measureText(getText(), 0, getText().length());
104         setPadding(getPaddingLeft() + (int) ((bitmap.getWidth() - w) / 2.f + .5f),
105                 getPaddingTop() + (int) (bitmap.getHeight() * 0.70),
106                 getPaddingRight(),
107                 getPaddingBottom());
108 
109         setShadowLayer(5, 0, 0, Color.BLACK);
110     }
111 }
112