Android: establece el margen en el lado izquierdo del botón de radio que se puede dibujar

Jan 10 2021

Quiero establecer un margen / relleno entre mi botón de radio dibujable y el lado izquierdo, por ejemplo: Establecer un margen de 8dp entre mi botón de radio dibujable y el lado izquierdo de la pantalla. Sé cómo establecer un margen entre el botón de radio en sí, pero no cómo hacerlo con el botón de radio que se puede dibujar. También sé cómo establecer un margen derecho del botón de radio que se puede dibujar con paddngStart = "YOUR_PADDING".

es posible?

Aquí una imagen de lo que quiero decir:

Actualmente

Lo que quiero

EDITAR

La respuesta escrita anterior funciona. Para aquellos que quieran establecer el valor dentro del diseño y no mediante programación, he escrito un adaptador de enlace:

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

Luego puede usarlo dentro de su diseño CustomRadioButton con app:setDrawableLeftPadding="@{8f}"

Respuestas

1 mhdwajeeh.95 Jan 10 2021 at 23:20

Si desea lograr exactamente lo mismo en lo que muestra su segunda imagen, puede escribir una personalizada RadioButtonque maneje este relleno, el código de vista personalizada puede ser así (en 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)
    }
}

Puede establecer el valor de relleno estableciendo el valor del campo startPadding, por ejemplo:

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

// or

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