ColorChipView.java revision 980d530f002b335916e8b31662e50a94b43cae18
1056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson/* 2056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * Copyright (C) 2011 The Android Open Source Project 3056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * 4056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * Licensed under the Apache License, Version 2.0 (the "License"); 5056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * you may not use this file except in compliance with the License. 6056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * You may obtain a copy of the License at 7056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * 8056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * http://www.apache.org/licenses/LICENSE-2.0 9056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * 10056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * Unless required by applicable law or agreed to in writing, software 11056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * distributed under the License is distributed on an "AS IS" BASIS, 12056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * See the License for the specific language governing permissions and 14056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * limitations under the License. 15056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson */ 16056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 17056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonpackage com.android.calendar; 18056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 19056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.content.Context; 20980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelsonimport android.graphics.BitmapFactory; 21056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.graphics.Canvas; 22056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.graphics.Paint; 23056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.graphics.Paint.Style; 24980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelsonimport android.graphics.drawable.BitmapDrawable; 25056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.graphics.drawable.Drawable; 26980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelsonimport android.graphics.Shader.TileMode; 27980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelsonimport android.graphics.PorterDuff; 28056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.util.AttributeSet; 29056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.util.Log; 30056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonimport android.view.View; 31056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 32056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 33056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 34056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 35056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson/** 36056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * A custom view for a color chip for an event that can be drawn differently 37056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * accroding to the event's status. 38056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson * 39056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson */ 40056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelsonpublic class ColorChipView extends View { 41056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 42056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson private static final String TAG = "ColorChipView"; 43056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson // Style of drawing 44056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson // Full rectangle for accepted events 45056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson // Border for tentative events 46056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson // Cross-hatched with 50% transparency for declined events 47056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 48980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson public static final int DRAW_FULL = 0; 49980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson public static final int DRAW_BORDER = 1; 50980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson public static final int DRAW_CROSS_HATCHED = 2; 51056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 52980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson private static final float DECLINED_ALPHA = (float) 0.4; 53980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson private static final float DEFAULT_ALPHA = 1; 54056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 55056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson int mDrawStyle = DRAW_FULL; 56056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 57980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson private static final int DEF_BORDER_WIDTH = 4; 58056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 59056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson int mBorderWidth = DEF_BORDER_WIDTH; 60056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 61056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson int mColor; 62980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson BitmapDrawable mCrosshatchedPattern; 63056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 64056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson public ColorChipView(Context context) { 65056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson super(context); 66980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson init(context); 67056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson } 68056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 69056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson public ColorChipView(Context context, AttributeSet attrs) { 70056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson super(context, attrs); 71980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson init(context); 72056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson } 73056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 74056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson public void setDrawStyle(int style) { 75056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson if (style != DRAW_FULL && style != DRAW_BORDER && style != DRAW_CROSS_HATCHED) { 76056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson return; 77056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson } 78056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson mDrawStyle = style; 79980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson if (style == DRAW_CROSS_HATCHED) { 80980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson mCrosshatchedPattern.setColorFilter(mColor, PorterDuff.Mode.OVERLAY); 81980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson setBackgroundDrawable(mCrosshatchedPattern); 82980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson setAlpha(DECLINED_ALPHA); 83980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson } else { 84980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson setBackgroundDrawable(null); 85980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson setAlpha(DEFAULT_ALPHA); 86980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson } 87d002bd24937d9c0823f283884961adc2c902558eIsaac Katzenelson invalidate(); 88056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson } 89056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 90056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson public void setBorderWidth(int width) { 91056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson if (width >= 0) { 92056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson mBorderWidth = width; 93d002bd24937d9c0823f283884961adc2c902558eIsaac Katzenelson invalidate(); 94056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson } 95056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson } 96056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 97056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson public void setColor(int color) { 98056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson mColor = color; 99980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson mCrosshatchedPattern.setColorFilter(mColor, PorterDuff.Mode.OVERLAY); 100d002bd24937d9c0823f283884961adc2c902558eIsaac Katzenelson invalidate(); 101056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson } 102056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 103980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson private void init(Context c) { 104980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson mCrosshatchedPattern = new BitmapDrawable(BitmapFactory.decodeResource(getResources(), 105980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson R.drawable.event_bg_declined)); 106980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson mCrosshatchedPattern.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT); 107980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson } 108980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson 109056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson @Override 110056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson public void onDraw(Canvas c) { 111056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 112056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson int right = getWidth() - 1; 113056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson int bottom = getHeight() - 1; 114056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson Paint p = new Paint(); 115056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson p.setColor(mColor); 116056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson p.setStyle(Style.FILL_AND_STROKE); 117056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 118056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson switch (mDrawStyle) { 119056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson case DRAW_FULL: 120056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson c.drawRect(0, 0, right, bottom, p); 121056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson break; 122056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson case DRAW_BORDER: 123056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson if (mBorderWidth <= 0) { 124056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson return; 125056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson } 126980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson int halfBorderWidth = mBorderWidth / 2; 127056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson int top = halfBorderWidth; 128056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson int left = halfBorderWidth; 129056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson p.setStrokeWidth(mBorderWidth); 130056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson 131980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson float[] lines = new float[16]; 132056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson int ptr = 0; 133056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = 0; 134056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = top; 135056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = right; 136056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = top; 137056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = 0; 138056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = bottom - halfBorderWidth; 139056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = right; 140056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = bottom - halfBorderWidth; 141056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = left; 142056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = 0; 143056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = left; 144056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = bottom; 145056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = right - halfBorderWidth; 146056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = 0; 147056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = right - halfBorderWidth; 148056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson lines [ptr++] = bottom; 149056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson c.drawLines(lines, p); 150056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson break; 151056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson default: 152980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson // Don't need to do anything for DRAW_CROSS_HATCHED since the 153980d530f002b335916e8b31662e50a94b43cae18Isaac Katzenelson // pattern is already set in the background drawable in "setStyle" 154056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson break; 155056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson } 156056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson } 157056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson} 158