2017-05-12 14 views
0

내 앱에는 두 가지 활동이 있습니다. 두 번째 활동은 화면 하단에서 애니메이션으로 시작해야합니다. 페이지의 내용 만 변경되고 작업 표시 줄이 화면 상단에있는 것처럼 보이게하고 싶습니다. 이것을 달성하기 위해 나는 애니메이션을 듣기 위해 애니메이션이 끝나 자마자 두 번째 액티비티의 액션 바를 보이게 할 수 있습니다. 애니메이션 듣기/활동 간 전환

나는 다음과 같이 두 번째 활동을 시작합니다

Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 
    intent.putExtra(SecondActivity.SOME_ID, id); 
    ActivityOptionsCompat options = 
     ActivityOptionsCompat.makeCustomAnimation 
     (this, R.anim.slide_in_up, R.anim.slide_out_down); 
    startActivity(intent, options.toBundle()); 

내 질문은 : 어떻게 애니메이션을 듣고이 방법을 사용할 수없는 경우, 활동 사이의 애니메이션을 청취하는 가장 좋은 방법은 무엇입니까 수 있습니까?

답변

2

공유 요소 전환은 기본적으로 android에서 지원합니다.

1. 사용 윈도우 내용의 전환

당신의 styles.xml 파일에 창 내용의 전환 사용 :

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="android:windowContentTransitions">true</item> 
    ... 
</style> 

2. 공통 전환 이름

공통 할당 할당을 두 레이아웃에서 공유 요소로 전환 이름. android : transitionName 속성을 사용하십시오.

예 : DetailActivity.xml에서

<android.support.v7.widget.CardView 
    ...> 
     <ImageView 
      android:id="@+id/ivProfile" 
      android:transitionName="profile" 
      android:scaleType="centerCrop" 
      android:layout_width="match_parent" 
      android:layout_height="160dp" /> 
     ... 
</android.support.v7.widget.CardView> 

: MainActivity.xml 이드는 어디에 레이아웃 계층 소스 가지거나 및 뷰가 존재 타겟팅 :

<LinearLayout 
    ...> 
     <ImageView 
      android:id="@+id/ivProfile" 
      android:transitionName="profile" 
      android:scaleType="centerCrop" 
      android:layout_width="match_parent" 
      android:layout_height="380dp" /> 
     ... 
</LinearLayout> 

참고 그것은 안드로이드 경우 문제가되지 않는 것을 .

시작 3. 활동

소스로부터 그 공유 요소 및 뷰의 다발을 지정하여 대상 활성을 시작

.

Intent intent = new Intent(this, DetailsActivity.class); 
// Pass data object in the bundle and populate details activity. 
intent.putExtra(DetailsActivity.EXTRA_CONTACT, contact); 
ActivityOptionsCompat options = ActivityOptionsCompat. 
    makeSceneTransitionAnimation(this, (View)ivProfile, "profile"); 
startActivity(intent, options.toBundle()); 

그게 전부입니다! 전환 이름과 함께 소스보기를 지정하면 원본 계층 구조에서 동일한 전환 이름을 가진 여러보기가 있어도 기본적으로 올바른보기를 선택하여 애니메이션을 시작할 수 있습니다.

두 번째 작업을 마쳤을 때 장면 전환 애니메이션을 되돌리려면 Activity.finish() 대신 Activity.supportFinishAfterTransition() 메서드를 호출하십시오. 또한, 이러한 경우의 툴바/액션 바에서 홈 버튼의 동작을 재정의해야합니다

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     // Respond to the action bar's Up/Home button 
     case android.R.id.home: 
      supportFinishAfterTransition(); 
      return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

4. 여러 공유 요소 때로는

, 당신은 여러 요소를 애니메이션 할 수 있습니다 소스 뷰 계층 구조. 이는 원본 및 대상 레이아웃 XML 파일에서 고유 한 전환 이름을 사용하여 수행 할 수 있습니다.

Intent intent = new Intent(context, DetailsActivity.class); 
intent.putExtra(DetailsActivity.EXTRA_CONTACT, contact); 
Pair<View, String> p1 = Pair.create((View)ivProfile, "profile"); 
Pair<View, String> p2 = Pair.create(vPalette, "palette"); 
Pair<View, String> p3 = Pair.create((View)tvName, "text"); 
ActivityOptionsCompat options = ActivityOptionsCompat. 
    makeSceneTransitionAnimation(this, p1, p2, p3); 
startActivity(intent, options.toBundle()); 

참고 : 기본적으로 android.util.Pair가 가져옵니다하지만 우리는 대신 android.support.v4.util.Pair 클래스를 선택합니다.

공유 요소간에 전환을 지나치게 지나치지 않도록주의하십시오. 하나의 응집력 단위를 하나의 화면에서 다른 화면으로 움직이게 할 수는 있지만 (너무 많은 공유 요소를 포함 할 수도 있고 포함하지 않을 수도 있음), 공유 요소가 너무 많으면 정신이 산만 해져서 더 많은 경험을 할 수 있습니다. 안드로이드 L에서

5. 정의 공유 전환 요소는 ChangeBounds, ChangeTransform, ChangeImageTransform 및 ChangeClipBounds의 조합 요소 전이 디폴트 공유. 이것은 가장 일반적인 경우에 효과적입니다. 그러나이 동작을 사용자 정의하거나 사용자 정의 전환을 정의 할 수도 있습니다.

// inside your activity (if you did not enable transitions in your theme) 
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); 
// set an enter transition 
getWindow().setEnterTransition(new Explode()); 
// set an exit transition 
getWindow().setExitTransition(new Explode()); 
:

<!-- res/transition/change_image_transform.xml --> 
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeImageTransform/> 
</transitionSet> 

전화 대신 런타임시 Window.requestFeature() 방법 윈도우 내용 천이를 사용하려면, 다음과 같이

<!-- Base application theme. --> 
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <!-- enable window content transitions --> 
    <item name="android:windowContentTransitions">true</item> 

    <!-- specify enter and exit transitions --> 
    <!-- options are: explode, slide, fade --> 
    <item name="android:windowEnterTransition">@transition/change_image_transform</item> 
    <item name="android:windowExitTransition">@transition/change_image_transform</item> 

    <!-- specify shared element transitions --> 
    <item name="android:windowSharedElementEnterTransition"> 
     @transition/change_image_transform</item> 
    <item name="android:windowSharedElementExitTransition"> 
     @transition/change_image_transform</item> 
</style> 

이 예에서 change_image_transform 천이 정의