activity_main4.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.myapplication.Main4Activity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/bt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始"/> </LinearLayout> TextView android:id="@+id/tv" android:layout_width="100dp" android:layout_height="50dp" android:background="@android:color/holo_orange_light" android:gravity="center" android:text="Hello World!"/> </LinearLayout>
Main4Activity
package com.example.myapplication; import android.animation.TypeEvaluator; import android.animation.ValueAnimator; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.view.animation.Interpolator; import android.widget.Button; import android.widget.TextView; public class Main4Activity extends AppCompatActivity implements View.OnClickListener { /** * 开始 */ private Button mBt; /** * Hello World! */ private TextView mTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main4); initView(); } private void initView() { mBt = (Button) findViewById(R.id.bt); mBt.setOnClickListener(this); mTv = (TextView) findViewById(R.id.tv); } @Override public void onClick(View v) { switch (v.getId()) { default: break; case R.id.bt: method2(); break; } } private void method2() { ValueAnimator valueAnimator = ValueAnimator.ofObject(new MyEvaluator(), new Character('A'), new Character('Z')); valueAnimator.setInterpolator(new MyInterpolator()); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Character c = (Character) animation.getAnimatedValue(); mTv.setText(c.toString()); } }); valueAnimator.setDuration(5000); valueAnimator.start(); } private void method1() { ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 400); valueAnimator.setInterpolator(new MyInterpolator()); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { int animatedValue = (int) animation.getAnimatedValue(); mTv.layout(animatedValue, animatedValue, animatedValue + mTv.getWidth(), animatedValue + mTv .getHeight()); } }); valueAnimator.setDuration(2000); valueAnimator.start(); } class MyInterpolator implements Interpolator { @Override public float getInterpolation(float input) { Log.e("MyInterpolator", "input:" + input); return input; } } class MyEvaluator implements TypeEvaluator<Character> { @Override public Character evaluate(float fraction, Character startValue, Character endValue) { Log.e("MyInterpolator", "fraction:" + fraction + " startValue:" + (int) startValue + " endValue:" + (int) endValue); //return 起始值+fraction*(结束值-起始值) int start = (int) startValue; int end = (int) endValue; int curInt = (int)(start + fraction *(end - start)); char result = (char)curInt; return result; } } }