简体   繁体   English

如何为每个listview项目制作翻译动画

[英]how to make translation animation for each listview items

i have a listview with override getView method to populate it. 我有一个listview与覆盖getView方法来填充它。 now, i want to make each item of the list to animate or moving from the right side of the screen to the left side where the item should normally appear. 现在,我想让列表中的每个项目动画或从屏幕右侧移动到项目正常出现的左侧。

the animation of each item should not start at the same time, it must delay for couple ms before the other items moving... 每个项目的动画不应该同时开始,它必须在其他项目移动之前延迟几毫秒...

well, this is my adapter class: 好吧,这是我的适配器类:

public class MyAdapter extends ArrayAdapter<String>{

    private Context context;
    private String[] info;

    public MyAdapter(Context context, int resource,
            String[] objects) {
        super(context, resource, objects);
        // TODO Auto-generated constructor stub
        this.context = context;
        this.info = objects;

    }

    protected class RowViewHolder {
        public TextView text1;
        public CheckBox cb;
        public String ss;
    }

    @Override
    public View getView(int pos, View inView, ViewGroup parent) {
           View vix = inView;

           RowViewHolder holder;

           if (vix == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                vix = inflater.inflate(R.layout.check_list, null);
           }    
                holder = new RowViewHolder();

                holder.text1 = (TextView) vix.findViewById(R.id.info_group);
                holder.text1.setText(info[pos]);

                holder.ss = info[pos];

                holder.cb = (CheckBox) vix.findViewById(R.id.check);
                holder.cb.setTag(holder.ss);
                holder.cb.setOnCheckedChangeListener(CbListen);

                vix.setTag(holder);

           return vix;
    }

    private OnCheckedChangeListener CbListen = new OnCheckedChangeListener(){
        @Override
        public void onCheckedChanged(CompoundButton com, boolean pool) {
            // TODO Auto-generated method stub
            String state = (com.getTag()).toString();

            if(com.isChecked()){
                System.out.println(state+" CHECKED");
            }else{
                System.out.println(state+" UNCHECKED");
            }
        }
    };

}

any idea? 任何的想法? :) :)

UPDATE UPDATE

Well, surely it is! 嗯,肯定是! LOL :p 哈哈:p

just download those ApiDemos "like what have Farhan said" and you guys will find some kind like LayoutAnimation2 sample at the package view. 只需下载那些ApiDemos“就像Farhan所说的那样”,你们会在包视图中找到类似LayoutAnimation2样本的东西。

there, each items of the list is being animated to populate downward by translate-animation while the alpha is changing respectively. 在那里,列表的每个项目都被动画化,以便在alpha分别改变时通过翻译动画向下填充。

here's what i do for my case: 这是我为我的案子做的事情:

AnimationSet set = new AnimationSet(true);

    Animation animation = new AlphaAnimation(0.0f, 1.0f);
    animation.setDuration(500);
    set.addAnimation(animation);

    animation = new TranslateAnimation(
        Animation.RELATIVE_TO_SELF, 50.0f,Animation.RELATIVE_TO_SELF, 0.0f,
        Animation.RELATIVE_TO_SELF, 0.0f,Animation.RELATIVE_TO_SELF, 0.0f
    );
    animation.setDuration(1000);
    set.addAnimation(animation);

    LayoutAnimationController controller = new LayoutAnimationController(set, 0.5f);

    group_list.setLayoutAnimation(controller);

i put this below my setAdapter() function, you guys can make it look more cozy with accelerate-decelerate etc effects. 我把它放在我的setAdapter()函数下面,你们可以通过加速 - 减速等效果让它变得更加舒适。

:p :p

