ModeIconView.java revision 0496fcaa51f88f6c753975473b971941e4090cfa
1213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu/* 2213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * Copyright (C) 2014 The Android Open Source Project 3213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * 4213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * Licensed under the Apache License, Version 2.0 (the "License"); 5213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * you may not use this file except in compliance with the License. 6213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * You may obtain a copy of the License at 7213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * 8213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * http://www.apache.org/licenses/LICENSE-2.0 9213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * 10213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * Unless required by applicable law or agreed to in writing, software 11213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * distributed under the License is distributed on an "AS IS" BASIS, 12213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * See the License for the specific language governing permissions and 14213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * limitations under the License. 15213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu */ 16213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu 17213a4a086b54904cee543adf60b16fc1a61efe38Doris Liupackage com.android.camera.ui; 18213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu 19213a4a086b54904cee543adf60b16fc1a61efe38Doris Liuimport android.content.Context; 20213a4a086b54904cee543adf60b16fc1a61efe38Doris Liuimport android.graphics.Canvas; 21040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liuimport android.graphics.drawable.Drawable; 22213a4a086b54904cee543adf60b16fc1a61efe38Doris Liuimport android.graphics.drawable.GradientDrawable; 23213a4a086b54904cee543adf60b16fc1a61efe38Doris Liuimport android.util.AttributeSet; 24040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liuimport android.view.View; 25213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu 26213a4a086b54904cee543adf60b16fc1a61efe38Doris Liuimport com.android.camera2.R; 27213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu 28213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu/** 29213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * This class encapsulates the logic of drawing different states of the icon in 30213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * mode drawer for when it is highlighted (to indicate the current module), or when 31213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * it is selected by the user. It handles the internal state change like a state 32213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * list drawable. The advantage over a state list drawable is that in the class 33213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * multiple states can be rendered using the same drawable with some color modification, 34213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * whereas a state list drawable would require a different drawable for each state. 35213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu */ 36040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liupublic class ModeIconView extends View { 37213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu private boolean mHighlightIsOn = false; 38213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu private final GradientDrawable mBackground; 390496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague private final GradientDrawable mHoverDrawable; 400496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague 41213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu private final int mIconBackgroundSize; 42213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu private int mHighlightColor; 43213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu private final int mBackgroundDefaultColor; 44040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu private final int mIconDrawableSize; 45040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu private Drawable mIconDrawable = null; 4606e0826c3ae8579bd301040607701e0065aa6848Doris Liu private boolean mSelected = false; 47213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu 48213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu public ModeIconView(Context context, AttributeSet attrs) { 49213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu super(context, attrs); 50213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu mBackgroundDefaultColor = getResources().getColor(R.color.mode_selector_icon_background); 51213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu mIconBackgroundSize = getResources().getDimensionPixelSize( 52213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu R.dimen.mode_selector_icon_block_width); 53213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu mBackground = (GradientDrawable) getResources() 54213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu .getDrawable(R.drawable.mode_icon_background).mutate(); 55213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu mBackground.setBounds(0, 0, mIconBackgroundSize, mIconBackgroundSize); 560496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague mHoverDrawable = (GradientDrawable) getResources() 5706e0826c3ae8579bd301040607701e0065aa6848Doris Liu .getDrawable(R.drawable.mode_icon_background).mutate(); 580496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague mHoverDrawable.setBounds(0, 0, mIconBackgroundSize, mIconBackgroundSize); 59040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu mIconDrawableSize = getResources().getDimensionPixelSize( 60040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu R.dimen.mode_selector_icon_drawable_size); 610496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague 620496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague mHoverDrawable.setColor(getResources().getColor(R.color.mode_icon_hover_highlight)); 63040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu } 64040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu 65040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu /** 66040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu * Sets the drawable that shows the icon of the mode. 67040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu * 68040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu * @param drawable drawable of the mode icon 69040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu */ 70040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu public void setIconDrawable(Drawable drawable) { 71040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu mIconDrawable = drawable; 720496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague 73040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu // Center icon in the background. 74040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu if (mIconDrawable != null) { 75040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu mIconDrawable.setBounds(mIconBackgroundSize / 2 - mIconDrawableSize / 2, 76040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu mIconBackgroundSize / 2 - mIconDrawableSize / 2, 77040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu mIconBackgroundSize / 2 + mIconDrawableSize / 2, 78040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu mIconBackgroundSize / 2 + mIconDrawableSize / 2); 79040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu invalidate(); 80040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu } 81213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu } 82213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu 83213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu @Override 84213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu public void draw(Canvas canvas) { 85040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu super.draw(canvas); 8606e0826c3ae8579bd301040607701e0065aa6848Doris Liu if (mHighlightIsOn && !mSelected) { 870496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague mHoverDrawable.draw(canvas); 8806e0826c3ae8579bd301040607701e0065aa6848Doris Liu } else { 8906e0826c3ae8579bd301040607701e0065aa6848Doris Liu mBackground.draw(canvas); 90213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu } 91040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu if (mIconDrawable != null) { 92040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu mIconDrawable.draw(canvas); 93040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu } 940496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague } 95040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu 960496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague /** 970496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * @return A clone of the icon drawable associated with this view. 980496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague */ 990496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague public Drawable getIconDrawableClone() { 1000496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague return mIconDrawable.getConstantState().newDrawable(); 1010496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague } 1020496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague 1030496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague /** 1040496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * @return The size of the icon drawable. 1050496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague */ 1060496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague public int getIconDrawableSize() { 1070496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague return mIconDrawableSize; 108213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu } 109213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu 110213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu /** 111213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * This gets called when the selected state is changed. When selected, the background 112213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * drawable will use a solid pre-defined color to indicate selection. 113213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * 114213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * @param selected true when selected, false otherwise. 115213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu */ 1160496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague @Override 117213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu public void setSelected(boolean selected) { 118213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu if (selected) { 119213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu mBackground.setColor(mHighlightColor); 120213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu mHighlightIsOn = false; 121213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu } else { 122213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu mBackground.setColor(mBackgroundDefaultColor); 123213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu } 1240496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague 12506e0826c3ae8579bd301040607701e0065aa6848Doris Liu mSelected = selected; 126213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu invalidate(); 127213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu } 128213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu 129213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu /** 130213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * This gets called when the highlighted state is changed. When highlighted, 131213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * a ring shaped drawable of a solid pre-defined color will be drawn on top 132213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * of the background drawable to indicate highlight state. 133213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * 134213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * @param highlighted true when highlighted, false otherwise. 135213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu */ 136213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu public void setHighlighted(boolean highlighted) { 137213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu mHighlightIsOn = highlighted; 138213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu invalidate(); 139213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu } 140213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu 141213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu /** 142213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * Sets the color that will be used in the drawable for highlight state. 143213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * 144213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * @param highlightColor color for the highlight state 145213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu */ 146213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu public void setHighlightColor(int highlightColor) { 147213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu mHighlightColor = highlightColor; 1480496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague } 1490496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague 1500496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague /** 1510496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague * @return The highlightColor color the the highlight state. 1520496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague */ 1530496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague public int getHighlightColor() { 1540496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague return mHighlightColor; 155213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu } 156213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu} 157