Android 动画 ObjectAnimator第一次动画不执行的问题

学习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的简单封装。其他应该没什么问题。

    推荐阅读