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 {
41
public ThumbnailRadioButton(Context context) {
42
super(context);
43
init();
44
}
45
46
public ThumbnailRadioButton(Context context, AttributeSet attrs) {
47
super(context, attrs);
48
init();
49
}
50
51
public ThumbnailRadioButton(Context context, AttributeSet attrs, int defStyle) {
52
super(context, attrs, defStyle);
53
init();
54
}
55
56
private void init() {
57
setButtonDrawable(android.R.color.transparent);
58
}
59
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
}