1

일부 테스트를 위해이 레이아웃을 사용했습니다. Animations. 내가 실현하려 원하는 것은애니메이션을 사용하여 ListView의 높이를 높이도록하자

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

    <LinearLayout 
     android:id="@+id/frame1" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:background="#00ff00" 
     android:orientation="vertical"> 
     <TextView 
      android:id="@+id/text1" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="1"/> 
     <TextView 
      android:id="@+id/text2" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="2"/> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/frame2" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:background="#0000ff"> 

     <ListView 
      android:id="@+id/list" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="@drawable/edit_style"/> 

    </LinearLayout> 
</LinearLayout> 

가있는 LinearLayout frame1가 축소하면서있는 LinearLayout frame2에서 ListView에 list가 화면 상단에 성장해야한다는 것입니다.

ObjectAnimator이 같은 AnimatorSet 매우 쉽게 수행 할 수 있습니다

ObjectAnimator animframe1 = ObjectAnimator.ofInt(frame1, "bottom", 0); 
ObjectAnimator animframe2 = ObjectAnimator.ofInt(frame2, "top", 0); 
ObjectAnimator listview = ObjectAnimator.ofInt(list, "bottom", frame2.getBottom()); 

AnimatorSet set = new AnimatorSet(); 
set.setDuration(1000L); 
set.playTogether(animframe1, animframe2, listview); 
set.start(); 

내가 성장 촉진을 가지고 뷰의 topbottom 속성을 조작하면된다 무엇/효과를 축소.

원하는대로 작동하지만 하나의 결함이 있습니다. ListView가 커지면 거기에있는 추가 항목이 보이지 않습니다. 방이 있어야하지만 애니메이션 후에 ListView를 클릭하면 추가 항목 만 표시됩니다.

어떻게 애니메이션을 실행하는 동안 추가 항목을 다시로드해야 ListView 말할 수 있습니까?

list.invalidate()을 호출하려했지만 성공하지 못했습니다. list.requestLayout()으로 전화하면 애니메이션이 없습니다.

+0

. 그것은 나를 위해 안드로이드 1.6에서 간단한 애니메이션 개체를 사용해야하고 각각의 애니메이션 끝에 내가 원하는 변화를 적용했다 일했다. PS [Android reference] (http://developer.android.com/reference/android/view/animation/Animation.html) – user3455363

답변

1

내가 놓친 것은 top 속성을 수정 한 후에 ListView의 height을 설정하는 것입니다. 이 없으면 ListView에 이전 항목이 유지되어 추가 항목이 표시되지 않습니다.

CustomListView 클래스의 height에 대한 추가 설정자가 필요 없으므로 ValueAnimator로 전환했습니다.

코드는 다음과 같이이다 : 당신은 당신의 개체에 대한 변경 사항을 지정 짧은 애니메이션 severall 및 애니메이션 종료 이벤트에 재생하려고 할 수

public void animateListHeight() { 
    PropertyValuesHolder topList = PropertyValuesHolder.ofInt("top", mListView.getTop(), 5); 

    ValueAnimator animList = ValueAnimator.ofPropertyValuesHolder(topList); 
    animList.setDuration(300L); 

    AnimatorUpdateListener listUpdater = new AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      int top = ((Integer)animation.getAnimatedValue("top")).intValue(); 
      mListView.setTop(top); 
      ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) mListView.getLayoutParams(); 
      params.height = mListView.getBottom() - top; 
      mListView.setLayoutParams(params); 
     } 
    }; 

    animList.addUpdateListener(listUpdater); 
    animList.start(); 
}