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