记录一个属性动画的简单demo,界面就是一个imageview和一个button,点击button来启动,暂停,恢复动画,上代码:
public class AnimatorActivity extends AppCompatActivity {
private static final String TAG = "AnimatorActivity";
private ImageView imageView;
private Button btn;
private int displayWidth;
private int viewWidth;
private ObjectAnimator testAnimator;
private boolean isAnimatorInit = false;
private static final int STOP = 0;
private static final int START = 1;
private static final int PAUSE = 2;
private static final int RESUME = 3;
private int animaState = STOP;
//view绘制顺序
//oncreate()→onResume()→onMeasure()→onLayout()→onWidnowFocusChanged()→.....→onDraw()...
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.animator_view);
imageView = findViewById(R.id.image_view);
btn = findViewById(R.id.anim_btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
testAnimator();
}
});
//animator test
//testAnimator();
}
@Override
protected void onDestroy() {
super.onDestroy();
testAnimator.removeAllListeners();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
displayWidth = DisplayUtils.getDisplayWidth(getBaseContext());
viewWidth = imageView.getWidth();
if(!isAnimatorInit) {
initAnimator(displayWidth-viewWidth);
}
}
private void initAnimator(int endPos) {
testAnimator = ObjectAnimator.ofFloat(imageView, "translationX", endPos);
testAnimator.setDuration(2000);
//set listeners
testAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
animaState = START;
Log.d(TAG, "onAnimationStart --> animaState = " + animaState);
}
@Override
public void onAnimationEnd(Animator animation) {
animaState = STOP;
Log.d(TAG, "onAnimationEnd --> animaState = " + animaState);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
testAnimator.addPauseListener(new Animator.AnimatorPauseListener() {
@Override
public void onAnimationPause(Animator animation) {
animaState = PAUSE;
Log.d(TAG, "onAnimationPause --> animaState = " + animaState);
}
@Override
public void onAnimationResume(Animator animation) {
animaState = RESUME;
Log.d(TAG, "onAnimationResume --> animaState = " + animaState);
}
});
isAnimatorInit = true;
}
private void testAnimator() {
switch (animaState) {
case STOP:
testAnimator.start();
break;
case START:
testAnimator.pause();
break;
case PAUSE:
testAnimator.resume();
break;
case RESUME:
testAnimator.pause();
break;
default:
}
}
}
另外一个工具类:
public class DisplayUtils {
public static int getDisplayWidth(Context context) {
return context.getResources().getDisplayMetrics().widthPixels;
}
public static int getDisplayHeight(Context context) {
return context.getResources().getDisplayMetrics().heightPixels;
}
public static int px2dp(Context context, float value) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(value / scale + 0.5f);
}
public static int dp2px(Context context, float value) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(value * scale + 0.5f);
}
public static int px2sp(Context context, float value) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int)(value / fontScale + 0.5f);
}
public static int sp2px(Context context, float value) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int)(value * fontScale + 0.5f);
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">
<ImageView
android:id="@+id/image_view"
android:layout_width="75dp"
android:layout_height="75dp"
android:src="@drawable/image1"/>
<Button
android:id="@+id/anim_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="test"/>
</RelativeLayout>