アクティビティ間の遷移中にビューをアニメーション化する簡単で一般的な方法はありますか?各遷移に固有のコードを記述することなく、ソースビューとターゲットビューのみを必要とする関数もあります。ビューをアニメーション化する簡単な方法アクティビティ間での遷移の切り替え
-1
A
答えて
-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アクティビティのonCreate
にonCreateActivityAnimatingViews
と表示され、ビューのターゲットはと同じ順番でとなります。 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つのビューをアニメーション化する方法の例です。
私はいくつかの便利なコードを共有しようとしています。なぜそれをdownvote? –