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>