パルカワ2

最近はFlutterをやっています

ActivityOptionsCompat.makeSceneTransitionAnimation(...) を使う

Activity間で共通の画像があって、それをシューンと移動させるのがマテリアルしてんじゃん!という感じなのでやってみた。
試したのは、エミュレータAndroid 7.0です。全部のコードはここにある。

github.com

f:id:hisaichi5518:20170927234954g:plain

このような感じに動くシンプルなやつ

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        GlideApp.with(this)
                .load(R.drawable.sample)
                .into(binding.view1);

        RxView.clicks(binding.view1).subscribe(__ -> {
            ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
                    this, binding.view1, "image");

            ContextCompat.startActivity(this, new NextActivity.IntentBuilder(this).build(), options.toBundle());
        });
    }
}

遷移先のActivity

public class NextActivity extends AppCompatActivity {

    private ActivityNextBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_next);

        GlideApp.with(this)
                .load(R.drawable.sample)
                .into(binding.view1);

        RxView.clicks(binding.view1).subscribe(__ -> {
            ActivityCompat.finishAfterTransition(this);
        });
    }


    static class IntentBuilder {
        private final Context context;

        IntentBuilder(Context context) {
            this.context = context;
        }

        Intent build() {
            return new Intent(context, NextActivity.class);
        }
    }
}

あとは遷移先のImageViewにandroid:transitionName="image"を指定してあげると動く。
案外簡単だった。windowに値をセットして〜〜〜とか説明してる記事がいくつかあったけど、特にいらなかった。試したのがAndroid 7.0だからかもしれない。またtransitionNameはstrings.xmlとかに書くのが本当はいいと思う。

時々変に移動する時がある。これはよくわからなかった。