Android OOM при программной генерации рисования - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь программно сгенерировать некоторые drawables для приложения. Drawables представляют приращения половин таблетки и генерируются следующим образом:

private fun createPillFullDosage(context: Activity, dosage: Int) : Drawable {
    val pill = GradientDrawable()
    pill.shape = GradientDrawable.OVAL
    pill.setSize(40, 40)
    pill.setStroke(1, Color.TRANSPARENT)
    pill.setColor(when (dosage){
        1 -> ContextCompat.getColor(context, R.color.colorPrimary25)
        2 -> ContextCompat.getColor(context, R.color.colorPrimary50)
        3 -> ContextCompat.getColor(context, R.color.colorPrimary75)
        else -> Color.TRANSPARENT
    })
    return pill
}

private fun createPillHalfDosage(context: Activity, dosage: Int) : Drawable {
    val pill = GradientDrawable()
    pill.shape = GradientDrawable.RECTANGLE
    pill.setSize(20, 40)

    pill.cornerRadii = floatArrayOf(20.0f, 20.0f, 0.0f, 0.0f,
        0.0f, 0.0f, 20.0f*scale, 20.0f*scale)
    pill.setStroke(1, Color.TRANSPARENT)
    pill.setColor(when (dosage){
        1 -> ContextCompat.getColor(context, R.color.colorPrimary50)
        else -> Color.TRANSPARENT
    })
    return pill
}

private fun generatePill(context: Activity, dosage: Int, color: String): Drawable? {
    val dFull = dosage / 2
    val dHalf = dosage % 2
    val pillFull = createPillFullDosage(context, dFull)
    val pillHalf = createPillHalfDosage(context, dHalf)
    val layers = arrayOf(pillFull, pillHalf)
    val layerDrawable = LayerDrawable(layers)
    layerDrawable.setLayerGravity(0, Gravity.CENTER)
    layerDrawable.setLayerGravity(1, Gravity.CENTER)
    layerDrawable.setLayerInsetRight(1, 20)
    return layerDrawable
}

fun getPillSelector(context: Activity, dosage: Int): Drawable {
    val drawable = StateListDrawable()
    drawable.setExitFadeDuration(1000)
    drawable.addState(
        IntArray(android.R.attr.state_checked),
        generateSintromPill(context, dosage)
    )
    // Here goes some more states
    return drawable
}

Затем в основном упражнении я генерирую список drawables для всех случаев,

    val drawables = List<Drawable>(5){i -> getPillSelector(requireActivity(), i+1)}

Если Я пытаюсь создать 6 вместо 5, я получаю OOM, и приложение вылетает. Что я должен делать по-другому? Мне действительно нужно создать (если бы это было так) 12 drawables в xml?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...