11

我正在尝试在 Android 中完成以下 Activity 转换:

在此处输入图像描述

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是缺乏良好的物理学(以及改变它的能力)。因此,如果你想改变它,你只需要实现你自己的视图。你必须扩展它的一个子类ViewGroupAdapterView这样AdapterView就会成为你的半List。

详情

  1. setAdapter(Adapter adapter)在方法中为您的 AdapterView 设置适配器。

  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 回答