android动画有一个特性就是View在隐藏的时候执行动画,View会显示出来,不管这个View是invisible还是gone掉了.我们公司现在有这样一个需求,现在有一个圆盘,要在圆盘外面有一个一个按下的动画(就是出现一个白色的180度圆弧,但是为了节省内存,只准使用一段圆弧图片,其他的就自己去做动画旋转来使用,很操蛋的....),通过按键位置来判断动画旋转的角度这个是中学问题了,这里就不说了.不过这里就出现一个问题了,这个VIew最初要是invisible的,当按下的时候才旋转到相应的位置,并显示出来,笔者最初仅仅是通过控制View的显示与选择来做的,不过也能满足需求了,只是当按下一个位置的时候,手机比较卡的话会出现一个旋转过程的,最终解决方案就是用一个动画集合来做,再做一个alpha动画,最初的时候让其不显示,最后完全呈现.这样就能完全满足了,下面贴一下代码片段,以及一些bug的解决方式
//这里强烈建议用手势识别器来解析事件,这样就能很轻松的解决bug了
GestureDetector gestureLeft = new GestureDetector(context,new GestureDetector.OnGestureListener() {
@Override
public boolean onDown(MotionEvent motionEvent) {
CURRENT_STATE = BUTTON_LEFT;
vibrator.vibrate(40);
starAnimation();
return true;
}
@Override
public void onShowPress(MotionEvent motionEvent) {
}
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
new Handler().post(new Runnable() {
@Override
public void run() {
iv_navigation_background.clearAnimation();//记得要清除动画否则View是隐藏不掉的
iv_navigation_background.setVisibility(View.INVISIBLE);
}
});
return false;
}
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent2, float v, float v2) {
new Handler().post(new Runnable() {
@Override
public void run() {
iv_navigation_background.clearAnimation();
iv_navigation_background.setVisibility(View.INVISIBLE);
}
});
return false;
}
@Override
public void onLongPress(MotionEvent motionEvent) {
}
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent2, float v, float v2) {
new Handler().post(new Runnable() {
@Override
public void run() {
iv_navigation_background.clearAnimation();
iv_navigation_background.setVisibility(View.INVISIBLE);
}
});
return false;
}
});
/**
* 开始旋转,由于这个背景图片很大这样能省不少内存,总体是模拟了一个背景选择器
*/
private void starAnimation() {
AlphaAnimation alpha = new AlphaAnimation(0, 1);
RotateAnimation rotate = new RotateAnimation(LAST_STATE, CURRENT_STATE, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
AnimationSet animationSet = new AnimationSet(false);
animationSet.addAnimation(alpha);
animationSet.addAnimation(rotate);
animationSet.setFillAfter(true);
iv_navigation_background.clearAnimation();
iv_navigation_background.startAnimation(animationSet);
iv_navigation_background.setVisibility(View.VISIBLE);//
LAST_STATE = CURRENT_STATE;
}
//防止快速滑动白圈不还原;sv_remote是rootView,这样是要是根View滑动的时候就会还原
sv_remote.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
new Handler().post(new Runnable() {
@Override
public void run() {
iv_navigation_background.clearAnimation();
iv_navigation_background.setVisibility(View.INVISIBLE);
}
});
return false;
}
});