1
問題結束動畫效果的Android的ListView頭高度產生閃爍的動畫
我試圖動畫的ListView頭高度。我可以正確地獲得動畫,但動畫完成後,ListView閃爍。
嘗試和失敗
- 使用
AnimationSet.setFillAfter()
不改變佈局PARAMS。動畫效果很好,但當您開始滾動列表時,標題會跳回到原始位置。 - 使用
AnimationSet.setFillAfter()
與在onAnimationEnd()
上應用的新佈局參數。動畫結束後,標題跳轉到所需高度的兩倍(動畫高度加上佈局參數中設置的高度)。當你開始滾動列表時,標題捕捉到所需的高度。
代碼
if (mSearchAdapter.getCount() > 0 && mListView.getChildAt(0) == mHeaderPlaceholder) {
Log.i(TAG, "Animating list view to make room for info bar");
AnimationSet slideAnimation = new AnimationSet(true);
TranslateAnimation translate = new TranslateAnimation(0, 0, 0, newHeight);
translate.setDuration(mInfoBarAnimationDuration);
translate.setInterpolator(new DecelerateInterpolator());
slideAnimation.addAnimation(translate);
slideAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
isAnimatingViewTransition = true;
}
@Override
public void onAnimationEnd(Animation animation) {
isAnimatingViewTransition = false;
final AbsListView.LayoutParams layoutParams = (AbsListView.LayoutParams) mHeaderPlaceholder.getLayoutParams();
layoutParams.height = newHeight;
mHeaderPlaceholder.setLayoutParams(layoutParams);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mListView.startAnimation(slideAnimation);
} else {
Log.i(TAG, "Adjusting list view header to make room for info bar");
mHeaderPlaceholder.getLayoutParams().height = newHeight;
}
我覺得閃爍可以通過偵聽並重寫事件onPreDraw()
或ListView控件的ViewTreeObserver的onGlobalLayout()
避免。但我不知道我能如何實現它。
任何幫助非常感謝!