工做中遇到了一個需求是,在滾動的時候讓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