2010-12-21 4 views
35

항목 목록이있는 활동이 있으며 항목을 클릭하면 해당 항목의 재생 컨트롤이 화면 하단에서 위로 슬라이드되어 표시됩니다. 나는 슬라이드를위한 애니메이션 세트를 정의하고 슬라이드는 밖으로 나왔다. 내 activityListener를 내 활동에 설정하고 애니메이션 onClick 항목에서 내 슬라이드를 시작했습니다. 내 문제는 응용 프로그램을 처음 실행할 때 항목을 클릭하면 onClick 콜백이 실행되지만 애니메이션이 실행되지 않는다는 것입니다. 두 번째로 클릭하면 애니메이션 슬라이드가 나타나지만 슬라이드가 밖으로 나오지 않습니다. 셋째 및 후속 시간, 예상대로 작동합니다. 다음은 내 애니메이션 세트입니다.처음 실행시 레이아웃 애니메이션이 작동하지 않습니다.

vm_slide_in.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
      android:fillAfter="true"> 
    <translate 
     android:fromYDelta="800" 
     android:toYDelta="0" 
     android:duration="600" /> 
</set> 

vm_slide_out.xml는

여기
<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
      android:fillAfter="true"> 
    <translate 
     android:fromYDelta="0" 
     android:toYDelta="800" 
     android:duration="600" /> 
</set> 

여기 내 활동 레이아웃

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    style="@style/AppBG"> 
    <RelativeLayout 
     style="@style/LogoBar" 
     android:id="@+id/logo_bar"  
     android:layout_alignParentTop="true"> 
     <include layout="@layout/logobar"></include> 
    </RelativeLayout> 
    <RelativeLayout 
     style="@style/TitleBar" 
     android:id="@+id/title_bar"  
     android:layout_below="@+id/logo_bar"> 
     <include layout="@layout/titlebar"></include>" 
     <Button style="@style/TitleBarButton" 
      android:id="@+id/vm_speaker_btn" 
      android:text="@string/vm_speaker_btn_label" 
      android:layout_alignParentLeft="true" 
      android:layout_margin="4dp"> 
     </Button> 
     <Button style="@style/TitleBarButton" 
      android:id="@+id/vm_edit_btn" 
      android:text="@string/vm_edit_btn_label" 
      android:layout_alignParentRight="true" 
      android:layout_margin="4dp"> 
     </Button> 
    </RelativeLayout> 
    <ListView 
     android:id="@+id/@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/title_bar"/> 
    <RelativeLayout 
     android:id="@+id/vm_control_panel" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/footer" 
     android:visibility="gone"> 
     <include layout="@layout/vm_control"/> 
    </RelativeLayout> 
    <RelativeLayout 
     android:id="@+id/footer" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true"> 
     <include layout="@layout/taskbar"/> 
    </RelativeLayout> 
</RelativeLayout> 

인 포함 제어

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
    <RelativeLayout 
     android:id="@+id/vm_control" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/dark_grey"> 
     <TextView 
      android:id="@+id/vm_ctl_branding" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_centerHorizontal="true" 
      android:layout_marginTop="5dp" 
      android:text="@string/branding" 
      android:textColor="@color/white"> 
     </TextView> 
     <TextView style="@style/TimeMark" 
      android:id="@+id/vm_timestamp" 
      android:layout_toLeftOf="@+id/vm_progress" 
      android:layout_below="@+id/vm_ctl_branding" 
      android:layout_marginRight="3dp" 
      android:text="0:00"> 
     </TextView> 
     <SeekBar 
      android:id="@+id/vm_progress" 
      android:layout_width="200dp" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/vm_ctl_branding" 
      android:layout_centerHorizontal="true"> 
     </SeekBar> 
     <TextView style="@style/TimeMark" 
      android:id="@+id/vm_timeleft" 
      android:layout_toRightOf="@+id/vm_progress" 
      android:layout_below="@+id/vm_ctl_branding" 
      android:layout_marginLeft="3dp" 
      android:text="-0:00"> 
     </TextView> 
     <LinearLayout 
      android:id="@+id/vm_action_button_layout" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignLeft="@+id/vm_timestamp" 
      android:layout_alignRight="@+id/vm_timeleft" 
      android:orientation="horizontal" 
      android:layout_below="@+id/vm_progress"> 
      <TextView style="@style/Vm_Action_Button" 
       android:background="@drawable/vm_action_btn_call" 
       android:id="@+id/vm_callback_btn" 
       android:layout_marginRight="5dp" 
       android:text="@string/vm_action_btn_callback"> 
      </TextView> 
      <TextView style="@style/Vm_Action_Button" 
       android:background="@drawable/vm_action_btn_delete" 
       android:id="@+id/vm_delete_btn" 
       android:layout_marginLeft="5dp" 
       android:text="@string/vm_action_btn_delete"> 
      </TextView> 
     </LinearLayout> 
    </RelativeLayout> 
