2

我正在寻找动画我拥有的视图。它是一个列表视图项,因此当它出现在列表中时,它具有 android:layout_width 属性的 fill_parent 值。有了它,它填充了列表视图的整行。我想要发生的是,一旦将项目添加到列表中,我希望将 layout_width 设置为 wrap_content 值。我知道我可以通过更改 LayoutParams 来完成,但它不会被动画化。我所说的内容的一个很好的参考是在 Google Hangouts 应用程序中。将项目添加到对话列表后,该项目将缩放到列表视图项目上的 wrap_content。有没有人知道图书馆或者可以为我指明正确方向的东西?

4

3 回答 3

0

您无法更改布局并同时为其设置动画,但您可以做到这一点:您的项目布局必须包含put 两个子项的ViewSwitcher内部,两个,一个带有您的项目展开视图,另一个带有折叠视图. 像这样的东西:ViewSwitcherRelativeLayout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <!- Change the in and out animation for some scale animation ->
    <ViewSwitcher
        android:id="@+id/viewswitcher"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:inAnimation="@android:anim/slide_in_left"
        android:outAnimation="@android:anim/slide_out_right" >

        <RelativeLayout
            android:id="@+id/expanded_item"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <TextView
                android:id="@+id/editText_expanded"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true"
                android:ems="10"
                android:text="TextExpanded" />

        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/collapsed_item"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <TextView
                android:id="@+id/editText_collapsed"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                android:text="TextCollapsed" >
            </TextView>

        </RelativeLayout>

    </ViewSwitcher>

</RelativeLayout>

现在我不知道你什么时候想要执行动画。您有两种选择:一种是在 onFocus 事件上制作动画。两个获取您的视图实例并使用post(someRunnable). 如果您选择第一个,则当用户向下滚动并看到项目时将执行动画,即使该项目是很久以前添加的,但该项目从未获得焦点。如果您选择第二个选项,则在您添加新元素时将执行动画(我认为),无论您是否实际看到该项目。我不太确定最后一个,因为 的getView是以 BaseAdapter懒惰的方式执行的。您的适配器必须是这样的:

    public class MyListViewAdapter extends BaseAdapter {

        List<String> model;
        private LayoutInflater inflater;
        private Boolean animated;

        public MyListViewAdapter(MainActivity mainActivity,
                List<String> modelArray, Boolean anim) {
            model = modelArray;
            inflater = LayoutInflater.from(mainActivity);
            animated = anim;
        }

        @Override
        public int getCount() {
            return model.size();
        }

        @Override
        public Object getItem(int arg0) {
            return model.get(arg0);
        }

        @Override
        public long getItemId(int arg0) {
            return -1l;
        }

        @Override
        public View getView(int pos, View convertedView, ViewGroup parent) {
            if (convertedView == null) {
                convertedView = inflater.inflate(R.layout.custom_view, null, false);
            }
            TextView textCollapsed = (TextView) convertedView.findViewById(R.id.editText_collapsed);
            TextView textExpanded = (TextView) convertedView.findViewById(R.id.editText_expanded);
            textCollapsed.setText(model.get(pos));
            textExpanded.setText(model.get(pos));
            final ViewSwitcher switcher = (ViewSwitcher) convertedView.findViewById(R.id.viewswitcher);
            //First choice
            convertedView.setOnFocusChangeListener(new OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    if (hasFocus) {
                        ViewSwitcher switcher2 = (ViewSwitcher) v.findViewById(R.id.viewswitcher);
                        switcher2.showPrevious();
                    }
                }
            })
            //Second choice
            switcher.post(new Runnable() {
                @Override
                public void run() {
                    switcher.showPrevious();
                }
            });
            return convertedView;
        }

    }

那么你必须玩这个,看看会发生什么。对不起,我不能给你一个 100% 准确的答案。但我确信这是要走的路。希望能帮助到你 :]

顺便说一句,很好的问题!

于 2013-10-20T03:40:08.533 回答
0

您只需要制作自己的列表视图项布局并在其中有一个文本视图,然后您就可以管理列表项的显示方式,请参见Android listview customizationCustomizing list item throught ArrayAdapterRelated Post about it

于 2013-10-20T01:56:07.853 回答
0

如果您知道要设置动画的确切整数值(或dp, em, dip,%值),则可以使用droidQuery库来执行此操作。只需使用以下命令:

$.with(myView).animate("{width: " + widthValue /* must be an int */ + "}", new AnimationOptions().duration(1000).easing($.Easing.ACCELERATE_DECELERATE));

AnimationOptions默认情况下,持续时间为 400 毫秒和线性缓动。您还可以设置动画成功完成时调用的函数,例如:

new AnimationOptions().success(new Function() {
    @Override
    public void invoke($ d, Object... args) {
        //TODO
    }
});

如果您想使用百分比或 dp 等 - 只需将其添加到动画字符串。例如,对于 50% 的宽度,使用:

$.with(myView).animate("{width: 50%}", new AnimationOptions());

但是请记住,这可能会导致 a 出现问题ListView,因为它LayoutParams不从ViewGroup.LayoutParams.

于 2013-10-20T06:58:54.180 回答