2012-10-26 2 views
11

아주 간단한 표현으로 문제를 재현했습니다. 3 TextViews 있습니다. 그 중 2 개는 별도 LinearLayout이고, 세 번째는 LinearLayout과 같은 레벨입니다. 가시성을 test1test2으로 바꿔보기로하고 있는데, 나는 그 효과가 사라지는 것을보고 싶습니다. 또한 test3을 새 장소로 밀어 넣고 싶습니다 (test1test2 발생). 나는이 일을 할 수 없다. test3 그냥 새로운 지점에 스냅.LayoutTransition : 확대보기 옆에보기 애니메이션

어떻게해야합니까?

내 코드 :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/parent" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:animateLayoutChanges="true" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Click" /> 

    <LinearLayout android:animateLayoutChanges="true" 
     android:id="@+id/child1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 

     <TextView 
      android:id="@+id/test1" 
      android:layout_width="match_parent" android:visibility="gone" 
      android:layout_height="wrap_content" 
      android:text="TEST1" /> 

     <TextView 
      android:id="@+id/test2" 
      android:layout_width="match_parent" android:visibility="gone" 
      android:layout_height="wrap_content" 
      android:text="TEST2" /> 
    </LinearLayout> 

    <TextView 
     android:id="@+id/test3" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="TEST3" /> 

</LinearLayout> 

그리고 내 활동에 :

public class LayoutAnimations extends Activity { 
    private boolean toggle = true; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.layout_animations); 

     Button button = (Button) findViewById(R.id.button); 
     button.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (toggle) { 
        findViewById(R.id.test1).setVisibility(View.VISIBLE); 
        findViewById(R.id.test2).setVisibility(View.VISIBLE); 
       } else { 
        findViewById(R.id.test1).setVisibility(View.GONE); 
        findViewById(R.id.test2).setVisibility(View.GONE); 
       } 
       toggle = !toggle; 
      } 
     }); 

    } 

} 

편집 : 난 사실이 또 다른 TextView 다음 test1와 항상 볼 수 있어야합니다 test2, 그래서 LinearLayout 자체를 숨길 수 없습니다.

답변

6

대신 텍스트 3의 자식 1과 애니메이션을 첨부했습니다 나는 다른 질문을 사용하여 해결했습니다 . See this answer

인용 :

내가 가장 간단한 방법은 다음과 같이 뷰의 높이를 변경하는 Animation 클래스를 확장하고 applyTransformation()을 무시하는 것입니다 믿습니다

import android.view.View; 
import android.view.ViewGroup.LayoutParams; 
import android.view.animation.Animation; 
import android.view.animation.Transformation; 
import android.widget.LinearLayout; 

public class MyCustomAnimation extends Animation { 

    public final static int COLLAPSE = 1; 
    public final static int EXPAND = 0; 

    private View mView; 
    private int mEndHeight; 
    private int mType; 
    private LinearLayout.LayoutParams mLayoutParams; 

    public MyCustomAnimation(View view, int duration, int type) { 

     setDuration(duration); 
     mView = view; 
     mEndHeight = mView.getHeight(); 
     mLayoutParams = ((LinearLayout.LayoutParams) view.getLayoutParams()); 
     mType = type; 
     if(mType == EXPAND) { 
      mLayoutParams.height = 0; 
     } else { 
      mLayoutParams.height = LayoutParams.WRAP_CONTENT; 
     } 
     view.setVisibility(View.VISIBLE); 
    } 

    public int getHeight(){ 
     return mView.getHeight(); 
    } 

    public void setHeight(int height){ 
     mEndHeight = height; 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 

     super.applyTransformation(interpolatedTime, t); 
     if (interpolatedTime < 1.0f) { 
      if(mType == EXPAND) { 
       mLayoutParams.height = (int)(mEndHeight * interpolatedTime); 
      } else { 
       mLayoutParams.height = (int) (mEndHeight * (1 - interpolatedTime)); 
      } 
      mView.requestLayout(); 
     } else { 
      if(mType == EXPAND) { 
       mLayoutParams.height = LayoutParams.WRAP_CONTENT; 
       mView.requestLayout(); 
      }else{ 
       mView.setVisibility(View.GONE); 
      } 
     } 
    } 
} 

그것을 사용하려면 다음과 같이 당신의 onclick()을 설정

int height; 

@Override 
public void onClick(View v) { 
    if(view2.getVisibility() == View.VISIBLE){ 
     MyCustomAnimation a = new MyCustomAnimation(view2, 1000, MyAnimation.COLLAPSE); 
     height = a.getHeight(); 
     view2.startAnimation(a); 
    }else{ 
     MyCustomAnimation a = new MyCustomAnimation(view2, 1000, MyAnimation.EXPAND); 
     a.setHeight(height); 
     view2.startAnimation(a); 
    } 
} 

감사합니다.

1