@ user724861 has given the perfect answer!! @ user724861给出了完美答案! how ever i found it's confusing where to put the code he has suggested...i put that code in my ListFragment activity as follow.. 我怎么发现它把他建议的代码放在哪里令人困惑...我把这些代码放在我的ListFragment活动中 ,如下所示..

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);        

    AnimationSet set = new AnimationSet(true);
    Animation animation = new AlphaAnimation(0.0f, 1.0f);
    animation.setDuration(300);
    set.addAnimation(animation);

    /*animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 50.0f,
            Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,
            0.0f, Animation.RELATIVE_TO_SELF, 0.0f);
    animation.setDuration(10);
    set.addAnimation(animation); just comment if you don't want :) */ 
    LayoutAnimationController controller = new LayoutAnimationController(
            set, 0.5f);

    lv.setLayoutAnimation(controller);

    adapter = new LazyAdapter(getActivity(), numResults, nodes, tabType);
    setListAdapter(adapter);
}

Using LayoutAnimations! 使用LayoutAnimations!

In the docs you can set via android:layoutAnimation xml attr 在你可以通过android:layoutAnimation xml attr设置的文档中

see here 看这里

the animation of each item should not start at the same time 每个项目的动画不应该同时开始

If you want it, you can do something like this: 如果你想要它,你可以这样做:

layout_controller.xml: layout_controller.xml:

<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="30%"
android:animation="@anim/scale" />

scale.xml: scale.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<scale
  android:fromXScale="0.1"
  android:toXScale="1"
  android:fromYScale="0.1"
  android:toYScale="1.0"
  android:duration="800"
  android:pivotX="10%"
  android:pivotY="10%"
  android:startOffset="100" />
</set>

And then in your Java after SetListAdapter() paste the following code: 然后在您的Java中,在SetListAdapter()之后粘贴以下代码:

LayoutAnimationController controller = AnimationUtils.loadLayoutAnimation(
 this, R.anim.layout_controller);
getListView().setLayoutAnimation(controller);

note that "android:delay" makes animations start with delay after previous one. 请注意,“android:delay”会让动画从前一个动画开始。

getView() populate each items in your activity. getView()填充活动中的每个项目。 try to create your animation into getView with Timer . 尝试使用Timer将动画创建到getView中。

package com.Animation1;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.AdapterView;
import java.util.ArrayList;

public class Animation1Activity extends ListActivity implements 
                                AdapterView.OnItemSelectedListener {
    Animation anim = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        anim = AnimationUtils.loadAnimation( this, R.anim.magnify );
        setContentView(R.layout.main);
        ListView v = getListView();     // set up item selection listener
        v.setOnItemSelectedListener( this );    // see OnItemSelectedListener methods below
        ArrayList<String> items = new ArrayList<String>();
        items.add( "Red" );
        items.add( "Grey" );
        items.add( "Cyan" );
        items.add( "Blue" );
        items.add( "Green" );
        items.add( "Yellow" );
        items.add( "Black" );
        items.add( "White" );
        ArrayAdapter itemsAdapter = new ArrayAdapter( this, R.layout.row, items );
        setListAdapter( itemsAdapter );
    }

    protected void onListItemClick(ListView l, 
                                    View v, 
                                    int position,
                                    long id) {
      v.startAnimation( anim );
    }

// --- AdapterView.OnItemSelectedListener methods --- 
    public void onItemSelected(AdapterView parent, 
            View v, 
            int position, 
            long id) {
      v.startAnimation( anim );
    }

    public void onNothingSelected(AdapterView parent) {}
}

Simply add in your listview activity parent layout 只需添加listview活动父布局即可

Android:animatelayoutchanges="true" 安卓:animatelayoutchanges = “真”

Enjoy! 请享用!

You can also set the animation using xml attribute Layout animation of your ListView. 您还可以使用ListView的xml属性布局动画设置动画。 You can create any type of animation using in xml file under res/anim folder. 您可以使用res / anim文件夹下的xml文件创建任何类型的动画。 It will be helpful if you want to reuse it for any other listview and will also manage your code well. 如果您想将其重用于任何其他列表视图并且还能很好地管理您的代码,将会很有帮助。

Please let me know if you need help regarding animation creation in xml. 如果您需要有关xml中动画创建的帮助,请告诉我。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM