listView调整动画大小

时间:2014-08-22 09:46:19

标签: android performance android-layout

我有这个自定义listView:

<?xml version="1.0" encoding="utf-8"?>
<TableRow
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tableRow">

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
       android:layout_height="fill_parent"
        android:src="@drawable/ic_launcher"
        android:contentDescription="@string/imdDesc" />

    <TextView
        android:id="@+id/titleList"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:textSize="25sp"
        android:autoText="false"
        android:gravity="center_vertical|center|center_horizontal" />
</TableRow>

此适配器:

    public class CustomList extends ArrayAdapter<String> {
    private final Activity context;
    private final String[] title;
    private final int[] colors;
    private final Integer[] imageId;
    public CustomList(Activity context,String[] title,int[] colors, Integer[] imageId) {
        super(context, R.layout.list_single, title);
        this.context = context;
        this.title = title;
        this.imageId = imageId;
        this.colors=colors;
    }
    @Override
    public View getView(int position, View view, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView= inflater.inflate(R.layout.list_single, null, true);
        TextView txtTitle = (TextView) rowView.findViewById(R.id.titleList);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.img);
        txtTitle.setText(title[position]);
        txtTitle.setTextColor(Color.parseColor("#FFffffff"));
        txtTitle.setBackgroundColor(colors[position]);
        imageView.setImageResource(imageId[position]);
        return rowView;
       }
    }

这就是我绑定它们的方式:

    final CustomList adapter = new
                CustomList(MainActivity.this, title, colors, imageId);
        list = (ListView) findViewById(R.id.list);
        list.setAdapter(adapter);

我的清单有12个项目。当用户单击一个项目时,我需要调整列表的大小。如果用户第一次选择项目,则列表必须将其宽度更改为其原始大小的1/3,并使所选项目的高度加倍。如果已在列表中选择了某个项目并且用户选择了另一个项目,则旧项目必须返回到原始高度,并且新选择的项目必须将其高度加倍而不更改任何宽度。 我希望为所有调整大小设置动画效果。

这是改变宽度的动画:

   public class ShrinkList extends Animation
    {
    int fromWidth;
    View view;
    int def;
    public ShrinkList(View view) {
        this.view = view;
        this.fromWidth = view.getWidth();
        def=fromWidth/3;
    }
   @Override
    public boolean willChangeBounds() {
        return true;
    }

    @Override
    public void initialize(int width, int height, int parentWidth,
                           int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
    }
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        int newWidth;
        newWidth = (int) ((def - fromWidth) * interpolatedTime + fromWidth);
        if (newWidth > def/3) {
            view.getLayoutParams().width = newWidth;
            view.requestLayout();
        }
        else{
            view.getLayoutParams().width = def/3;
            view.requestLayout();
        }
    }
    }

这个用于改变身高:

    public class Grow extends Animation
    {
    int fromHeight;
    View view;
    int defaultHeight;

    public Grow(View view,int height) {
        this.view = view;
        this.fromHeight = view.getHeight();
        defaultHeight=height;
    }
   @Override
    public boolean willChangeBounds() {
        return true;
    }
    @Override
    public void initialize(int width, int height, int parentWidth,
                           int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
    }
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        int newHeight;
        newHeight = (int) (fromHeight / (1 - interpolatedTime));
            if (newHeight < defaultHeight * 2) {
                view.getLayoutParams().height = newHeight;
                view.requestLayout();
            }
        else{
                view.getLayoutParams().height = defaultHeight*2;
                view.requestLayout();
            }
        }
    }

我就这样玩:

    if(h==0) {  //first time the user selects an item =>change width and height
                   Animation a = new ShrinkList(list);
                   a.setInterpolator(new LinearInterpolator());
                   a.setDuration(1000);
                   list.setAnimation(a);
                   list.startAnimation(a);
              }
    Animation a1 = new Grow(view,height); //change only height
                a1.setInterpolator(new LinearInterpolator());
                a1.setDuration(300);
                view.setAnimation(a1);
                view.startAnimation(a1);

我的问题是,当列表更改其宽度时,动画根本不是平滑的,它只会改变宽度,而不是高度。

如何让动画更流畅,让两个动画一次播放?

我尝试过扩展列表,但这会扩展所有列表。基本上我只需要在ListView中调整textView并更改layoutParams就可以了。

我试图将Grow.java中的代码插入到onfer中的ShrinkList.Java中,以便播放两次动画,并且只播放Grow.java中的动画。

0 个答案:

没有答案