###前提・実現したいこと
こちらのサイト
Qiita:画面遷移を滑らかに (Activity Transitions)
を元に、Androidの画面遷移アニメーションのテストアプリを作っていて問題が解決できなくなってしまいました。
エミュレータと実機で動作が異なるので、実機でうまく動作できる様にしたいです。
###発生している問題・エラーメッセージ
Genymotion上のNexus 5(API 23)ではうまく動作するのですが、実機Xperia Z3(API 21)でテストしたところアニメーションがうまくいかない場合があります。
うまくいく場合
うまくいかない場合
上手くいく場合と比較して、画面遷移の時に黒い画面が出てしまっていたり、拡大のアニメーションの表示がされていない感じがします。
ただし、上手くアニメーションがつく場合もあります。。。
エラーログ
字数制限のため[ImageViewでの画面遷移テスト]の項目と統合
###該当のソースコード
どの部分を載せればばいいか判然としないので、githubにpushしたもののリンクを載せました。
元サイトでアニメーションを画面遷移につけるために紹介されていたのは以下のコードです。
java
1 ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation( 2 mActivity, 3 view.findViewById(R.id.row_image), 4 getString(R.string.trans_name) ); 5 Article item = (Article) mImageAdapter.getItem(position); 6 Intent intent = new Intent(mActivity, ImageDetailActivity.class); 7 intent.putExtra(ImageDetailActivity.EXTRA_CONTENT, parser.toJson(item)); 8 ActivityCompat.startActivity(mActivity, intent, options.toBundle());
###試したこと
まず、同様のトラブルが起きた例を探して、
ActivityOptions.makeSceneTransitionAnimation doesn't seem to exist
の記事を見つけ、
if (Build.VERSION.SDK_INT >= 21) { /// getWindow().requestFeature(android.view.Window.FEATURE_CONTENT_TRANSITIONS); Transition ts = new Slide(); //Slide(); //Explode(); ts.setDuration(1000); getWindow().setEnterTransition(ts); getWindow().setExitTransition(ts); ChangeBounds bounds = new ChangeBounds(); bounds.setDuration(1000); getWindow().setSharedElementEnterTransition(bounds); }
のコードをAcitivityのonCreateに加えてみました。
画面スライドのアニメーションが入った時に、他のアニメーションをしている間拡大縮小アニメーションが(他のアニメーションが付いていたのではっきりしませんが...)ちゃんと起きている様だったので、「Durationの関係でうまくいっていないのではないか」と考えました
そこで、
ActivityOptionsCompat.makeSceneTransitionAnimation with custom duration
のサイトを参考にしてみましたが、根本的解決に至りませんでした。
画像の読み込み方法を変更
GridViewに渡すAdapter内の処理を変更してみました。
Java
1 imageView.setImageBitmap(...)
で画像を渡していたところを
Java
1Picasso.with(mContext).load(item.getResImageId()).centerCrop().resize(100, 100).into(imageView);
に変更してみましたが、画面遷移に影響はなさそうでした。
ImageViewでの画面遷移テスト
アドバイスをいただいたので、画像一枚でテストをしました。
GridViewの子としていたレイアウトファイル(layout/row_list.xml)を activity_main.xmlに
xml
1 <include layout="@layout/row_list" 2 android:layout_width="100dp" 3 android:layout_height="100dp"/>
のように設定しました。
エミュレータと実機でそれぞれ3回ずつ拡大縮小の画面遷移アニメーションをさせました。
GridViewの時と動作の様子やエラーログに大きな変化はなかったようでしたが、体感で実機でもうまく動作する場合が増えた気がしました。
ログと動作画面
すべてのエラーログは字数制限の都合で載せきれなかったのでGitHubレポジトリのWikiに
- エミュレータでのログ
- 実機でのログ
を転載しました。
エミュレータ
E/Surface: getSlotFromBufferLocked: unknown buffer: 0xeb0b3240
エミュレータでのテストのみ、上のエラーメッセージが出ました。
実機
W/art: Suspending all threads took: 10.896ms
実機でのテストでは上の警告が出ました。
GridViewの場合との変化
E/ActivityThread: Performing stop of activity that is not resumed: {rimp.rild.com.android.android_activity_transition_test/rimp.rild.com.android.android_activity_transition_test.MainActivity} java.lang.RuntimeException: Performing stop of activity that is not resumed: {rimp.rild.com.android.android_activity_transition_test/rimp.rild.com.android.android_activity_transition_test.MainActivity} at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3412) at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3493) at android.app.ActivityThread.access$1100(ActivityThread.java:149) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1355) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:211) at android.app.ActivityThread.main(ActivityThread.java:5335) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811)
GridViewに表示させる画像のサイズを大きくした時に出ていたエラーメッセージはImageViewの場合では確認できませんでした。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/01 21:20 編集
2016/09/01 21:57
2016/09/02 01:33