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.学习主方法:ObjectAnimator    anima = 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搞了我大半天时间。

测了好多遍。测量的坑。记下了!

注:LT.lg只是一个打印日志,是对Log.d的简单封装。其他应该没什么问题。

你可能感兴趣的:(Android)