ViewGroup에서 하위 View 추가 시 애니메이션 효과

3524 단어
때때로 우리는 코드에 수동으로 View를 만들고 View 그룹에 추가해야 한다. 이때 애니메이션을 추가하려면 Layouttransition(3.0 이후에나 있는 것 같은데)을 빌려야 한다. 다음은 기본 코드로 기록한다.
/**ViewGroup   View        */
	private LayoutTransition mTransitioner;
/**  ViewGroup   View    */
	private void setLinearContainerAnimation()
	{
		mTransitioner = new LayoutTransition(); 
		mTransitioner.setStagger(LayoutTransition.CHANGE_APPEARING, 100);//  View
        mTransitioner.setStagger(LayoutTransition.CHANGE_DISAPPEARING, 100);//  View
        //    
        setupCustomAnimations();
        //  mLinearContainer       
		mLinearContainer.setLayoutTransition(mTransitioner);

	}
 
 
/**  ViewGroup  View      */
	private void setupCustomAnimations()
	{
		//        
		PropertyValuesHolder pvhLeft =
			PropertyValuesHolder.ofInt("left", 0, 1);
		PropertyValuesHolder pvhTop =
			PropertyValuesHolder.ofInt("top", 0, 1);
		PropertyValuesHolder pvhRight =
			PropertyValuesHolder.ofInt("right", 0, 1);
		PropertyValuesHolder pvhBottom =
			PropertyValuesHolder.ofInt("bottom", 0, 1);
		PropertyValuesHolder pvhScaleX =
			PropertyValuesHolder.ofFloat("scaleX", 1f, 0f, 1f);
		PropertyValuesHolder pvhScaleY =
			PropertyValuesHolder.ofFloat("scaleY", 1f, 0f, 1f);
		final ObjectAnimator changeIn = ObjectAnimator.ofPropertyValuesHolder(
			this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhScaleX, pvhScaleY).
			setDuration(mTransitioner.getDuration(LayoutTransition.CHANGE_APPEARING));
		mTransitioner.setAnimator(LayoutTransition.CHANGE_APPEARING, changeIn);
		changeIn.addListener(new AnimatorListenerAdapter()
		{
			public void onAnimationEnd(Animator anim)
			{
				View view = (View) ((ObjectAnimator) anim).getTarget();
				view.setScaleX(1f);
				view.setScaleY(1f);
			}
		});

		//        
		Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
		Keyframe kf1 = Keyframe.ofFloat(.9999f, 360f);
		Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
		PropertyValuesHolder pvhRotation =
			PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
		final ObjectAnimator changeOut = ObjectAnimator.ofPropertyValuesHolder(
			this, pvhLeft, pvhTop, pvhRight, pvhBottom, pvhRotation).
			setDuration(mTransitioner.getDuration(LayoutTransition.CHANGE_DISAPPEARING));
		mTransitioner.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, changeOut);
		changeOut.addListener(new AnimatorListenerAdapter()
		{
			public void onAnimationEnd(Animator anim)
			{
				View view = (View) ((ObjectAnimator) anim).getTarget();
				view.setRotation(0f);
			}
		});

		//      
		ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "rotationY", 90f, 0f).
			setDuration(mTransitioner.getDuration(LayoutTransition.APPEARING));
		mTransitioner.setAnimator(LayoutTransition.APPEARING, animIn);
		animIn.addListener(new AnimatorListenerAdapter()
		{
			public void onAnimationEnd(Animator anim)
			{
				View view = (View) ((ObjectAnimator) anim).getTarget();
				view.setRotationY(0f);
			}
		});

		//   View      
		ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "rotationX", 0f, 90f).
			setDuration(mTransitioner.getDuration(LayoutTransition.DISAPPEARING));
		mTransitioner.setAnimator(LayoutTransition.DISAPPEARING, animOut);
		animOut.addListener(new AnimatorListenerAdapter()
		{
			public void onAnimationEnd(Animator anim)
			{
				View view = (View) ((ObjectAnimator) anim).getTarget();
				view.setRotationX(0f);
			}
		});

	}

좋은 웹페이지 즐겨찾기