171 lines
4.7 KiB
Java
171 lines
4.7 KiB
Java
/*
|
|
* Copyright (C) 2008 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package net.simonvt.menudrawer;
|
|
|
|
import android.content.res.Resources;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.ColorFilter;
|
|
import android.graphics.Paint;
|
|
import android.graphics.PixelFormat;
|
|
import android.graphics.drawable.Drawable;
|
|
|
|
/**
|
|
* A specialized Drawable that fills the Canvas with a specified color.
|
|
* Note that a ColorDrawable ignores the ColorFilter.
|
|
* <p/>
|
|
* <p>It can be defined in an XML file with the <code><color></code> element.</p>
|
|
*
|
|
* @attr ref android.R.styleable#ColorDrawable_color
|
|
*/
|
|
class ColorDrawable extends Drawable {
|
|
|
|
private ColorState mState;
|
|
private final Paint mPaint = new Paint();
|
|
|
|
/** Creates a new black ColorDrawable. */
|
|
public ColorDrawable() {
|
|
this(null);
|
|
}
|
|
|
|
/**
|
|
* Creates a new ColorDrawable with the specified color.
|
|
*
|
|
* @param color The color to draw.
|
|
*/
|
|
public ColorDrawable(int color) {
|
|
this(null);
|
|
setColor(color);
|
|
}
|
|
|
|
private ColorDrawable(ColorState state) {
|
|
mState = new ColorState(state);
|
|
}
|
|
|
|
@Override
|
|
public int getChangingConfigurations() {
|
|
return super.getChangingConfigurations() | mState.mChangingConfigurations;
|
|
}
|
|
|
|
@Override
|
|
public void draw(Canvas canvas) {
|
|
if ((mState.mUseColor >>> 24) != 0) {
|
|
mPaint.setColor(mState.mUseColor);
|
|
canvas.drawRect(getBounds(), mPaint);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gets the drawable's color value.
|
|
*
|
|
* @return int The color to draw.
|
|
*/
|
|
public int getColor() {
|
|
return mState.mUseColor;
|
|
}
|
|
|
|
/**
|
|
* Sets the drawable's color value. This action will clobber the results of prior calls to
|
|
* {@link #setAlpha(int)} on this object, which side-affected the underlying color.
|
|
*
|
|
* @param color The color to draw.
|
|
*/
|
|
public void setColor(int color) {
|
|
if (mState.mBaseColor != color || mState.mUseColor != color) {
|
|
invalidateSelf();
|
|
mState.mBaseColor = mState.mUseColor = color;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the alpha value of this drawable's color.
|
|
*
|
|
* @return A value between 0 and 255.
|
|
*/
|
|
public int getAlpha() {
|
|
return mState.mUseColor >>> 24;
|
|
}
|
|
|
|
/**
|
|
* Sets the color's alpha value.
|
|
*
|
|
* @param alpha The alpha value to set, between 0 and 255.
|
|
*/
|
|
public void setAlpha(int alpha) {
|
|
alpha += alpha >> 7; // make it 0..256
|
|
int baseAlpha = mState.mBaseColor >>> 24;
|
|
int useAlpha = baseAlpha * alpha >> 8;
|
|
int oldUseColor = mState.mUseColor;
|
|
mState.mUseColor = (mState.mBaseColor << 8 >>> 8) | (useAlpha << 24);
|
|
if (oldUseColor != mState.mUseColor) {
|
|
invalidateSelf();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Setting a color filter on a ColorDrawable has no effect.
|
|
*
|
|
* @param colorFilter Ignore.
|
|
*/
|
|
public void setColorFilter(ColorFilter colorFilter) {
|
|
}
|
|
|
|
public int getOpacity() {
|
|
switch (mState.mUseColor >>> 24) {
|
|
case 255:
|
|
return PixelFormat.OPAQUE;
|
|
case 0:
|
|
return PixelFormat.TRANSPARENT;
|
|
}
|
|
return PixelFormat.TRANSLUCENT;
|
|
}
|
|
|
|
@Override
|
|
public ConstantState getConstantState() {
|
|
mState.mChangingConfigurations = getChangingConfigurations();
|
|
return mState;
|
|
}
|
|
|
|
static final class ColorState extends ConstantState {
|
|
|
|
int mBaseColor; // base color, independent of setAlpha()
|
|
int mUseColor; // basecolor modulated by setAlpha()
|
|
int mChangingConfigurations;
|
|
|
|
ColorState(ColorState state) {
|
|
if (state != null) {
|
|
mBaseColor = state.mBaseColor;
|
|
mUseColor = state.mUseColor;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Drawable newDrawable() {
|
|
return new ColorDrawable(this);
|
|
}
|
|
|
|
@Override
|
|
public Drawable newDrawable(Resources res) {
|
|
return new ColorDrawable(this);
|
|
}
|
|
|
|
@Override
|
|
public int getChangingConfigurations() {
|
|
return mChangingConfigurations;
|
|
}
|
|
}
|
|
}
|