1.layout切换动画
代码:
本示例是fragment切换.在它的oncreateView中
public class LayoutAnimationFrgmt extends Fragment {
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public View onCreateView(LayoutInflater inflater, ViewGroup container,
<span style="white-space:pre"> </span>Bundle savedInstanceState) {
<span style="white-space:pre"> </span>super.onCreateView(inflater, container, savedInstanceState);
<span style="white-space:pre"> </span>// TODO Auto-generated method stub
<span style="white-space:pre"> </span>RelativeLayout rl = (RelativeLayout) inflater.inflate(R.layout.fragment_layout_animation, container,
<span style="white-space:pre"> </span>false);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>ScaleAnimation sa = new ScaleAnimation(0,1,0,1);
<span style="white-space:pre"> </span>sa.setDuration(350);
<span style="white-space:pre"> </span>LayoutAnimationController lac = new LayoutAnimationController(sa,0.5f);//0.5f是第后续控件的间隔
<span style="white-space:pre"> </span>lac.setOrder(LayoutAnimationController.ORDER_REVERSE);//设置动画方向,ORDER_REVERSE是反向
<span style="white-space:pre"> </span>rl.setLayoutAnimation(lac);
<span style="white-space:pre"> </span>return rl;
<span style="white-space:pre"> </span>}
}
2.layout内容变化时的动画
2.1 在相应的layout的xml里 android:animateLayoutChanges="true"
<?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"
android:orientation="vertical"
android:id="@+id/fragment_layout_changed_animation"
<span style="color:#ff0000;">android:animateLayoutChanges="true"</span>>
<TextView
android:id="@+id/flatv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="@string/add_button" />
</RelativeLayout>
public class LayoutChangedAnimationFrgmt extends Fragment implements OnClickListener {
private RelativeLayout rl;
private TextView tv;
LayoutTransition mTransition;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreateView(inflater, container, savedInstanceState);
rl = (RelativeLayout) inflater.inflate(R.layout.fragment_layout_changed_animation, container,false);
mTransition = new LayoutTransition();
rl.setLayoutTransition(mTransition);
<span style="color:#ff0000;">setupCustomAnimations</span>();//初始化动画
tv = (TextView) rl.findViewById(R.id.flatv);
return rl;
}
// LayoutTransition 生成自定义动画
private void <span style="color:#ff0000;">setupCustomAnimations</span>() {
// 动画:CHANGE_APPEARING
// Changing while Adding
PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", 0, 1);
PropertyValuesHolder pvhTop = PropertyValuesHolder.ofInt("top", 0, 1);
PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right", 0,
1);
PropertyValuesHolder pvhBottom = PropertyValuesHolder.ofInt("bottom",
0, 1);
PropertyValuesHolder pvhScaleX = PropertyValuesHolder.ofFloat("scaleX",
1f, 0f, 1f);
PropertyValuesHolder pvhScaleY = PropertyValuesHolder.ofFloat("scaleY",
1f, 0f, 1f);
final ObjectAnimator changeIn = ObjectAnimator.ofPropertyValuesHolder(
this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhScaleX,
pvhScaleY).setDuration(
mTransition.getDuration(LayoutTransition.CHANGE_APPEARING));
mTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, changeIn);
changeIn.addListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator anim) {
View view = (View) ((ObjectAnimator) anim).getTarget();
// View也支持此种动画执行方式了
view.setScaleX(1f);
view.setScaleY(1f);
}
});
// 动画:CHANGE_DISAPPEARING
// Changing while Removing
Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
Keyframe kf1 = Keyframe.ofFloat(.9999f, 360f);
Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe(
"rotation", kf0, kf1, kf2);
final ObjectAnimator changeOut = ObjectAnimator
.ofPropertyValuesHolder(this, pvhLeft, pvhTop, pvhRight,
pvhBottom, pvhRotation)
.setDuration(
mTransition
.getDuration(LayoutTransition.CHANGE_DISAPPEARING));
mTransition
.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeOut);
changeOut.addListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator anim) {
View view = (View) ((ObjectAnimator) anim).getTarget();
view.setRotation(0f);
}
});
// 动画:APPEARING
// Adding
ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "rotationY", 90f,
0f).setDuration(
mTransition.getDuration(LayoutTransition.APPEARING));
mTransition.setAnimator(LayoutTransition.APPEARING, animIn);
animIn.addListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator anim) {
View view = (View) ((ObjectAnimator) anim).getTarget();
view.setRotationY(0f);
}
});
// 动画:DISAPPEARING
// Removing
ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "rotationX", 0f,
90f).setDuration(
mTransition.getDuration(LayoutTransition.DISAPPEARING));
mTransition.setAnimator(LayoutTransition.DISAPPEARING, animOut);
animOut.addListener(new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator anim) {
View view = (View) ((ObjectAnimator) anim).getTarget();
view.setRotationX(0f);
}
});
}//其它方法略...
}
3.ListViewLayout的动画(用代码和xml配置两个方法实现)
3.1 代码实现
public class LayoutAnimInListViewCodeAty extends ListActivity {
private ArrayAdapter<String> adapter;
private String [] datas;
private LayoutAnimationController lac;
private TranslateAnimation ta;
private ScaleAnimation sa;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_layout_list_view);ListActivity不用它.
datas = new String[]{"hei","bai","hooo","lvv","lann"};
adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,datas);
setListAdapter(adapter);
ta = new TranslateAnimation(0,1,0,1);
sa = new ScaleAnimation(0,1,0,1);
sa.setDuration(1000);
// lac = new LayoutAnimationController(ta,0.5f);
lac = new LayoutAnimationController(sa,0.5f);
getListView().setLayoutAnimation(lac);
}
<span style="white-space:pre"> </span>//其它略...
}
代码部分:
public class LayoutAnimInListViewXmlAty extends ListActivity {
private ArrayAdapter<String> adapter;
private String[] datas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout_anim_in_list_xml_aty);
datas = new String[] { "hei", "bai", "hooo", "lvv", "lann" };
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, datas);
setListAdapter(adapter);
}
@Override
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.layoutanimation.LayoutAnimInListViewXmlAty" >
<ListView
<span style="font-size:24px;color:#ff0000;">android:id="@android:id/list"</span>
android:layout_width="match_parent"
android:layout_height="match_parent"
<span style="color:#ff0000;">android:layoutAnimation="@anim/listview_anim"</span> >
</ListView>
</RelativeLayout>
layout动画配置文件:listview_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/scale_xml_anim"
android:delay="0.5" >
</layoutAnimation>
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromXScale="0"
android:fromYScale="0"
android:toXScale="1"
android:toYScale="1" >
</scale>