MainActivity如下:
package cc.cn;
import android.animation.AnimatorInflater;
import android.animation.IntEvaluator;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
* 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
*
*/
public class MainActivity extends Activity {
private Button mScaleXFirstButton;
private Button mScaleXSecondButton;
private Button mScaleXThirdButton;
private Button mScaleXFourthButton;
private ObjectAnimator mObjectAnimator1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init(){
//------>以下为利用属性动画将Button变宽的方式一
//该方式存在的问题: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);
//------>以下为利用属性动画将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();
}
private class ViewWrapper {
private View mTargetView;
public ViewWrapper(View target) {
mTargetView = target;
}
public int getWidth() {
return mTargetView.getLayoutParams().width;
}
public void setWidth(int width) {
mTargetView.getLayoutParams().width = width;
mTargetView.requestLayout();
}
}
}
main.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/scaleXFirstButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="100dip"
android:text="scaleXFirstButton" />
<Button
android:id="@+id/scaleXSecondButton"
android:layout_width="wrap_content"
android:layout_marginLeft="100dip"
android:layout_height="wrap_content"
android:text="scaleXSecondButton" />
<Button
android:id="@+id/scaleXThirdButton"
android:layout_width="250dip"
android:layout_marginLeft="100dip"
android:layout_height="wrap_content"
android:text="scaleXThirdButton" />
<Button
android:id="@+id/scaleXFourthButton"
android:layout_width="250dip"
android:layout_marginLeft="100dip"
android:layout_height="wrap_content"
android:text="scaleXFourthButton" />
</LinearLayout>
scalexanimator.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="scaleX"
android:duration="3000"
android:valueFrom="1.0"
android:valueTo="2.0"
android:repeatCount="1"
android:repeatMode="reverse"
>
</objectAnimator>