ColorDrawable.java revision b798689749c64baba81f02e10cf2157c747d6b46
1/* 2 * Copyright (C) 2008 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 17package android.graphics.drawable; 18 19import android.graphics.*; 20import android.content.res.Resources; 21import android.content.res.TypedArray; 22import android.util.AttributeSet; 23import org.xmlpull.v1.XmlPullParser; 24import org.xmlpull.v1.XmlPullParserException; 25 26import java.io.IOException; 27 28/** 29 * A specialized Drawable that fills the Canvas with a specified color, 30 * with respect to the clip region. Note that a ColorDrawable ignores the ColorFilter. 31 * It also ignores the Bounds, meaning it will draw everywhere in the current clip, 32 * even if setBounds(...) was called with a smaller area. 33 * 34 * <p>It can be defined in an XML file with the <code><color></code> element.</p> 35 * 36 * @attr ref android.R.styleable#ColorDrawable_color 37 */ 38public class ColorDrawable extends Drawable { 39 private ColorState mState; 40 41 /** 42 * Creates a new black ColorDrawable. 43 */ 44 public ColorDrawable() { 45 this(null); 46 } 47 48 /** 49 * Creates a new ColorDrawable with the specified color. 50 * 51 * @param color The color to draw. 52 */ 53 public ColorDrawable(int color) { 54 this(null); 55 mState.mBaseColor = mState.mUseColor = color; 56 } 57 58 private ColorDrawable(ColorState state) { 59 mState = new ColorState(state); 60 } 61 62 @Override 63 public int getChangingConfigurations() { 64 return super.getChangingConfigurations() | mState.mChangingConfigurations; 65 } 66 67 @Override 68 public void draw(Canvas canvas) { 69 canvas.drawColor(mState.mUseColor); 70 } 71 72 /** 73 * Returns the alpha value of this drawable's color. 74 * 75 * @return A value between 0 and 255. 76 */ 77 public int getAlpha() { 78 return mState.mUseColor >>> 24; 79 } 80 81 /** 82 * Sets the color's alpha value. 83 * 84 * @param alpha The alpha value to set, between 0 and 255. 85 */ 86 public void setAlpha(int alpha) { 87 alpha += alpha >> 7; // make it 0..256 88 int baseAlpha = mState.mBaseColor >>> 24; 89 int useAlpha = baseAlpha * alpha >> 8; 90 mState.mUseColor = (mState.mBaseColor << 8 >>> 8) | (useAlpha << 24); 91 } 92 93 /** 94 * Setting a color filter on a ColorDrawable has no effect. 95 * 96 * @param colorFilter Ignore. 97 */ 98 public void setColorFilter(ColorFilter colorFilter) { 99 } 100 101 public int getOpacity() { 102 switch (mState.mUseColor >>> 24) { 103 case 255: 104 return PixelFormat.OPAQUE; 105 case 0: 106 return PixelFormat.TRANSPARENT; 107 } 108 return PixelFormat.TRANSLUCENT; 109 } 110 111 @Override 112 public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs) 113 throws XmlPullParserException, IOException { 114 super.inflate(r, parser, attrs); 115 116 TypedArray a = r.obtainAttributes(attrs, com.android.internal.R.styleable.ColorDrawable); 117 118 int color = mState.mBaseColor; 119 color = a.getColor(com.android.internal.R.styleable.ColorDrawable_color, color); 120 mState.mBaseColor = mState.mUseColor = color; 121 122 a.recycle(); 123 } 124 125 @Override 126 public ConstantState getConstantState() { 127 mState.mChangingConfigurations = super.getChangingConfigurations(); 128 return mState; 129 } 130 131 final static class ColorState extends ConstantState { 132 int mBaseColor; // initial color. never changes 133 int mUseColor; // basecolor modulated by setAlpha() 134 int mChangingConfigurations; 135 136 ColorState(ColorState state) { 137 if (state != null) { 138 mBaseColor = state.mBaseColor; 139 mUseColor = state.mUseColor; 140 } 141 } 142 143 @Override 144 public Drawable newDrawable() { 145 return new ColorDrawable(this); 146 } 147 148 @Override 149 public int getChangingConfigurations() { 150 return mChangingConfigurations; 151 } 152 } 153} 154