</merge> 
의 레이아웃입니다

// Handle list item selections 
ListView lv = getListView(); 
lv.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     final Voicemail vmItem = (Voicemail) vmla.getItem(position); 
     Toast.makeText(ctx, "Name: " + vmItem.getCallerName() + " Position: " + position, Toast.LENGTH_SHORT) 
       .show(); 
     vVm_controls.startAnimation(mSlideIn); 
    } 
}); 

그리고 내 애니메이션 콜백 내에서 onCreate 방법에서 617,451,515,

... ... 물론

@Override 
public void onAnimationStart(Animation animation) { 
    vm_controls_in = !vm_controls_in; 
    if (vm_controls_in) { 
     vVm_controls.setVisibility(View.GONE); 
    } else { 
     vVm_controls.setVisibility(View.VISIBLE); 
     // vVm_controls.bringToFront(); 
    } 
} 

@Override 
public void onAnimationEnd(Animation animation) { 
    if (!vm_controls_in) { 
     try { 
      Thread.sleep(1000); 
      vVm_controls.startAnimation(mSlideOut); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public void onAnimationRepeat(Animation animation) { 
    // TODO Auto-generated method stub 

} 

답변

98

발견 한대로 문제는 공개되었습니다. 처음에보기가 xml 파일에서 사라진 것으로 설정되면 Android는 표시 여부가 표시 또는 숨김으로 변경 될 때까지 레이아웃을 렌더링하지 않습니다. 아직 렌더링되지 않은 뷰에서 애니메이션을 만들려고하면 레이아웃없이 뷰에서 애니메이션이 생성됩니다. 애니메이션이 완료되면 렌더링되고 갑자기 애니메이션없이보기가 나타납니다. 사라지도록 설정된 경우에도보기가 레이아웃을 가지기 때문에 이후에 작동합니다.

핵심은 가시성을 xml 파일에서 사라지는 대신 보이지 않게 설정하여 숨겨 지도록 렌더링하는 것입니다. 애니메이션이 처음 발생하면보기가 나타나고 예상대로 움직입니다.

+0

이 솔루션은 제 경우에는 작동하지 않습니다 ..보기를 수동으로 렌더링하는 다른 방법. –

+1

@sureshcheemalamudi 애니메이션 코드에 문제가있을 수 있으므로 자세한 정보가 없으면 도움이되지 않습니다. 또한이 답변은 API 11 (Honeycomb)을 기반으로 작성되었습니다. 문제의 세부 사항을 담은 새로운 질문을하고 누군가가 대답을 해줄 수 있기를 바랍니다. – mindriot

+0

감사합니다, 나를 위해 일했다 (y). – vanloi999

9

하지 20분이 질문을 게시 한 후 나는 내 문제를 알아 냈어. 내 레이아웃의 가시성을 "GONE"으로 설정 했으므로 애니메이션을 시작하려고했을 때 처음으로 트리거되지 않았습니다. 왜 그것이 2 번째와 그 다음에 나올지 확신 할 수 없지만 애니메이션을 시작하기 바로 전에 "VISIBLE"에 대한 가시성을 설정하면 문제가 해결됩니다. 다음은 내가 변경 한 코드입니다.

// Handle list item selections 
ListView lv = getListView(); 
lv.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     final Voicemail vmItem = (Voicemail) vmla.getItem(position); 
     Toast.makeText(ctx, "Name: " + vmItem.getCallerName() + " Position: " + position, Toast.LENGTH_SHORT) 
       .show(); 
     vVm_controls.setVisibility(View.VISIBLE); 
     vVm_controls.startAnimation(mSlideIn); 
    } 
}); 
+0

