- Demo描述:
- 利用属性动画将Button变宽的四种方式示例
-
- 参考资料:
- 1 http://blog.csdn.net/singwhatiwanna/article/details/17841165
- 2 关于属性动画的中文文档,请参见:
- http://blog.csdn.net/think_soft/article/details/7703684
- http://wiki.eoeandroid.com/Property_Animation
- Thank you very much
方法一
//该方式存在的问题:Button被拉伸的同时按钮中的文字亦被拉伸,效果不好.
//解决方法:参见以下的方式二、三和四
mScaleXFirstButton=(Button) findViewById(R.id.scaleXFirstButton);
mScaleXFirstButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mObjectAnimator1.start();
}
});
mObjectAnimator1=(ObjectAnimator)AnimatorInflater.loadAnimator(this, R.animator.scalexanimator);
mObjectAnimator1.setTarget(mScaleXFirstButton);
动画文件 scalexanimator.xml
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:propertyName="scaleX"
android:repeatCount="1"
android:repeatMode="reverse"
android:valueFrom="1.0"
android:valueTo="2.0" >
</objectAnimator>
方式二
//------>以下为利用属性动画将Button变宽的方式二
//该方式中可将Button变宽.
//但是存在一个问题:
//布局文件中scaleXSecondButton宽度的设置是android:layout_width="wrap_content"
//若将宽度改为一个具体的值比如250dip,那么此时是没有动画效果的.
//解决办法参见方式三
mScaleXSecondButton=(Button) findViewById(R.id.scaleXSecondButton);
mScaleXSecondButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ObjectAnimator.ofInt(mScaleXSecondButton, "width", 500).setDuration(2000).start();
}
});
方式三
//------>以下为利用属性动画将Button变宽的方式三
//该方法解决了在方式二中的问题.
//原因分析:
//属性动画要求动画作用的对象提供该属性的get和set方法.即在此例中
//我们要修改的是对象的width属性.所以要有该属性对应的get和set方法
mScaleXThirdButton=(Button) findViewById(R.id.scaleXThirdButton);
final ViewWrapper viewWrapper=new ViewWrapper(mScaleXThirdButton);
mScaleXThirdButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ObjectAnimator.ofInt(viewWrapper, "width", 500).setDuration(2000).start();
}
});
方式四
//------>以下为利用属性动画将Button变宽的方式四
//在该示例中主要采用了ValueAnimator
mScaleXFourthButton=(Button) findViewById(R.id.scaleXFourthButton);
mScaleXFourthButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startPropertyAnimation(mScaleXFourthButton,mScaleXFourthButton.getWidth(),500);
}
});
private void startPropertyAnimation(final View target, final int startValue, final int endValue){
final IntEvaluator intEvaluator=new IntEvaluator();
//将动画值限定在(1,100)之间
ValueAnimator valueAnimator=ValueAnimator.ofInt(1,100);
//动画持续时间
valueAnimator.setDuration(5000);
//监听动画的执行
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
//得到当前瞬时的动画值,在(1,100)之间
Integer currentAnimatedValue=(Integer) valueAnimator.getAnimatedValue();
//计算得到当前系数fraction
float fraction=currentAnimatedValue/100f;
System.out.println("currentAnimatedValue="+currentAnimatedValue+",fraction="+fraction);
//评估出当前的宽度其设置
target.getLayoutParams().width=intEvaluator.evaluate(fraction, startValue, endValue);
target.requestLayout();
}
});
//开始动画
valueAnimator.start();
}
一些文件
alphaanimator.xml
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="alpha"
android:duration="2500"
android:valueFrom="1.0"
android:valueTo="0"
android:repeatCount="1"
android:repeatMode="reverse">
</objectAnimator>
coloranimation.xml
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="backgroundColor"
android:duration="5000"
android:valueFrom="#ff0033"
android:valueTo="#000099"
android:repeatCount="infinite"
android:repeatMode="reverse"
android:valueType="intType">
</objectAnimator>
setanimator.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together" >
<objectAnimator
android:duration="3000"
android:propertyName="scaleX"
android:repeatCount="1"
android:repeatMode="reverse"
android:valueFrom="1.0"
android:valueTo="2.0" >
</objectAnimator>
<objectAnimator
android:duration="3000"
android:propertyName="scaleY"
android:repeatCount="1"
android:repeatMode="reverse"
android:valueFrom="1.0"
android:valueTo="2.0" >
</objectAnimator>
</set>
translateranimatior.xml
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="translationX"
android:duration="2000"
android:valueFrom="0"
android:valueTo="150"
android:repeatCount="1"
android:repeatMode="reverse">
</objectAnimator>
10/10/2015 10:16:44 AM