xml:
<Button android:id="@+id/btn_myanim" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn_myanim" />
java:
private CustomAnim ca; private Button btn_myanim;
btn_myanim = findViewById(R.id.btn_myanim); btn_myanim.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ca = new CustomAnim(); ca.setDuration(2000); v.startAnimation(ca); } });
CustomAnim.class:
import android.util.Log; import android.view.animation.Animation; import android.view.animation.Transformation; public class CustomAnim extends Animation { private static final String TAG = "CustomAnim"; @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { //该方法在applyTransformation()之前执行 获取控件的宽高,父容器的宽高 Log.d(TAG, "initialize: "); super.initialize(width, height, parentWidth, parentHeight); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { // interpolatedTime:补简时间(0-1之间) 动画执行完后,interpolatede是1,执行的过程中interpolated不断的被执行 Log.d(TAG, "applyTransformation: " + interpolatedTime); // Transformation:变化对象 // t.setAlpha(interpolatedTime); // 指定旋转的中心点 // getMatrix():使用矩阵的形式 setTranslate:设置指定位置 // t.getMatrix().setTranslate(200,200); // 缓慢执行效果 // t.getMatrix().setTranslate(200 * interpolatedTime, 200 * interpolatedTime); // 设置左右摆头的效果 sin(interpolatedTime*10):设置周期,后面的数值越大,动画频率加快 // 50:为振幅,数值越大,左右摇摆的距离越大 t.getMatrix().setTranslate((float)(Math.sin(interpolatedTime*10)*50),0); super.applyTransformation(interpolatedTime, t); } }