質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

1回答

3943閲覧

Androidの画面遷移アニメーションが実機でうまく動作しない

rild

総合スコア8

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/09/01 13:05

編集2016/09/02 01:26

###前提・実現したいこと
こちらのサイト
Qiita:画面遷移を滑らかに (Activity Transitions)
を元に、Androidの画面遷移アニメーションのテストアプリを作っていて問題が解決できなくなってしまいました。

エミュレータと実機で動作が異なるので、実機でうまく動作できる様にしたいです。

###発生している問題・エラーメッセージ

Genymotion上のNexus 5(API 23)ではうまく動作するのですが、実機Xperia Z3(API 21)でテストしたところアニメーションがうまくいかない場合があります。

うまくいく場合

エミュレータGIFリンク

うまくいかない場合

実機GIFリンク

上手くいく場合と比較して、画面遷移の時に黒い画面が出てしまっていたり、拡大のアニメーションの表示がされていない感じがします。

ただし、上手くアニメーションがつく場合もあります。。。

エラーログ

字数制限のため[ImageViewでの画面遷移テスト]の項目と統合

###該当のソースコード

MainActivity.java

どの部分を載せればばいいか判然としないので、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

  • エミュレータでのログ
  • 実機でのログ

を転載しました。

エミュレータ

エミュレータでの動作画面GIF

E/Surface: getSlotFromBufferLocked: unknown buffer: 0xeb0b3240

エミュレータでのテストのみ、上のエラーメッセージが出ました。

実機

実機での動作画面GIF

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の場合では確認できませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

GIFを見た感じだとアニメーションがスキップされていますね。
ログを確認してください。
「Too match work on UI thread」や「
60 frames skipped」といったメッセージは出ていませんか?

投稿2016/09/01 15:28

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rild

2016/09/01 21:20 編集

回答ありがとうございます。 ログにご指摘いただいたエラーメッセージはありませんでしたが、 [読みにくかったので、本文に転載しました] が稀に出ました。こちらのエラーはGridViewに読み込む画像のサイズを大きくすると起きやすくなるみたいでした。 ``` W/art: Suspending all threads took: 6.515ms ``` こちらの警告もたまに出ていました。 アニメーションがうまくいっている時も、行かない時も [読みにくかったので、本文に転載しました] といったログが基本でした。 「UIアニメーションがうまくいかない場合」を中心にもう少し調べてみます。
yona

2016/09/01 21:57

画像を一枚にしてやってみてください。 また、実機とエミュレータのログを両方とも載せてください。
rild

2016/09/02 01:33

GridViewでなく、ImageView単体でテストしてみましたが、同じ現象が確認できました。 GitHub : rejasupotaro/MaterialDesignSample https://github.com/rejasupotaro/MaterialDesignSample を参考にうまくいく方法を探ってみます 度々すみません ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問