LayoutAnimation作用域ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会具有这种动画效果。
这种效果常常被用在ListView上,例如每一个item都以一定的动画效果形式出现。
- 定义LayoutAinmation(res/anim目录下)
layout_animation.xml
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="normal"
android:animation="@anim/layout_animation_translate"/>
属性含义如下:
android:delay:表示子元素开始动画的时间延迟,比如子元素入场动画的时间周期duration为300ms,那么0.5表示每个子元素都需要延迟150ms才能播放入场动画。总体来说,第一个元素延迟150ms开始播放入场动画,第二个元素延迟300ms
开始播放入场动画,依此类推。
android:animationOrder:表示子元素动画的顺序,有三种选项:normal、reverse和random,其中normal表示顺序显示,即排在前面的子元素先开始播放入场动画;reverse表示逆向显示,即排在后面的子元素先开始播放入场动画;random则是随机播放入场动画。
android:animation:为子元素指定具体的入场动画
- 为子元素指定具体的入场动画
layout_animation_translate.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:fillAfter="true">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"/>
<translate
android:fromXDelta="100%"
android:toXDelta="0"/>
</set>
- 为ViewGroup指定android:layout_animation属性
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutAnimation="@anim/layout_animation"/>
</android.support.constraint.ConstraintLayout>
- 可以使用代码设置LayoutAnimation
Animation animation = AnimationUtils.loadAnimation(this, R.anim.layout_animation);
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
listView.setLayoutAnimation(controller);
具体代码如下:
public class LayoutAnimationActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout_animation);
List<String> data = new ArrayList<>();
for (int i = 0; i < 30; i++) {
data.add("条目" + i);
}
ListView listView = findViewById(R.id.list_view);
// 代码设置LayoutAnimation
// Animation animation = AnimationUtils.loadAnimation(this, R.anim.layout_animation);
// LayoutAnimationController controller = new LayoutAnimationController(animation);
// controller.setDelay(0.5f);
// controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
// listView.setLayoutAnimation(controller);
listView.setAdapter(new LayoutAnimationAdapter(this, data));
}
private class LayoutAnimationAdapter extends BaseAdapter {
private List<String> mData;
private LayoutInflater mInflater;
LayoutAnimationAdapter(Context context, List<String> data) {
this.mData = data;
this.mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int i) {
return mData.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
LayoutAnimationViewHolder viewHolder;
if (view == null) {
view = mInflater.inflate(R.layout.layout_animation_list_item, viewGroup, false);
viewHolder = new LayoutAnimationViewHolder();
viewHolder.tvItem = view.findViewById(R.id.layout_animation_item);
view.setTag(viewHolder);
} else {
viewHolder = (LayoutAnimationViewHolder) view.getTag();
}
viewHolder.tvItem.setText(mData.get(i));
return view;
}
private class LayoutAnimationViewHolder {
TextView tvItem;
}
}
}