사용이 애니메이션 XML slide_in_left.XML

<translate 
    android:duration="500" 
    android:fromXDelta="-100%" 
    android:fromYDelta="0%" 
    android:toXDelta="0%" 
    android:toYDelta="0%" /> 
</set> 

및 slid_in_right.XML

<translate 
    android:duration="500" 
    android:fromXDelta="100%" 
    android:fromYDelta="0%" 
    android:toXDelta="0%" 
    android:toYDelta="0%" /> 
</set> 

사용

이 애니메이션 애니메이션 slideinleft, slideinright;

하고는이 애니메이션을

public void AnimationInitialization() { 

    slideinleft= AnimationUtils 
      .loadAnimation(this, R.anim.slide_in_left); 


    slideinright= AnimationUtils.loadAnimation(this, 
      R.anim.slide_in_right); 

} 

을 initlize 및

public void showMenu() { 

    linearlayout_first.clearAnimation(); 

    linearlayout_first.startAnimation(slideinleft); 

    linearlayout_first.setVisibility(View.VISIBLE); 

} 

public void hideMenu() { 

    linearlayout_second.clearAnimation(); 
    linearlayout_second.startAnimation(slideinright); 


    linearlayout_second.setVisibility(View.GONE); 
} 

필요한대로 레이아웃을 변경할 수 있습니다 공개 설정

변경이이 함수를 호출합니다. 애니메이션 XML의 Xdelta 및 Ydelta도 변경됩니다.

+0

AnimationListener가 없으면 사라지는보기의 애니메이션이 작동하지 않습니다. 이를 위해 AnimationListener를 첨부하고 onAnimationEnd()에서 SetVisibility (View.GONE)를 지정해야합니다! – gauravsapiens

+0

보기를 숨김 해제 한 다음 애니메이션을 적용합니다. 내 경험에 의하면 그것은 정말 개략적으로 보였다. – Michael

+0

예, 안드로이드가 프래그먼트 및 객체 애니메이터로 성장하면서 현재 다른 방식으로 할 수 있지만 당시에는이 작업을 완료했습니다. –

0

문서가 약간 혼란 스럽습니다. android:animateLayoutChanges를 들어,이 플래그가 true로 설정되어있는

가 ..., 기본 LayoutTransition 객체가 이러한 레이아웃 변경이 발생할 때 실행되는 뷰 그룹 컨테이너 및 기본 애니메이션에 설정 될 것이라고 말했습니다.

는 뷰 그룹 클래스의 setLayoutTransition 방법의 설명서를 말한다 동안 기본적으로

, 전환 개체가 null (그래서 레이아웃 변경이 애니메이션되지 있습니다)입니다.

레이아웃에 LayoutTransition을 설정해야합니다.여기

는 않는 예입니다 ..

+0

처음 시도했는데 두 번째 시도는 실제로 xml로 이동했습니다. . – nhaarman

3

http://www.java2s.com/Code/Android/UI/UseLayoutTransitiontoautomatetransitionanimationsasitemsarehiddenorshowninacontainer.htm 내가 내 응용 프로그램에서 발생하는 같은 일을 원했다. 이를 달성하려면

  1. Res/anim에서 적합한 애니메이션을 만듭니다. 나는 왼쪽의 종류의 애니메이션에서 슬라이드를 사용했다. 이 웹 사이트에 만족하지 않으면 다른 웹 사이트로 이동할 수 있습니다.

    는 slide_out_left.xml

    <translate 
        android:duration="@android:integer/config_mediumAnimTime" 
        android:fromXDelta="0" 
        android:toXDelta="-50%p" /> 
    
    <alpha 
        android:duration="@android:integer/config_mediumAnimTime" 
        android:fromAlpha="1.0" 
        android:toAlpha="0.0" /> 
    

  2. Animation outAnimation; 
    LinearLayout a1 = (LinearLayout)findViewById(R.id.child1); 
    
    outAnimation = (Animation) AnimationUtils.loadAnimation (getApplicationContext(), R.anim.slide_out_left); 
    
    a1.setAnimation(outAnimation); 
    outAnimation.setAnimationListener(new AnimationListener() { 
    
        @Override 
        public void onAnimationEnd(Animation arg0) { 
        a1.setVisibility(View.GONE);        
        } 
        @Override 
        public void onAnimationRepeat(Animation animation) { 
         // TODO Auto-generated method stub       
        } 
    
        @Override 
        public void onAnimationStart(Animation animation) { 
         // TODO Auto-generated method stub 
        }     
    }); 
    a1.startAnimation(outAnimation); 
    
  3. (텍스트와 텍스트 2가 포함 된 경우 자식 1 년), 애니메이션을 적용 할 전망 위에서 정의 된 애니메이션을 첨부

참고 :. 자식 1은 천천히 미끄러 때 자동으로 텍스트 3가 슬라이딩되는 환상을 줄 것이기 때문에 나는