源码
MainActivity.java

public class MainActivity extends AppCompatActivity {  //ui  private Button btnOne;  private Button btnTwo;  private Button btnAnim;  //data  private int screenHeight;  private int screenWidth;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//设置透明状态栏    setContentView(R.layout.activity_main);    screenHeight=getResources().getDisplayMetrics().heightPixels;    screenWidth=getResources().getDisplayMetrics().widthPixels;    initViews();  }  private void initViews() {    btnOne = findViewById(R.id.btn_one);    btnTwo = findViewById(R.id.btn_two);    btnAnim = findViewById(R.id.btn_anim);    final ValueAnimator valueAnimator=new ValueAnimator();    valueAnimator.setDuration(2000);    valueAnimator.setObjectValues(new PointF(0, 0));    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {      @Override      public void onAnimationUpdate(ValueAnimator animation) {        PointF point = (PointF) animation.getAnimatedValue();        btnAnim.setX(point.x);        btnAnim.setY(point.y);      }    });    btnOne.setOnClickListener(new View.OnClickListener() {      @Override public void onClick(View v) {        valueAnimator.setEvaluator(new TypeEvaluator() {          @Override public Object evaluate(float fraction, Object startValue, Object endValue) {            return BezierUtil.calculateBezierPointForQuadratic(fraction,                new PointF(btnAnim.getLeft(), btnAnim.getTop()),                new PointF(screenWidth, screenHeight/2),                new PointF(btnAnim.getLeft(), screenHeight));          }        });        valueAnimator.start();      }    });    btnTwo.setOnClickListener(new View.OnClickListener() {      @Override public void onClick(View v) {        valueAnimator.setEvaluator(new TypeEvaluator() {          @Override public Object evaluate(float fraction, Object startValue, Object endValue) {            return BezierUtil.calculateBezierPointForCubic(fraction,                new PointF(btnAnim.getLeft(), btnAnim.getTop()),                new PointF(screenWidth, screenHeight/3),                new PointF(0, screenHeight/3*2),                new PointF(btnAnim.getLeft(), screenHeight));          }        });        valueAnimator.start();      }    });  }}

BezierUtil.java

public class BezierUtil {  /**   * B(t) = (1 - t)^2 * P0 + 2t * (1 - t) * P1 + t^2 * P2, t ∈ [0,1]   *   * @param t 曲线长度比例   * @param p0 起始点   * @param p1 控制点   * @param p2 终止点   * @return t对应的点   */  public static PointF calculateBezierPointForQuadratic(float t, PointF p0, PointF p1, PointF p2) {    PointF point = new PointF();    float temp = 1 - t;    point.x = temp * temp * p0.x + 2 * t * temp * p1.x + t * t * p2.x;    point.y = temp * temp * p0.y + 2 * t * temp * p1.y + t * t * p2.y;    return point;  }  /**   * B(t) = P0 * (1-t)^3 + 3 * P1 * t * (1-t)^2 + 3 * P2 * t^2 * (1-t) + P3 * t^3, t ∈ [0,1]   *   * @param t 曲线长度比例   * @param p0 起始点   * @param p1 控制点1   * @param p2 控制点2   * @param p3 终止点   * @return t对应的点   */  public static PointF calculateBezierPointForCubic(float t, PointF p0, PointF p1, PointF p2,      PointF p3) {    PointF point = new PointF();    float temp = 1 - t;    point.x = p0.x * temp * temp * temp        + 3 * p1.x * t * temp * temp        + 3 * p2.x * t * t * temp        + p3.x * t * t * t;    point.y = p0.y * temp * temp * temp        + 3 * p1.y * t * temp * temp        + 3 * p2.y * t * t * temp        + p3.y * t * t * t;    return point;  }}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context=".MainActivity"    >  <Button      android:id="@+id/btn_one"      android:layout_width="match_parent"      android:layout_height="wrap_content"      android:text="二阶贝塞尔曲线"      />  <Button      android:id="@+id/btn_two"      android:layout_width="match_parent"      android:layout_height="wrap_content"      android:text="三阶贝塞尔曲线"      />  <Button      android:id="@+id/btn_anim"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:layout_gravity="center"      android:text="Anim"      /></LinearLayout>

更多相关文章

  1. react-native02:安卓返回键控制
  2. Android(安卓)安全架构及权限控制机制剖析
  3. Android(安卓)安全架构及权限控制机制剖析
  4. Android(安卓)五种布局简单介绍
  5. Android:Gravity控制格式
  6. Android使用贝塞尔曲线画心形
  7. android camera系统3A模式及其状态转换(二)
  8. Android图表控件MPAndroidChart——曲线图LineChart(多条曲线)动态
  9. (Android)搭建NDK开发环境 (一)

随机推荐

  1. android下载编译以及文件系统提取总结
  2. Android常用控件之EditText
  3. 【Android那些高逼格的写法】LinkedBlock
  4. android 支持的声音格式详解
  5. Android中测量Text的宽度和高度
  6. Android 中文API (65) ―― BluetoothClass
  7. Android背景设置透明和半透明效果
  8. 《Android学习指南》文件夹
  9. Android中layout_weight的基本使用
  10. Android WebView如何隐藏地址栏,用WebView