カスタム絵文字の対応について
APNG対応は aellerton/japng_android
を元にAnimationDrawable を使わないようにまるっと書き換えた。ロード直後にデコードしてビットマップ+フレーム時刻のリストにしておく感じ。スパン側で再生開始からの時刻を計算できるようにして、ビットマップのリストから二分探索して適切なコマを探して、次のコマまでの時間を計算する。描画したらHandler#postDelayedで遅延させてTextViewをinvalidateさせる。
画像キャッシュは最後に使った時刻が一定より古い奴を解放するよくあるやつ。管理対象がBitmap直接ではなくAPNGロード後のフレームリストになってる。Bitmapのrecycleを忘れずに行う。
カスタム絵文字の対応について
誰の役に立つのか不明だがメモ的に…
API出力からemojisをパースするとこから始まり、文字装飾スパンのカスタム版を書き起こしてステータス中のshortcode部分にセット。スパンが描画されるタイミングで画像キャッシュを探して、なければ裏でロード開始。ロード完了したらTextViewをinvalidateして再描画させる。
描画先がViewでもDrawableでもなくSpanだってのが面倒くさい。ロード完了時やアニメーション時に再描画させる必要があるが、Span単位ではなくView単位でinvalidateするしかない。うちの場合Spanの寿命とViewの寿命は連動してないので、View#setTextのタイミングでテキスト中のスパン全部にコールバックを登録してそれ経由でView#postInvalidate を呼び出してる。
じさばどん