動態改變actionbar上menu的圖標

工做中遇到了一個需求是,在滾動的時候讓actionbar上的圖標進行變色。實現後在這裏總結下思路。android

 

1、先在主題中定義好Actionbar的styleide

 <style name="AppTheme" parent="BaseTheme">

        <item name="actionBarStyle">@style/NAActionBarStyle</item>
        <item name="actionBarSize">@dimen/actionbar_height</item>
<item name="actionBarItemBackground">@drawable/action_bar_selector</item>

<item name="actionOverflowButtonStyle">@style/MyOverFlow.Dark</item> <item name="homeAsUpIndicator">@drawable/action_bar_icon_back_dark</item> </style>

 

2、分區域進行改變post

2.1 改變最左邊的返回按鈕ui

getSupportActionBar().setHomeAsUpIndicator(R.drawable.action_bar_icon_back_light);

 

2.2 改變文字的顏色和透明度spa

這個比較複雜,首先要定義這樣一個類:code

package com.duitang.main.util;

import android.graphics.Color;
import android.os.Parcel;
import android.support.annotation.NonNull;
import android.text.TextPaint;
import android.text.style.ForegroundColorSpan;

/**
 * Created by YlorD on 14-12-16.
 * @author YlorD
 * @since v3.7
 * from Cyril Mottier
 */
public class AlphaForegroundColorSpan extends ForegroundColorSpan {

    private float mAlpha;

    public AlphaForegroundColorSpan(int color) {
        super(color);
    }

    public AlphaForegroundColorSpan(Parcel src) {
        super(src);
    }

    @Override
    public void updateDrawState(@NonNull TextPaint ds) {
        ds.setColor(getAlphaColor());
    }

    public float getAlpha() {
        return mAlpha;
    }

    public void setAlpha(float alpha) {
        mAlpha = alpha;
    }

    private int getAlphaColor() {
        int foregroundColor = getForegroundColor();
        return Color.argb((int) (mAlpha * 255), Color.red(foregroundColor),
                Color.green(foregroundColor), Color.blue(foregroundColor));
    }
}

而後在代碼中動態調用actionbar的setTitle方法就行。blog

    private AlphaForegroundColorSpan mAlphaForegroundColorSpan;

    private SpannableStringBuilder mSpannableStringBuilder;
mAlphaForegroundColorSpan = new AlphaForegroundColorSpan(getResources().getColor(R.color.dark));
    private void setTitleAlpha(float alpha) {
        mAlphaForegroundColorSpan.setAlpha(alpha);
        mSpannableStringBuilder.setSpan(mAlphaForegroundColorSpan, 0,
                mSpannableStringBuilder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        getSupportActionBar().setTitle(mSpannableStringBuilder);
    }

 

2.3 改變最右邊的menu圖標ip

    MenuItem moreItem;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        moreItem = menu.add(Menu.NONE, Menu.FIRST, Menu.FIRST, null);
        moreItem.setIcon(R.drawable.action_bar_icon_more);
        moreItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        
        return super.onCreateOptionsMenu(menu);
    }

動態改變get

 if (moreItem != null) {
     moreItem.setIcon(R.drawable.action_bar_icon_more_light);
 }

 

2.4 改變最右邊的OverFlowstring

若是是多個menuItem聚合在了一塊兒,那麼就會顯示三個小點。怎麼動態改變這三個小點的圖標呢?

在style中定義好overFlow的樣式:

<style name="MyOverFlow.Dark" parent="@style/Widget.AppCompat.Light.ActionButton.Overflow">
        <item name="android:src">@drawable/action_bar_icon_more_dark</item>
        <item name="android:contentDescription">@string/accessibility_overflow</item>
</style>

這裏面的關鍵點在於寫了一個contentDescription,做爲overFlow的標識。而後在代碼中寫上以下的代碼:

private TintImageView overflow;
      // The content description used to locate the overflow button
        final String overflowDesc = getString(R.string.accessibility_overflow);
        // The top-level window
        final ViewGroup decor = (ViewGroup) getWindow().getDecorView();
        // Wait a moment to ensure the overflow button can be located
        decor.post(new Runnable() {
            @Override
            public void run() {
                // The List that contains the matching views
                final ArrayList<View> outViews = new ArrayList<>();
                // Traverse the view-hierarchy and locate the overflow button
                decor.findViewsWithText(outViews, overflowDesc, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
                // Guard against any errors
                if (outViews.isEmpty()) {
                    return;
                }
                // Do something with the view
                overflow = (TintImageView) outViews.get(0);
            }
        });

以後就能夠在代碼中動態的改變了:

        if (overflow != null) {
                overflow.setImageResource(R.drawable.action_bar_icon_more_light);
            }

參考自:http://stackoverflow.com/questions/22046903/changing-the-android-overflow-menu-icon-programmatically

相關文章
相關標籤/搜索