学习ObjectAnimator对象,知道这个和原来的ValueAnimator对象是不一样的,这个是实体的不单单只是控件的显示效果。
代码:
// private boolean firstLoadPicLayout = true;
@SuppressWarnings("deprecation")
private void picLayoutShowOrDown(final boolean isShow, final View v) {// if (firstLoadPicLayout) {
// firstLoadPicLayout = false;
// Message msg = Message.obtain();
// msg.what = GlobalConsts.DRAW_Delayed_HANDLER_MESSAGE;
// handler.sendMessageDelayed(msg, 500);
// return;
// }
ObjectAnimator anima;
int width = v.getWidth();
if (width == 0) {
WindowManager manager = (WindowManager) this
.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
width = display.getWidth();
// DisplayMetrics dm = new DisplayMetrics();
// getWindowManager().getDefaultDisplay().getMetrics(dm);
// width= dm.widthPixels;
}
// WindowManager wm = (WindowManager) this
// .getSystemService(DrawActivity.WINDOW_SERVICE);
// DisplayMetrics dm = new DisplayMetrics();
// wm.getDefaultDisplay().getMetrics(dm);
// float density = dm.density;
// LT.lg("LayoutParams.MATCH_PARENT=" + LayoutParams.MATCH_PARENT);
// width = (int) (width / density);
// 获取当前设备的屏幕宽度。铺满;
// }if (isShow) {// 从某个值变化到某个值
anima = ObjectAnimator.ofFloat(flPic, "translationX", 0.0f, width);
} else {
v.setVisibility(View.INVISIBLE);
anima = ObjectAnimator.ofFloat(flPic, "translationX", -width, 0f);
}
LT.lg("flpic控件的宽度 = " + v.getWidth());
// 动画更新的监听
anima.addUpdateListener(new AnimatorUpdateListener() {
// 启动动画之后, 会不断回调此方法来获取最新的值
@Override
public void onAnimationUpdate(ValueAnimator animator) {
if (isShow) {// 显示状态到隐藏状态
if (animator.getAnimatedFraction() == 1.0f) {
v.setVisibility(View.GONE);
}
} else {// 隐藏状态到显示状态
// LT.lg("显示过程中的差值:" + animator.getAnimatedFraction());
if (animator.getAnimatedFraction() == 0.0f) {
if (v.getVisibility() != View.VISIBLE) {
v.setVisibility(View.VISIBLE);
}
}
}
}
});
anima.setDuration(500);
// 动画时间
// if (firstLoadPicLayout) {
// firstLoadPicLayout = false;
// anima.setStartDelay(500);
// }
anima.start();
// 启动动画 }
解析 1.学习主方法:ObjectAnimatoranima = ObjectAnimator.ofFloat(flPic, "translationX", 0.0f, width);
参数:1.flpic需要执行动画的控件(可以直接换成 方法参数View v也是一样的),2.“tranSlationX”String类型的动画参数,这个可以搜一下,这个是X轴平移
3.开始位置,4.width,结束位置,
这个是基于控件左上角位置为基准点移动的,要知道怎么移动的一定要了解清楚,开始和结束的相对位置。
这里解决了一个Bug就是,在第一次运行的时候如果世界使用v.getWidth(),(测量还没有开始)获取的值是0,所以导致了如题的问题,这里使用的是铺满的方式显示在界面中。所以直接使用屏幕的宽度。问题已经解决
后面有几个方法,1.setDuration,设置动画执行执行
2.firstLoadPicLayout,是为了给第一次加载给一个延迟(刚开始以为是首次加载的时间不够,所以给了一个延迟)
3.setStartDelay是设置动画开始的延迟时间
4.start动画开始执行
5.addUpdateListener更新监听,这个里面获取差值来改变控件的状态,
好了,picLayoutShowOrDown方法是现成的直接用就好了;
picLayoutShowOrDown:
参数1.isShow当前控件否处于显示状态,用这个直接获取:boolean isShow = flPic.getVisibility() == View.VISIBLE;
参数2.需要显示的控件,
好的。很好理解,网上的资料还是蛮多的,但是这个bug搞了我大半天时间。
测了好多遍。测量的坑。记下了!
【Android 动画 ObjectAnimator第一次动画不执行的问题】注:LT.lg只是一个打印日志,是对Log.d的简单封装。其他应该没什么问题。