Android Open Source - GreenDroid Action Bar Drawable






From Project

Back to project page GreenDroid.

License

The source code is released under:

Apache License

If you think the Android project GreenDroid listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2011 Cyril Mottier (http://www.cyrilmottier.com)
 *//from w  w  w .  j a v  a  2 s .c  o m
 * 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 greendroid.graphics.drawable;

import greendroid.widget.ActionBar;
import greendroid.widget.ActionBarItem;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.LightingColorFilter;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.StateSet;
import android.util.TypedValue;

import com.cyrilmottier.android.greendroid.R;

/**
 * <p>
 * A specialized Drawable dedicated to {@link ActionBarItem}s. It automatically
 * adapts its color depending on its current state. By default, the colors are:
 * </p>
 * <ul>
 * <li>Color.BLACK in alternative (pressed/focused)</li>
 * <li>Color.WHITE in otherwise</li>
 * </ul>
 * <p>
 * The ActionBarDrawable is a great replacement to the StateListDrawable that
 * should be used in {@link ActionBar}s.
 * </p>
 * <p>
 * GreenDroid offers a smart way to change the default alternative and normal
 * colors in an application-wide manner. In order to do that, override the
 * {@link R.attr#gdActionBarItemColorNormal} and
 * {@link R.attr#gdActionBarItemColorAlt} attributes in your application theme.
 * </p>
 * 
 * @see R.attr#gdActionBarItemColorNormal
 * @see R.attr#gdActionBarItemColorAlt
 * @author Cyril Mottier
 */
public class ActionBarDrawable extends BitmapDrawable {

    private static final TypedValue sTypedValue = new TypedValue();

    private ColorFilter mNormalCf;
    private ColorFilter mAltCf;

    /**
     * Create a new ActionBarDrawable
     * 
     * @param res The Resources from which the given icon is retrieved
     * @param resId The icon's resource ID
     * @deprecated Use {@link ActionBarDrawable#ActionBarDrawable(Context, int)}
     *             as it looks for the default alternative/normal colors in the
     *             theme.
     */
    @Deprecated
    public ActionBarDrawable(Resources res, int resId) {
        this(res, res.getDrawable(resId));
    }

    /**
     * Create a new ActionBarDrawable
     * 
     * @param res The Resources from which the given icon is retrieved
     * @param d The icon's Drawable
     * @deprecated Use
     *             {@link ActionBarDrawable#ActionBarDrawable(Context, Drawable)}
     *             as it looks for the default alternative/normal colors in the
     *             theme.
     */
    @Deprecated
    public ActionBarDrawable(Resources res, Drawable d) {
        this(res, d, Color.WHITE, Color.BLACK);
    }

    /**
     * Create a new ActionBarDrawable
     * 
     * @param res The Resources from which the given icon is retrieved
     * @param resId The icon's resource ID
     * @param normalColor The color used to color the icon in normal mode
     * @param altColor The color used to color the icon in alternative mode
     * @deprecated Use
     *             {@link ActionBarDrawable#ActionBarDrawable(Context, int, int, int)}
     *             as it looks for the default alternative/normal colors in the
     *             theme.
     */
    @Deprecated
    public ActionBarDrawable(Resources res, int resId, int normalColor, int altColor) {
        // TODO Cyril: Remove this constructor or the similar Context-based one.
        // They are actually the same ...
        this(res, res.getDrawable(resId), normalColor, altColor);
    }

    /**
     * Create a new ActionBarDrawable
     * 
     * @param res The Resources from which the given icon is retrieved
     * @param d The icon's Drawable
     * @param normalColor The color used to color the icon in normal mode
     * @param altColor The color used to color the icon in alternative mode
     * @deprecated Use
     *             {@link ActionBarDrawable#ActionBarDrawable(Context, Drawable, int, int)}
     *             as it looks for the default alternative/normal colors in the
     *             theme.
     */
    @Deprecated
    public ActionBarDrawable(Resources res, Drawable d, int normalColor, int altColor) {
        // TODO Cyril: Remove this constructor or the similar Context-based one.
        // They are actually the same ...
        super(res, (d instanceof BitmapDrawable) ? ((BitmapDrawable) d).getBitmap() : null);
        mNormalCf = new LightingColorFilter(Color.BLACK, normalColor);
        mAltCf = new LightingColorFilter(Color.BLACK, altColor);
    }

    /**
     * Create a new ActionBarDrawable using the specified resource identifier.
     * 
     * @param context The Context used to retrieve resources (Bitmap/theme)
     * @param resId The resource identifier pointing to the icon's Bitmap
     */
    public ActionBarDrawable(Context context, int resId) {
        this(context, context.getResources().getDrawable(resId));
    }

    /**
     * Create a new ActionBarDrawable using the specified Drawable.
     * 
     * @param context The Context used to retrieve resources (Bitmap/theme)
     * @param d The icon's Drawable (should be a BitmapDrawable)
     */
    public ActionBarDrawable(Context context, Drawable d) {
        // TODO Cyril: Should use a Bitmap instead of a Drawable ...
        this(context, d, getColorFromTheme(context, R.attr.gdActionBarItemColorNormal, Color.WHITE), getColorFromTheme(context,
                R.attr.gdActionBarItemColorAlt, Color.BLACK));
    }

    /**
     * Create a new ActionBarDrawable using the specified resource identifier.
     * 
     * @param context The Context used to retrieve resources (Bitmap/theme)
     * @param resId The resource identifier pointing to the icon's Bitmap
     * @param normalColor The color used to color the icon in normal mode
     * @param altColor The color used to color the icon in alternative mode
     */
    public ActionBarDrawable(Context context, int resId, int normalColor, int altColor) {
        this(context, context.getResources().getDrawable(resId), normalColor, altColor);
    }

    /**
     * Create a new ActionBarDrawable using the specified Drawable.
     * 
     * @param context The Context used to retrieve resources (Bitmap/theme)
     * @param d The icon's Drawable (should be a BitmapDrawable)
     * @param normalColor The color used to color the icon in normal mode
     * @param altColor The color used to color the icon in alternative mode
     */
    public ActionBarDrawable(Context context, Drawable d, int normalColor, int altColor) {
        // TODO Cyril: Should use a Bitmap instead of a Drawable ...
        super(context.getResources(), (d instanceof BitmapDrawable) ? ((BitmapDrawable) d).getBitmap() : null);
        mNormalCf = new LightingColorFilter(Color.BLACK, normalColor);
        mAltCf = new LightingColorFilter(Color.BLACK, altColor);
    }

    private static int getColorFromTheme(Context context, int attr, int defaultColor) {
        synchronized (sTypedValue) {
            final TypedValue value = sTypedValue;
            final Theme theme = context.getTheme();
            if (theme != null) {
                theme.resolveAttribute(attr, value, true);
                if (value.type >= TypedValue.TYPE_FIRST_INT && value.type <= TypedValue.TYPE_LAST_INT) {
                    return value.data;
                }
            }

            return defaultColor;
        }
    }

    @Override
    public boolean isStateful() {
        return true;
    }

    @Override
    protected boolean onStateChange(int[] stateSet) {
        final boolean useAlt = StateSet.stateSetMatches(DrawableStateSet.ENABLED_PRESSED_STATE_SET, stateSet)
                || StateSet.stateSetMatches(DrawableStateSet.ENABLED_FOCUSED_STATE_SET, stateSet);
        setColorFilter(useAlt ? mAltCf : mNormalCf);
        return true;
    }
}




Java Source Code List

com.cyrilmottier.android.gdcatalog.AboutActivity.java
com.cyrilmottier.android.gdcatalog.ActionBarActivity.java
com.cyrilmottier.android.gdcatalog.AsyncImageViewListActivity.java
com.cyrilmottier.android.gdcatalog.BasicItemActivity.java
com.cyrilmottier.android.gdcatalog.CatalogActivity.java
com.cyrilmottier.android.gdcatalog.CatalogApplication.java
com.cyrilmottier.android.gdcatalog.InfoTabActivity.java
com.cyrilmottier.android.gdcatalog.MapPinMapActivity.java
com.cyrilmottier.android.gdcatalog.PagedViewActivity.java
com.cyrilmottier.android.gdcatalog.QuickActionActivity.java
com.cyrilmottier.android.gdcatalog.SegmentedActivity.java
com.cyrilmottier.android.gdcatalog.SimpleAsyncImageViewActivity.java
com.cyrilmottier.android.gdcatalog.TabbedActionBarActivity.java
com.cyrilmottier.android.gdcatalog.TweakedItemViewActivity.java
com.cyrilmottier.android.gdcatalog.WebContentActivity.java
com.cyrilmottier.android.gdcatalog.XmlItemActivity.java
com.cyrilmottier.android.gdcatalog.widget.HeadedTextItemView.java
com.cyrilmottier.android.gdcatalog.widget.HeadedTextItem.java
greendroid.app.ActionBarActivity.java
greendroid.app.GDActivity.java
greendroid.app.GDApplication.java
greendroid.app.GDExpandableListActivity.java
greendroid.app.GDListActivity.java
greendroid.app.GDMapActivity.java
greendroid.app.GDTabActivity.java
greendroid.graphics.drawable.ActionBarDrawable.java
greendroid.graphics.drawable.DrawableStateSet.java
greendroid.graphics.drawable.MapPinDrawable.java
greendroid.image.ChainImageProcessor.java
greendroid.image.ImageCache.java
greendroid.image.ImageLoader.java
greendroid.image.ImageProcessor.java
greendroid.image.ImageRequest.java
greendroid.image.MaskImageProcessor.java
greendroid.image.ScaleImageProcessor.java
greendroid.util.Config.java
greendroid.util.GDUtils.java
greendroid.util.Md5Util.java
greendroid.util.Time.java
greendroid.widget.ActionBarHost.java
greendroid.widget.ActionBarItem.java
greendroid.widget.ActionBar.java
greendroid.widget.AsyncImageView.java
greendroid.widget.ItemAdapter.java
greendroid.widget.LoaderActionBarItem.java
greendroid.widget.NormalActionBarItem.java
greendroid.widget.PageIndicator.java
greendroid.widget.PagedAdapter.java
greendroid.widget.PagedView.java
greendroid.widget.QuickActionBar.java
greendroid.widget.QuickActionGrid.java
greendroid.widget.QuickActionWidget.java
greendroid.widget.QuickAction.java
greendroid.widget.SegmentedAdapter.java
greendroid.widget.SegmentedBar.java
greendroid.widget.SegmentedHost.java
greendroid.widget.item.DescriptionItem.java
greendroid.widget.item.DrawableItem.java
greendroid.widget.item.Item.java
greendroid.widget.item.LongTextItem.java
greendroid.widget.item.ProgressItem.java
greendroid.widget.item.SeparatorItem.java
greendroid.widget.item.SubtextItem.java
greendroid.widget.item.SubtitleItem.java
greendroid.widget.item.TextItem.java
greendroid.widget.item.ThumbnailItem.java
greendroid.widget.itemview.DescriptionItemView.java
greendroid.widget.itemview.DrawableItemView.java
greendroid.widget.itemview.ItemView.java
greendroid.widget.itemview.LongTextItemView.java
greendroid.widget.itemview.ProgressItemView.java
greendroid.widget.itemview.SeparatorItemView.java
greendroid.widget.itemview.SubtextItemView.java
greendroid.widget.itemview.SubtitleItemView.java
greendroid.widget.itemview.TextItemView.java
greendroid.widget.itemview.ThumbnailItemView.java