私はこの質問が非常に興味深いと思ったので、解決策を見つけることにしました (解決策が可能な限り最適ではない場合はご容赦ください。これは、進むべき道を示すための単なる例です)。
いくつかの調査の後、私はAndroid タイマーを使用することに決めました: グローバルなアイデアは、一定の間隔で actionBar の背景を更新するタイマーを持つことです (したがって、fade_in 効果を作成するには、同じ背景を維持し、その背景を変更する必要があります不透明度)。
ここで私の実装:
最初: ほとんどの作業を行うカスタム クラス:
public class ToolbarAnimator {
private final static String TAG = ToolbarAnimator.class.getSimpleName();
private final int ALPHA_MAX = 255;//just look at the documentation
private final int NUMBER_OF_TICK = 255;//can go from 1 to 255, it's the number of tick
private final int ALPHA_PER_TICK = ALPHA_MAX / NUMBER_OF_TICK;//alpha we'll remove/add on every tick
private long DELAY = 1000;//amount of time in milliseconds before animation execution.
private final AppCompatActivity mActivity;
/*
** Private field
*/
private ActionBar mActionBar;
private Timer mTimer;
private int mCurrentAlpha;
private int mActionBarBackgroundColor;
/*
** Constructor
*/
public ToolbarAnimator(@NonNull AppCompatActivity activity, @NonNull final ActionBar actionBar, final int actionBarBackgroundColor) {
mActivity = activity;
mActionBar = actionBar;
mTimer = new Timer();
mCurrentAlpha = 0;
mActionBarBackgroundColor = actionBarBackgroundColor;
}
/*
** Public method
*/
public void start(final long duration) {
final long period = duration / NUMBER_OF_TICK;//time beetwen 2 run() call
Log.d(TAG, "start");
Log.d(TAG, "delay = " + DELAY);
Log.d(TAG, "period = " + period);
Log.d(TAG, "duration = " + duration);
Log.d(TAG, "alphaPerTick = " + ALPHA_PER_TICK);
//init a timer which will updateActionBarColor on every each period
mTimer.schedule(new TimerTask() {
@Override
public void run() {
//update the actionBar
updateActionBarColor();
}
}, DELAY, period);
}
/*
** Private method
*/
private void updateActionBarColor() {
//We have to go to the main thread for updating the interface.
mActivity.runOnUiThread(new TimerTask() {
@Override
public void run() {
//check if the animation is finish
if (mCurrentAlpha > 255 || mCurrentAlpha < 0) {
Log.d(TAG, "cancel timer");
mTimer.cancel();
mTimer.purge();
return;
}
//create the new backgroundColorDrawable
final Drawable backgroundDrawable = new ColorDrawable(mActionBarBackgroundColor);
backgroundDrawable.setAlpha(mCurrentAlpha);
//apply the new color
mActionBar.setBackgroundDrawable(backgroundDrawable);
//upgrade alpha
mCurrentAlpha += ALPHA_PER_TICK;
}
});
}
}
このクラスがある場合、任意のアクティビティまたはフラグメントからアニメーションを開始できます。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//just inflate the actionBar
getMenuInflater().inflate(R.menu.menu_main, menu);
//Check if the supportActionBar has been enable
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
//Start a 2s animation on the actionBar
new ToolbarAnimator(this, actionBar, Color.RED).start(2 * 1000);
}
return true;
}
アップデート:
より多くの機能を実装するサンプル アプリケーションを作成しました (たとえば、fade_in または fade_out を選択できます)。ソース コードはここにあります。