Android中的設計模式--介面卡模式
阿新 • • 發佈:2019-02-12
最近對介面卡有了新的理解,特記錄下。
寫程式碼遇到了使用ScaleAnimation,我想在結束完,執行另一個動畫,於是我增加了一個Animation.AnimationListener。另一個動畫又是使用的animator屬性動畫,我使用了Animator.MyListenerAdapter 或Animator.AnimatorListener方便此動畫結束後執行另一個動畫。於是最後我想把兩種listener合併成一個,因為我只想他們動畫結束做動作,只用一個狀態表示現在執行到了哪個動畫。
於是便有了下面的內部類介面卡。
int animationType; //動畫型別
private final int FIRSTSCALEANIMATION = 0xc1; //點選後縮小動畫
private final int SECONDSCALEANIMATION = 0xc2; //點選後放大動畫
private final int EXITSCALEANIMATION = 0xc4; //退出動畫
class MyListenerAdapter extends AnimatorListenerAdapter implements Animation.AnimationListener{
private final String TAG = "MyListenerAdapter" ;
Animator.AnimatorListener animatorListener;
Animation.AnimationListener animationListener;
public MyListenerAdapter() {
animatorListener = this;
animationListener = this;
}
@Override
public void onAnimationStart(Animation animation) {
Log.e(TAG, "MyAnimatorAdapter onAnimationStart開始" );
if(animation != null)
animatorListener.onAnimationStart(null);
}
@Override
public void onAnimationEnd(Animation animation) {
if(animation != null)
animatorListener.onAnimationEnd(null);
}
@Override
public void onAnimationRepeat(Animation animation) {
if(animation != null)
animatorListener.onAnimationRepeat(null);
}
@Override
public void onAnimationStart(Animator animator) {
if(animator != null)
animationListener.onAnimationRepeat(null);
}
@Override
public void onAnimationEnd(Animator animator) {
if(animator != null)
animationListener.onAnimationEnd(null);
Log.e(TAG, "MyAnimatorAdapter onAnimationEnd結束");
if(animationType == FIRSTSCALEANIMATION){ //第一段動畫結束
animationType = SECONDSCALEANIMATION;
。。。//執行第二段動畫
}
else if(animationType == SECONDSCALEANIMATION){ //第二段動畫結束
animationType = EXITSCALEANIMATION;
。。。//執行第三段動畫
}
else if(animationType == EXITSCALEANIMATION){ //第三段動畫結束
。。。
}
}
}
這樣使用的時候不管是屬性動畫還是補間動畫都可以使用
scaleAnimation.setAnimationListener(new MyListenerAdapter());
和view.animate().translationY(20).setDuration(200).setListener(new MyListenerAdapter())