2017-07-12 14 views
-1

アクティビティ間の遷移中にビューをアニメーション化する簡単で一般的な方法はありますか?各遷移に固有のコードを記述することなく、ソースビューとターゲットビューのみを必要とする関数もあります。ビューをアニメーション化する簡単な方法アクティビティ間での遷移の切り替え

+1

私はいくつかの便利なコードを共有しようとしています。なぜそれをdownvote? –

答えて

-1

は、いくつかの研究の後、私は、これらの機能を使用して移行について意見をアニメーション化するための一般的な、非常に簡単な方法を見つけた:

private static final String VIEW_TRANSITION_PREFIX = "view_transition_"; 

public static void startActivityAnimatingViews(@NonNull final Activity activity, @NonNull final Intent intent, View... views) { 
     Log.d(TAG, "startActivityAnimatingViews() called with: activity = [" + activity + "], intent = [" + intent + "], views = [" + Arrays.deepToString(views) + "]"); 
     if (views != null) { 
      final List<Pair<View, String>> pairs = new ArrayList<>(); 

      for (int i = 0; i < views.length; i++) { 
       final View view = views[i]; 
       final String transitionName = getTransitionNameForView(i); 
       view.setTransitionName(transitionName); 
       Pair<View, String> pair = Pair.create(view, transitionName); 
       pairs.add(pair); 
      } 

      activity.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        //noinspection unchecked 
        ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pairs.toArray(new Pair[pairs.size()])); 
        activity.startActivity(intent, options.toBundle()); 
       } 
      }); 

     }else{ 
      activity.startActivity(intent); 
     } 
    } 

    public static void onCreateActivityAnimatingViews(View... views) { 
     Log.d(TAG, "onCreateActivityAnimatingViews() called with: views = [" + Arrays.deepToString(views) + "]"); 
     if (views != null) { 
      for (int i = 0; i < views.length; i++) { 
       views[i].setTransitionName(getTransitionNameForView(i)); 
      } 
     } 
    } 

    @NonNull 
    private static String getTransitionNameForView(int index) { 
     return VIEW_TRANSITION_PREFIX + index; 
    } 

あなたは新しいを開始したいときにstartActivityAnimatingViewsを呼び出す必要があり、これらの機能を使用するにはアクティビティを作成し、アニメーション化する現在のアクティビティのビューを渡します。次に、第2アクティビティのonCreateonCreateActivityAnimatingViewsと表示され、ビューのターゲットはと同じ順番でとなります。 Intent.FLAG_ACTIVITY_NEW_TASKまたはIntent.FLAG_ACTIVITY_CLEAR_TASKようintentにいくつかのフラグが働いてからアニメーションを防ぐことが

public class FirstActivity extends AppCompatActivity { 

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

     findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       UiUtils.startActivityAnimatingViews(FirstActivity.this, new Intent(FirstActivity.this, SecondActivity.class), FirstActivity.this.findViewById(R.id.first_view1), FirstActivity.this.findViewById(R.id.first_view2)); 
      } 
     }); 
    } 
} 

public class SecondActivity extends AppCompatActivity { 

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

     UiUtils.onCreateActivityAnimatingViews(findViewById(R.id.second_view1), findViewById(R.id.second_view2)); 
    } 
} 

注:

簡単にするためには、ここで別のアクティビティから2つのビューをアニメーション化する方法の例です。