귀하의 솔루션은 다음보기가 너무 배치되는 위치에 대해 걱정할 필요가 있기 때문에 그렇지 않은 없음 – breceivemail

+0

"눈에 보이지 않는에 대한 가시성을 설정"보다 낫다 사용자는 점프를 보지 못합니다. 애니메이션이 뷰의 위치에서 시작되지만 애니메이션이 뷰의 위치 (또는 다른 오프셋 애니메이션)로 이동되는 경우에는 문제가되지 않습니다. –

0

정확하게 똑같은 문제가 있지만 ViewPropertyAnimator을 사용했습니다. 예를 들어 mGridView이라는 GridView을 선언합니다. 지금해야 할 일은 원하는 변경으로 mGridView.animate()으로 전화하는 것입니다.

GridView의 애니메이션이 실행되었지만 알 수없는 상황으로 인해 실제 애니메이션이 표시되지 않았습니다. View.GONE도 모두 View.VISIBLE으로 변경되었지만 아무 것도 변경되지 않았습니다. 필자의 경우, GridView의 XML에서 android:requiresFadingEdge="vertical"을 제거해야한다는 것을 알았습니다. ViewPropertyAnimator과 함께 페이딩 에지를 사용할 수없는 경우도 있습니다.

3

아직 최신인지 여부는 알 수 없지만 가시성에는 문제가 있습니다.그래서 눈에 보이지 않는 XML 파일의 가시성을 설정하고보기가 초기화되는 경우 장소에서 호출 :

view.post(new Runnable() { 
    @Override 
    public void run() { 
     view.animate().translationY(view.getHeight()); 
    } 
}; 

처음에

view.animate().translationY(0).setListener(new AnimatorListenerAdapter() { 
    @Override 
    public void onAnimationStart(Animator animation) { 
     super.onAnimationStart(animation); 
     view.setVisibility(View.VISIBLE); 
    } 
} 

작품도 이제 전화를.

0

Android 4.4.3에서 비슷한 문제가있었습니다. 나는 제안 된 솔루션의 대부분을 시도했지만 단 하나의 솔루션 만 잘 작동했다. 윈도우가 렌더링을 완료 한 후에 애니메이션을 실행해야하며, 가장 좋은 방법은 onWindowFocusChanged 안에 실행하는 것입니다. runnable을 통해 지연을 사용하지 마십시오. 고속 핸드셋의 애플리케이션 성능에 영향을 미칠 수 있습니다.

@Override 
public void onWindowFocusChanged (boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (hasFocus) 
     yourView.startAnimation(anim); 
} 

자세한 내용은이 게시물에서 찾을 수 있습니다 https://damianflannery.wordpress.com/2011/06/08/start-animation-in-oncreate-or-onresume-on-android/

1

내가 애니메이션의 시작에서 볼에보기를 설정 한 경우에도 동일한 문제가 있었다. 나는 브 랭리의 충고에 따라 애니메이션을 시작하기 전에 눈에 보이도록 설정했으며 매력처럼 작동했습니다.

전 :

Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_left); 
animation.setAnimationListener(new Animation.AnimationListener() { 
    @Override 
    public void onAnimationStart(Animation animation) { 
     view.setVisibility(View.VISIBLE); 
    } 

    @Override 
    public void onAnimationEnd(Animation animation) { } 

    @Override 
    public void onAnimationRepeat(Animation animation) {  } 
); 
view.startAnimation(animation); 

AFTER :

Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_left); 
view.setVisibility(View.VISIBLE); 
view.startAnimation(animation); 
관련 문제