2013-10-13 4 views
2

내가 이렇게되면 애니메이션을 할 노력하고있어 :안드로이드 - 레이아웃의 TranslateAnimation 업데이트 동적으로 크기

컨텍스트 :

내가해야 할 두 EditText 년대가있을 때 당신을 그 하나를 클릭하면 다른 하나가 첫 번째 것 뒤에서 나옵니다. 여기 내가 원하는 사진을 찍을 사진이 있습니다. Application in standby Application after you click the first EditText

분명 내가 처음 뒤에서 두 번째 EditText를 이동하기 위해 TranslateAnimation을 필요로이 작업을 수행합니다.

내 방식 :

나는를 사용하여 A FrameLayout에 줄 알았는데 다른 이상 EditText에 1 점을 추가하는 듯 한 다음 첫 번째의 onTouch 이벤트에서 두 번째에 TranslateAnimation을 할 수있는 첫 번째 일은. 이 문제는 wrap_contentFrameLayout 키가있는 경우 애니메이션이 사용자에게 보이지 않는다는 것입니다. 내가 생각

enter image description here

두 번째 솔루션은 TranslateAnimationAnimationListener를 추가했다 :이 그림에서 볼 수 있듯이 내가 런타임에 FrameLayout의 높이를 변경하면 나는 처음 EditText 아래의 빈 공간을 남겨 둘 것이다 FrameLayout의 높이를 변경하려면 onAnimationStart 방법을 사용합니다. 그러나 이것의 문제점은 FrameLayout의 높이가 너무 갑자기 변경된다는 것입니다. 애니메이션을 부드럽게 유지하고 싶습니다.

내 질문 : 나는 아래로 두 번째 EditText 이동으로 FrameLayout의 높이를 변경, 첫 번째 뒤에서 두 번째 EditText의 부드러운 애니메이션을 얻을 수있는 방법

?

감사합니다.

업데이트 :

는 내가 검색이 경우에 차이가있어없는 RelativeLayout하여 FrameLayout을 변경했습니다. 애니메이션을 원활하게 표시하기 위해 EditTextAnimationScale을 모두 포함하는이 RelativeLayout을 시도했지만 작동하지 않았습니다. 여기 내 코드는 다음과 같습니다.

protected void expanse() { 
     Log.d("Accordion", "expandAccordion"); 
     //Translate the top of the second EditText to its bottom 
     TranslateAnimation translateSecond = new TranslateAnimation(second.getLeft(), second.getLeft(), 
       second.getTop(), second.getBottom()); 
     translateSecond.setDuration(1000); 
     //Scale the relative layout to show the both of them 
     ScaleAnimation scaleContainer = new ScaleAnimation(container.getLeft(), container.getLeft(), 
       container.getTop(), second.getBottom()); 
     scaleContainer.setDuration(1000); 
     //At the end of the scaling, change the height of the relative layout 
     scaleContainer.setAnimationListener(new AnimationListenerAdapter() { 

      @Override 
      public void onAnimationEnd(Animation animation) { 
       RelativeLayout.LayoutParams params = (LayoutParams) container.getLayoutParams(); 
       params.height = second.getBottom(); 
       container.setLayoutParams(params); 
       super.onAnimationEnd(animation); 
      } 

     }); 
     container.startAnimation(scaleContainer); 
     second.startAnimation(translateSecond); 
    } 

350W 350dp와 같은 큰 높이를 하드 코딩하면 애니메이션이 올바르게 표시됩니다.

UPDATE : I는 모두 이동 시도

, 제 EditText 아래 레이아웃. 이것은 코드입니다. BTW 사용자가 ViewPager으로 ListView을 변경 한 다른 이유로이 변경 사항은 없습니다.

public class MainActivity extends FragmentActivity { 

    private EditText first; 
    private EditText second; 
    private HoboViewPager pager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     pager = (HoboViewPager) findViewById(R.id.pager); 
     pager.setPageTransformer(true, new RotationPageTransformer()); 
     pager.setAdapter(new SampleAdapter(this, getSupportFragmentManager())); 

     first = (EditText) findViewById(R.id.location_search_field); 
     second = (EditText) findViewById(R.id.term_search_field); 
     first.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       expanseSecondField(); 
       return true; 
      } 
     }); 
    } 

    protected void expanseSecondField() { 
     TranslateAnimation translateSecondField = new TranslateAnimation(second.getLeft(), second.getLeft(), 
       second.getTop(), second.getBottom()); 
     translateSecondField.setFillAfter(true); 
     translateSecondField.setDuration(1000); 
        TranslateAnimation translateContainer = new TranslateAnimation(pager.getLeft(), pager.getLeft(), 
       pager.getTop(), pager.getTop() + second.getBottom()); 
     translateContainer.setFillAfter(true); 
     translateContainer.setDuration(1000); 
        pager.startAnimation(translateContainer); 
     second.startAnimation(translateSecondField); 
    } 
} 

컨테이너의 TranslateAnimation이 즉시 실행되기 때문에 작동하지 않았습니다. 결과는 애니메이션의 끝에서 컨테이너의 크기를 변경하려고 할 때와 동일합니다.

답변

1

두 번째 옵션 인 &을 사용하면 두 개의 번역 애니메이션을 일렬로 수행하면됩니다 : EditText에서 1 개, 그리고 FrameLayout에서 하나를? 그들에게 똑같은 정확한 델타와 기간을 알려주십시오. 이렇게하면 FrameLayout이 부드럽게 아래로 이동 한 다음 애니메이션이 끝날 때 FrameLayout의 높이를 변경합니다.

희망 사항 :

+0

좋은 생각입니다. 나는 그것을 시도해 볼 것이고, 만약에 효과가 있다면 당신의 대답을 받아 들일 것입니다. 감사! – 4gus71n

+0

이 솔루션은'FrameLayout'에서 애니메이션을 수행 할 때 뷰가 무효화되고'EditText'의 애니메이션을 볼 수 없기 때문에 작동하지 않습니다. 내 업데이트를 확인하십시오. – 4gus71n

+0

두 개의 별도 TranslateAnimation 인스턴스를 만들어야합니다. –

관련 문제