中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android SpringAnimation彈性動畫解析

發布時間:2020-10-19 03:15:04 來源:腳本之家 閱讀:648 作者:rome753 欄目:移動開發

也許你想在Android上實現這種反彈的動畫效果。Android Support Library 25.3.0引入了Dynamic-animation增強動畫,里面提供了幾個類用于使動畫呈現實現真實的物理效果。

Android SpringAnimation彈性動畫解析

你會想,自己的動畫里加上 BounceInterpolator或OvershootInterpolator 插值器也能達到這種效果,然而實際上達不到。當然你也可以自己寫插值器,如果你不嫌麻煩的話。

SpringAnimation彈性動畫實現方法

gradle引入,最低支持API16

dependencies {
 compile 'com.android.support:support-dynamic-animation:25.3.0'
}

定義SpringForce,定義彈性特質

SpringForce spring = new SpringForce(finalPosition);
spring.setStiffness(stiffness);
spring.setDampingRatio(dampingRatio);

定義SpringAnimation,并關聯SpringForce對象

SpringAnimation animation = new SpringAnimation(view, property);
animation.setSpring(spring);

代碼如下

PositionActivity.java

public class PositionActivity extends AppCompatActivity {

 float STIFFNESS = SpringForce.STIFFNESS_MEDIUM;//硬度
 float DAMPING_RATIO = SpringForce.DAMPING_RATIO_HIGH_BOUNCY;//阻尼

 SpringAnimation xAnimation;//x方向
 SpringAnimation yAnimation;//y方向

 View movingView;//圖片

 float dX = 0f;
 float dY = 0f;

 @Override
 public void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_position);

  movingView = findViewById(R.id.movingView);

  // 以圖片的初始位置創建動畫對象
  movingView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
   @Override
   public void onGlobalLayout() {
    xAnimation = createSpringAnimation(
      movingView, SpringAnimation.X, movingView.getX(), STIFFNESS, DAMPING_RATIO);
    yAnimation = createSpringAnimation(
      movingView, SpringAnimation.Y, movingView.getY(), STIFFNESS, DAMPING_RATIO);
    //初始位置確定,移除監聽
    movingView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
   }
  });

  movingView.setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View view, MotionEvent event) {
    switch (event.getActionMasked()) {
     case MotionEvent.ACTION_DOWN:
      // 計算到左上角的距離
      dX = view.getX() - event.getRawX();
      dY = view.getY() - event.getRawY();

      // 取消動畫以便按住圖片
      xAnimation.cancel();
      yAnimation.cancel();
      break;
     case MotionEvent.ACTION_MOVE:
      // 另一種改變View的LayoutParams(位置)的方式
      movingView.animate()
        .x(event.getRawX() + dX)
        .y(event.getRawY() + dY)
        .setDuration(0)
        .start();
      break;
     case MotionEvent.ACTION_UP:
      xAnimation.start();
      yAnimation.start();
      break;
    }
    return true;
   }
  });

 }

 /**
  * 創建彈性動畫
  * @param view 動畫關聯的控件
  * @param property 動畫作用的屬性
  * @param finalPosition 動畫結束的位置
  * @param stiffness 硬度
  * @param dampingRatio 阻尼
  * @return
  */
 SpringAnimation createSpringAnimation(View view,
           DynamicAnimation.ViewProperty property,
           Float finalPosition,
           @FloatRange(from = 0.0) Float stiffness,
           @FloatRange(from = 0.0) Float dampingRatio) {
  //創建彈性動畫類SpringAnimation
  SpringAnimation animation = new SpringAnimation(view, property);
  //SpringForce類,定義彈性特質
  SpringForce spring = new SpringForce(finalPosition);
  spring.setStiffness(stiffness);
  spring.setDampingRatio(dampingRatio);
  //關聯彈性特質
  animation.setSpring(spring);
  return animation;
 }

}

activity_position.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
 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"
 tools:context=".PositionActivity">

 <ImageView
  android:id="@+id/movingView"
  android:layout_width="128dp"
  android:layout_height="128dp"
  android:layout_gravity="center"
  android:src="@drawable/android"
  android:tint="@color/colorPrimary"
  tools:ignore="ContentDescription"/>

</FrameLayout>

觸摸改變圖片的位置,松開手啟動動畫。

翻譯自https://www.thedroidsonroids.com/blog/android/springanimation-examples/,原作者使用Kotlin語言實現的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

木兰县| 灵璧县| 靖宇县| 油尖旺区| 白河县| 宜兰县| 荣昌县| 宝清县| 旬邑县| 嘉荫县| 桃源县| 昌邑市| 牙克石市| 岳阳市| 广州市| 肃南| 松潘县| 九龙城区| 三门县| 石渠县| 桑日县| 南投县| 昭苏县| 油尖旺区| 成安县| 延寿县| 交口县| 准格尔旗| 古交市| 绿春县| 龙川县| 舒城县| 怀远县| 南开区| 郴州市| 江源县| 曲阜市| 兴安盟| 巨野县| 华阴市| 天镇县|