課題
指定したdpサイズに対応する、端末の解像度に応じた実際のピクセルサイズが知りたい。
対応
dimens.xmlを使う。
<resources> <dimen name="user_icon">40dp</dimen> </resources>
var size = context.resources.getDimensionPixelSize(R.dimen.user_icon)
PicassoでWebP画像を表示したいが、WebPを表示するにはAcceptヘッダーにimage/webp
が必要となる。どうすればよいか。
OkHttpClientを作成し、Picasso.Builderを使ってdownloaderにセットする
addHeaderの内容はChromeのデフォルト値に合わせてみた。
q値(q=0.9)
を付けることで image/webp
が優先されるようにしている
ただし実際に効いているかは未検証。
fun initPicasso(context: Context) { val client = OkHttpClient.Builder() //NetworkInterceptorを使うとファイルキャッシュが効かなくなる .addInterceptor { val rb = it.request().newBuilder() rb.addHeader("Accept", "image/webp,image/*,*/*;q=0.8") it.proceed(rb.build()) } client.cache(createImageCache(context)) if (BuildConfig.DEBUG) { client.addNetworkInterceptor(ApiUtils.stethoInterceptor) } val builder = Picasso.Builder(context) .downloader(OkHttp3Downloader(client.build())) if (BuildConfig.DEBUG) { builder.loggingEnabled(true) .indicatorsEnabled(true) } Picasso.setSingletonInstance(builder.build()) } /** * 画像キャッシュディレクトリ作成 */ private fun createImageCache(context: Context): Cache { val maxSize: Long = 1024 * 1024 * 200 //200MB val dir = context.applicationContext.cacheDir val cache = File(dir, "picasso-cache") if (!cache.exists()) { cache.mkdirs() } return Cache(cache, maxSize) }
Picassoのリクエストヘッダーの内容をStethoで確認したい。
どうすればよいか。
以下のような感じでPicassoの初期化メソッドを用意し、Applicationクラスなどから一度だけ呼んであげれば良い。
BuildConfig.DEBUG
がtrueの場合のみ処理されるようにしている。
/** * Debug可能な状態でPicassoを初期化する */ fun initPicasso(context: Context) { if (BuildConfig.DEBUG) { val client = OkHttpClient.Builder().addNetworkInterceptor(StethoInterceptor()).build() val p = Picasso.Builder(context) .downloader(OkHttp3Downloader(client)) .loggingEnabled(true) .indicatorsEnabled(true) .build() Picasso.setSingletonInstance(p) } }