11

Androidで次のアクティビティ遷移を実行しようとしています。

ここに画像の説明を入力してください

1では、通常のListViewが表示されます。ここで(2)、ListView要素に指を置き、指を左にスライドすると、指が置かれている要素を除いて、他のすべてのListView要素が移動します。遷移が完了すると、「選択された」ListView要素が画面上に展開され、一部のコンテンツが表示されます。

質問:この移行はストックAPI関数で可能ですか?

4

5 に答える 5

5

JellyBean以上をターゲットにしている場合は、ActivityOptionsクラスを使用してアクティビティ起動アニメーションをカスタマイズできます。

これを実現するための擬似コードは次のとおりです。

Intent i = //the intent for the new activity
View v = //the selected list item
Bundle bundle = ActivityOptions.makeScaleUpAnimation(v, 0, 0, v.getWidth(), v.getHeight()).toBundle();
startActivity(i, bundle);
于 2013-02-03T06:19:22.257 に答える
4

@hasanghaforianは技術的には正しいですが、AdapterViewのサブクラス化は非常に困難です。このアプローチを採用することをお勧めします。完全に機能する例を含めました。

  1. ListViewビューをrelativeLayoutに配置します
  2. OnClickで、レンダラーのコピーを膨らませます
  3. ListViewの親との関係でレンダラーが配置されている場所のグローバル座標を検索します
  4. コピーしたレンダラーをRelativeLayout(ListViewの親)に追加します
  5. listViewを離れてアニメーション化する
  6. そのアニメートの最後に、新しいレンダラーをアニメートします
  7. 利益!
public class MainActivity extends Activity {

    private RelativeLayout layout;
    private ListView listView;
    private MyRenderer selectedRenderer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        layout = new RelativeLayout(this);
        setContentView(layout);
        listView = new ListView(this);
        RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
        layout.addView(listView, rlp);

        listView.setAdapter(new MyAdapter());
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                // find out where the clicked view sits in relationship to the
                // parent container
                int t = view.getTop() + listView.getTop();
                int l = view.getLeft() + listView.getLeft();

                // create a copy of the listview and add it to the parent
                // container
                // at the same location it was in the listview
                selectedRenderer = new MyRenderer(view.getContext());
                RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(view.getWidth(), view
                        .getHeight());
                rlp.topMargin = t;
                rlp.leftMargin = l;
                selectedRenderer.textView.setText(((MyRenderer) view).textView.getText());
                layout.addView(selectedRenderer, rlp);
                view.setVisibility(View.INVISIBLE);

                // animate out the listView
                Animation outAni = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0f,
                        Animation.RELATIVE_TO_SELF, -1f, Animation.RELATIVE_TO_SELF, 0f,
                        Animation.RELATIVE_TO_SELF, 0f);
                outAni.setDuration(1000);
                outAni.setFillAfter(true);
                outAni.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {
                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                        ScaleAnimation scaleAni = new ScaleAnimation(1f, 
                                1f, 1f, 2f, 
                                Animation.RELATIVE_TO_SELF, 0.5f,
                                Animation.RELATIVE_TO_SELF, 0.5f);
                        scaleAni.setDuration(400);
                        scaleAni.setFillAfter(true);
                        selectedRenderer.startAnimation(scaleAni);
                    }
                });

                listView.startAnimation(outAni);
            }
        });
    }

    public class MyAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return 10;
        }

        @Override
        public String getItem(int position) {
            return "Hello World " + position;
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            MyRenderer renderer;
            if (convertView != null)
                renderer = (MyRenderer) convertView;
            else
                renderer = new MyRenderer(MainActivity.this);
            renderer.textView.setText(getItem(position));
            return renderer;
        }
    }

    public class MyRenderer extends RelativeLayout {

        public TextView textView;

        public MyRenderer(Context context) {
            super(context);
            setPadding(20, 20, 20, 20);
            setBackgroundColor(0xFFFF0000);

            RelativeLayout.LayoutParams rlp = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
            rlp.addRule(CENTER_IN_PARENT);
            textView = new TextView(context);
            addView(textView, rlp);
        }

    }
}
于 2013-02-05T19:45:55.820 に答える
3

この規格の欠点は、ListView優れた物理特性(およびそれを変更する機能)がないことです。したがって、変更する場合は、独自のビューを実装する必要があります。AdapterViewがセミリストになるように、そのサブクラスViewGroupを拡張する必要があります。AdapterView

詳細

  1. メソッド内のAdapterViewのアダプタを設定しますsetAdapter(Adapter adapter)

  2. onLayoutメソッドをオーバーライドしてアイテムAdapterViewをリストに追加します。アイテムを測定して、リスト(実際にはAdapterView)の正しい位置にあるチャイルドビューとして追加する必要があります。

  3. onTouchEvent()をオーバーライドして、リストをスクロールできるようにします。また、ここですべての魔法を実行する必要があります。ユーザーがアイテムに強く触れると、リストはスクロールする必要があり、水平に触れると、リストの他のアイテムの位置を変更する必要があります。ユーザーが画面から指を離すときは、他のアイテムを表示するか、選択したアイテムを伸ばすかを決定する必要があります。

サンプル

独自の3Dリスト(およびその記事のパート2)を作成すると、私が表示する内容の良いデモンストレーションが得られます。その目的は、3Dリストを作成することです。詳細、スニペットコード、および完全なコードを確認できます。ただし、変更する必要があります。onTouchEvent()あなたが望むものに到達するために。

これはAPI1でも実行できます

これがお役に立てば幸いです。

于 2013-02-03T18:28:09.927 に答える
0

xmlファイルのListViewの下で、別の線形レイアウト/相対レイアウトを取得し、必要に応じて設計しますが、その可視性をなくす必要があることを確認してください。リストビューアイテムをタップしたら、コンテンツを入力し、これをすべて長押しします。アニメーションの場合は、左に拡大縮小します。

于 2013-02-06T08:18:53.573 に答える
0

そのリスト要素を押すと、このアニメーションを呼び出す必要があります。アニメーションを実行する必要があります。そのアニメーションでは、それを設計する必要があります。これらのアニメーションでは、画像を使用する場合は、9つのパッチ画像を使用します。

于 2013-02-06T11:09:35.987 に答える