package com.example.springbugtest; import androidx.appcompat.app.AppCompatActivity; import androidx.dynamicanimation.animation.DynamicAnimation; import androidx.dynamicanimation.animation.SpringAnimation; import androidx.dynamicanimation.animation.SpringForce; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private Button button; private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = findViewById(R.id.button); textView = findViewById(R.id.textView); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { testSpringAnimation(); } }); } void testSpringAnimation() { SpringAnimation springAnimation = new SpringAnimation(textView, SpringAnimation.Y); springAnimation.addEndListener(new DynamicAnimation.OnAnimationEndListener() { @Override public void onAnimationEnd(DynamicAnimation animation, boolean canceled, float value, float velocity) { String str = "springAnimation end. textView.y=" + textView.getY(); Toast toast=Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG); toast.show(); } }); SpringForce springForce = new SpringForce(800); springForce.setStiffness(10.0f); springForce.setDampingRatio(1.0f); springAnimation.setSpring(springForce); // set textView.Y to 800 springAnimation.start(); // when springAnimation is running, change the finalPosition springAnimation.animateToFinalPosition(1600); // cancel the springAnimation springAnimation.cancel(); // change the finalPosition again springAnimation.getSpring().setFinalPosition(200); // restart the springAnimation springAnimation.start(); } }