Bitmapを作成して貼り付けてずらすとそれっぽい
昨日のセルを縮めるのと同じ様にアニメーションさせようとしたのだけど、どうしてもチラっと挿入後の画面が表示されてからアニメーションになってしまう…。
notifyDataSetChanged() して getView で返す View はちゃんと縮んだものを渡してるんだけどな〜。
というわけで、他の方法を探したら Stack Overflow でこんなん見つけた。
ここの一番下にある方法がこんな感じ
1. ListView の上に ListView をコピーした Bitmap を被せる。
2. ListView に新しいセルを Adapter.insert(cell, 0);
3. ListView の内容はセルが増えた内容になる。
4. 1.で ListView に被せた Bitmap を1行分下へアニメーション。
5. アニメーションが終わったら Bitmap を廃棄。
実際にやってみたのは、被せる Bitmap は ImageView として最初から Layout に置いておいて View.GONE で見えなくしておく。
で、ListView の Bitmap のコピーを ImageView にセットしたら View.VISIBLE で見える様にする。
アニメーションが終わったら、また View.GONE で見えなくしてる。
コードにするとこんな感じ。
private void addNewCell(MyCell cell) {
Bitmap bitmap = getListViewBitmap();
final ImageView imageView = (ImageView) findViewById(R.id.bitmapImageView);
imageView.setImageBitmap(bitmap);
// imageView.setBackgroundDrawable(new BitmapDrawable(getResources(), bitmap));
imageView.setVisibility(View.VISIBLE);
View cellView = mListView.getChildAt(0);
TranslateAnimation transanim = new TranslateAnimation(0, 0, 0, cellView.getHeight());
transanim.setDuration(ANIMATION_DURATION);
transanim.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationEnd(Animation animation) {
imageView.setVisibility(View.GONE);
}
@Override public void onAnimationRepeat(Animation animation) {}
@Override public void onAnimationStart(Animation animation) {}
});
mMyAnimListAdapter.insert(cell, 0);
imageView.startAnimation(transanim);
}
private Bitmap getListViewBitmap() {
mListView.setDrawingCacheEnabled(true);
Bitmap bitmap = mListView.getDrawingCache();
Bitmap bitmap1 = Bitmap.createBitmap(bitmap);
mListView.setDrawingCacheEnabled(false);
return bitmap1;
}今回は ListView の一番上にのみセルを増やすことを考えているので、セルを増やす位置は常に 0番目。
なので、上から下へのアニメーションだけ考えれば良いけど、任意の位置に入れる時は下から上のアニメーションも用意しないといけない。(1番下に挿入の時用)
ところで、オリジナルのコードもここにあるコードも、どちらも取得できる Bitmap は背景が抜けているものになる。
なのでそのままでアニメーションすると、背景にある新しい状態の ListView が見えながら被さっている ImageView が移動するのでとっても間抜け。
どうやったら背景まで含めて Bitmap を作れるのかわからなかったので、結局 ImageView の背景を #ffececec で塗りつぶしてしまった…。
そしたら ListView の背景って画面上部と下部で微妙にグラデーションかかってて違うみたいで、切り替わりの時に若干の明るさの違いが気になるかもしれない。
というわけで、出来上がったセルを加えるアニメーション。
まぁそれっぽくは見えるかな。
サンプルのコードは GitHub に置いておいた。