1.布局activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/iv" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" android:src="@mipmap/a" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal"> <Button android:id="@+id/bt_verticalRun" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="自由落体" /> <Button android:id="@+id/bt_parabola" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="抛物线" /> </LinearLayout> </RelativeLayout>2.代码
package com.baway.zhengshuai20170415property; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.TypeEvaluator; import android.animation.ValueAnimator; import android.graphics.PointF; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.Display; import android.view.View; import android.view.animation.LinearInterpolator; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ImageView iv; private Button bt_parabola; private Button bt_verticalRun; private int screenHeightPixels; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); bt_parabola = (Button) findViewById(R.id.bt_parabola); bt_verticalRun = (Button) findViewById(R.id.bt_verticalRun); bt_parabola.setOnClickListener(this); bt_verticalRun.setOnClickListener(this); //获取屏幕 DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); screenHeightPixels = metrics.heightPixels; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.bt_parabola://抛物线 //获取动画执行类 ValueAnimator valueAnimator = new ValueAnimator(); //设置起始座标 valueAnimator.setObjectValues(new PointF(0, 0)); valueAnimator.setDuration(3000); //插值器 valueAnimator.setInterpolator(new LinearInterpolator()); //设置类型估值 valueAnimator.setEvaluator(new TypeEvaluator<PointF>() { @Override public PointF evaluate(float fraction, PointF startValue, PointF endValue) { // fraction = t / duration PointF pointF = new PointF(); // x方向200px/s ,则y方向0.5 * 10 * t pointF.x = 200 * fraction * 3; pointF.y = 300 * (fraction * 3) * (fraction * 3); return pointF; } }); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { PointF pointF = (PointF) animation.getAnimatedValue(); //获取最终位置 iv.setX(pointF.x); iv.setY(pointF.y); } }); valueAnimator.start(); break; case R.id.bt_verticalRun://自由落体 //动画执行类 ValueAnimator animator = ValueAnimator.ofFloat(0, screenHeightPixels - iv.getHeight()); animator.setTarget(iv); animator.setDuration(4000).start(); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { //获取平移位置 float hight = (float) animation.getAnimatedValue(); iv.setTranslationY(hight); } }); break; } } }