android 属性动画propertyname,Android中属性动画PropertyAnimation使用示例(四)

本文主要介绍利用Android属性动画将Button变宽的四种方式。方式一拉伸按钮时文字也被拉伸;方式二在特定宽度设置下无动画效果;方式三解决了方式二的问题;方式四则采用了ValueAnimator。还给出了相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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如下:

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

android:id="@+id/scaleXFirstButton"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="100dip"

android:text="scaleXFirstButton" />

android:id="@+id/scaleXSecondButton"

android:layout_width="wrap_content"

android:layout_marginLeft="100dip"

android:layout_height="wrap_content"

android:text="scaleXSecondButton" />

android:id="@+id/scaleXThirdButton"

android:layout_width="250dip"

android:layout_marginLeft="100dip"

android:layout_height="wrap_content"

android:text="scaleXThirdButton" />

android:id="@+id/scaleXFourthButton"

android:layout_width="250dip"

android:layout_marginLeft="100dip"

android:layout_height="wrap_content"

android:text="scaleXFourthButton" />

scalexanimator.xml如下:

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"

>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值