Android: defina a margem para o lado esquerdo do drawable do botão de opção

Jan 10 2021

Desejo definir uma margem / preenchimento entre meu drawable de botão de rádio e o lado esquerdo dele, por exemplo: Definir uma margem de 8 dp entre meu drawable de botão de rádio e o lado esquerdo da tela. Eu sei como definir uma margem entre o botão de rádio propriamente dito, mas não como fazer isso com o drawable do botão de rádio. Eu também sei como definir uma margem do lado direito do drawable do botão de rádio com paddngStart = "YOUR_PADDING".

Isso é possível?

Aqui está uma imagem do que quero dizer:

Atualmente

O que eu quero

EDITAR

A resposta escrita aboven funciona. Para aqueles que desejam definir o valor dentro do layout e não de forma programática, escrevi um adaptador de ligação:

@BindingAdapter("setDrawableLeftPadding")
fun setDrawableLeftPadding(view: CustomRadioButton, padding: Float) {
    view.setStartPaddingDp(padding)
}

Você pode então usá-lo dentro de seu layout CustomRadioButton com app:setDrawableLeftPadding="@{8f}"

Respostas

1 mhdwajeeh.95 Jan 10 2021 at 23:20

Se você deseja obter exatamente o mesmo no que sua segunda imagem mostra, você pode escrever um personalizado RadioButtonque lide com esse preenchimento, o código de visualização personalizada pode ser assim (em Kotlin) :

import android.content.Context
import android.graphics.Canvas
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatRadioButton

class CustomRadioButton : AppCompatRadioButton {

    // the value of your padding (in pixels) from the start of the radio button
    var startPadding: Int = 0
        get
        set(value) {
            field = value
            requestLayout()
        }

    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr
    )


    fun setStartPaddingDp(paddingDp: Float) {
        startPaddingPx = (paddingDp * context.resources.displayMetrics.density).toInt()
    }


    override fun onDraw(canvas: Canvas?) {
        // todo: handle Right-To-Left layouts
        canvas?.translate(startPadding.toFloat(), 0f)

        super.onDraw(canvas)
    }

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)

        setMeasuredDimension(measuredWidth + startPadding, measuredHeight)
    }
}

Você pode definir o valor de preenchimento definindo o valor do campo startPadding, por exemplo:

yourCustomRadioButton.startPadding = 100 // this value is in pixels

// or

yourCustomRadioButton.setStartPaddingDp(100) // this value is in DP