Android: imposta il margine sul lato sinistro del pulsante di opzione disegnabile

Jan 10 2021

Voglio impostare un margine / riempimento tra il mio pulsante di opzione disegnabile e il lato sinistro di esso, ad esempio: Impostazione di un margine di 8dp tra il mio pulsante di opzione disegnabile e il lato sinistro dello schermo. So come impostare un margine tra il radiobutton stesso, ma non come farlo con il radiobutton disegnabile. So anche come impostare un margine sul lato destro del radiobutton disegnabile con paddngStart = "YOUR_PADDING".

È possibile?

Ecco un'immagine di cosa intendo:

Attualmente

Quello che voglio

MODIFICARE

La risposta scritta sopra funziona. Per coloro che vogliono impostare il valore all'interno del layout e non a livello di programmazione, ho scritto un adattatore di associazione:

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

Puoi quindi usarlo all'interno del tuo layout CustomRadioButton con app:setDrawableLeftPadding="@{8f}"

Risposte

1 mhdwajeeh.95 Jan 10 2021 at 23:20

Se vuoi ottenere lo stesso identico risultato su ciò che mostra la tua seconda immagine, puoi scrivere un custom RadioButtonche gestisca questo riempimento, il codice della visualizzazione personalizzata può essere così (in 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)
    }
}

È possibile impostare il valore di riempimento impostando il valore del campo startPadding, ad esempio:

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

// or

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