Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为活动之间的视图转换设置动画的简单方法_Android_Android Animation_Android Transitions - Fatal编程技术网

Android 为活动之间的视图转换设置动画的简单方法

Android 为活动之间的视图转换设置动画的简单方法,android,android-animation,android-transitions,Android,Android Animation,Android Transitions,在活动之间转换时,是否有一种简单而通用的方法来设置视图动画?一些函数只需要源视图和目标视图,而不编写任何特定于每个转换的代码。经过一些研究,我发现了一种通用且非常简单的方法,可以使用这些函数在转换上设置视图动画: private static final String VIEW_TRANSITION_PREFIX = "view_transition_"; public static void startActivityAnimatingViews(@NonNull final Activit

在活动之间转换时,是否有一种简单而通用的方法来设置视图动画?一些函数只需要源视图和目标视图,而不编写任何特定于每个转换的代码。

经过一些研究,我发现了一种通用且非常简单的方法,可以使用这些函数在转换上设置视图动画:

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;
    }
请注意,
intent
上的某些标志,如
intent.FLAG\u ACTIVITY\u NEW\u TASK
intent.FLAG\u ACTIVITY\u CLEAR\u TASK
可能会阻止动画工作

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));
    }
}