見せたいね2019-05-04たくさんのTextViewをアニメーションさせるAndroid画面に20個ぐらいアニメーションするビューがあってなんとかして60fps出すためにいろいろやったことをメモしておく。エミュレーターでやってたのが全部悪い(実環境で動かしたらわりとすんなり出た)というオチなので参考になるかはわからない。前提ValueAnimatorでAnimatableなDrawableをKeyFrameで波紋のようなアニメーションを周期的に動かす。これはせいぜい数個ValueAnimatorでTextViewのtextColor(白と黒の間のグレースケール)を周期的に変えていく。これは20個ぐらいある方針Debug.startMethodTracing()で数フレーム分観測し、いらない処理を見つけてこれが実行されないように削っていく。この資料の38Pから数ページが参考になる。Studioのメモリアナライザも使ったりした。ポイントValueAnimatorでアニメーションをやるときは次のメソッドを実装することになると思うが、この中の処理を軽くしたり、中で新しいオブジェクトを作らないようにする。TypeEvaluator.evaluate()SDKのクラスを使うときは中で何をやっているか確認する。Intがevaluate()に渡される時にはIntegerのオブジェクトになってしまう。AnimatorUpdateListener.onAnimationUpdate()Drawable.draw()やったことオブジェクト生成の抑制listOf()とかarrayOf()とかで作っていたKeyFrameのvalueの配列をfloatArrayOf()にする。これによりTypeEvaluatorに値を渡すときのFloatオブジェクトの生成を抑制できるFloatTypeEvaluatorにキャッシュ用の配列を渡して初期化する。これをしないとフレームごとにfloat[]が作られてしまう配列操作の処理でmapとかfilterを使っているところをfor文に置き換える。FloatArrayでmapとかを呼ぶとIteratorがフレームごとに作られてしまうしnext()がちょっと気になるくらい遅い。Javaコードにデコンパイルしてコードを見ると、mapに渡した関数がクラスになっていてこれのオブジェクトも毎フレーム生成されていた。描画系すべてのTextViewの背景にAnimatableなDrawableをセットして、動かすときになったら表示させるようにしていたがこれをやめて、アニメーションさせるときにはじめてセットする。Drawableがセットされていたら更新しようとするのでこれをやめさせる。WRAP_CONTENTなTextViewにGravity.CENTERを指定していたのをはずす。テキストアライメントがNORMAL以外だとBolingLayout.draw()の中で毎回描画領域の再計算が行われてしまうのでこれをやめさせる。NORMALになっていると即座にCanvas.drawText()が実行される。ヒントテキストもリンクも必要ないので、hintTextColorとlinkTextColorにnullをセットしておく。これをやっておくとTextView.setTextColor()をやった時にhintTextColorとかlinkTextColorも更新しようとするのを防げる。TextView.setTextColor(int)ではなくTextView.setTextColor(ColorStateList)のほうを使う。ColorIntを渡すほうは内部的にColorStateList.valueOf(int)を呼んでColorStateListに変換しているのだが、内部的にsynchronizedで囲われているせいか時々めっちゃ遅いことがある。グレースケールなら長さ256の配列に収まるのでアプリ起動時に作ってこれを使うようにする。同じタイミングで動く複数のDrawableを別々のValueAnimatorで制御していたが、これをやめて一つのValueAnimatorのなかで全部のDrawableのinvalidateをやることにした。Drawable.invalidateSelf()をやめてView.postInvalidateInAnimation()を使うようにした。01:35たくさんのTextViewをアニメーションさせるTweet広告を非表示にする関連記事2017-05-31ExoPlayerのAudioProcessorを実装する頭外音像定位のデモためのAndroidアプリを作っている。読者になるリンクはてなブログブログをはじめる(無料)お知らせ検索はてなブログをはじめよう!akihito104さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。