1

Gmailアプリ(ICS)がメッセージの削除で提供する何かを達成しようとしています。削除されたセルの下のすべての行を上に移動して、削除されたセルをカバーすることはしません。

これが動作するアニメーションです:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >

        <translate android:fromYDelta="0%" android:toYDelta="-100%"
            android:duration="@android:integer/config_mediumAnimTime"/>
        <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
            android:duration="@android:integer/config_mediumAnimTime" />

</set>

私がこれまでに思いついたのはこれだけです:

public static List<View> getCellsBelow(ListView listView, int position) {
    List<View> cells = new ArrayList<View>();       

    for (int i = position + 1; i <= listView.getLastVisiblePosition(); i++) {
        cells.add(listView.getChildAt(i));
    }

    return cells;
}

選択したセルの下にある目に見えるセルを収集し、それらをforeachでアニメーション化します。これはパフォーマンスの障害になるのではないかと思います。また、コンテンツをリロードする必要があることをアダプタに通知するのに問題があります。通常は呼びかけますnotifyDataSetChangedonAnimationEnd、今ではいくつかのアニメーションが次々と再生されています。

何か提案仲間はいますか?たぶん、いくつかのビューを刺激的にアニメーション化できるものがありますか?

4

3 に答える 3

5

更新:: Androidチームで働くChetHaaseによるこのソリューションをチェックすることをお勧めします。特にAndroid2.3以下で開発していない場合。


これはまさにあなたが望むものでなければなりません。

list.setOnItemLongClickListener(new OnItemLongClickListener() {

    @Override
    public boolean onItemLongClick(AdapterView<?> parent,
            final View view, final int position, long id) {
        removeRow(view, position);
        return true;
    }
});

private void removeRow(final View row, final int position) {
    final int initialHeight = row.getHeight();
    Animation animation = new Animation() {
        @Override
        protected void applyTransformation(float interpolatedTime,
                Transformation t) {
            super.applyTransformation(interpolatedTime, t);
            int newHeight = (int) (initialHeight * (1 - interpolatedTime));
            if (newHeight > 0) {
                row.getLayoutParams().height = newHeight;
                row.requestLayout();
            }
        }
    };
    animation.setAnimationListener(new AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }
        @Override
        public void onAnimationRepeat(Animation animation) {
        }
        @Override
        public void onAnimationEnd(Animation animation) {
            row.getLayoutParams().height = initialHeight;
            row.requestLayout();
            items.remove(position);
            ((BaseAdapter) list.getAdapter()).notifyDataSetChanged();
        }
    });
    animation.setDuration(300);
    row.startAnimation(animation);
}
于 2013-01-13T18:15:31.380 に答える
1

このために作成したListViewを試すことができます。Githubにあります。

于 2013-01-13T17:06:44.907 に答える
1

この元の作成者は、コードを要点としてここに公開しました:https ://gist.github.com/2980593そしてここにRoman Nurikからの元のGoogle+投稿があります:https ://plus.google.com/113735310430199015092/posts/Fgo1p5uWZLu

于 2013-01-13T17:24:26.183 に答える