2016-05-14 8 views
1

Ich versuche, den Abstand zwischen dem Text und der linken Seite eines TextView zu erhalten. Es verwendet die Eigenschaft android:gravity="center".Platz zwischen Text und der Grenze von TextView

enter image description here

Ich mag den Abstand der roten Balken bekommen (diese roten Balken sind kein Teil des Layouts) die blaue Taste zum Zentrum. Was soll ich machen? Der dunkle Bereich repräsentiert die Grenzen des TextView.

Ich möchte keine CompoundDrawable verwenden, da diese Ansicht die Farbe der Schaltfläche zufällig ändern wird.

Der Code der Ansicht (in Kotlin geschrieben):

class BallTextView: TextView { 

    private lateinit var ballPaint : Paint 
    private var ballRadius : Float = 10f 
    private var ballColor : Int = Color.BLACK 

    constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) { 
    initializeAttributes(attrs) 
    configBall() 
    } 

    override fun onDraw(canvas: Canvas) { 
    canvas.drawCircle(ballRadius, height.toFloat()/2, ballRadius, ballPaint) 
    super.onDraw(canvas) 
    } 

    fun configBall() { 
    ballPaint = Paint() 
    ballPaint.isAntiAlias = true 
    ballPaint.color = ballColor 
    } 

    fun initializeAttributes(attrs: AttributeSet) { 
    val attributes = context.obtainStyledAttributes(attrs, R.styleable.ball_textview) 
    ballRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
     attributes.getFloat(R.styleable.ball_textview_ball_radius, ballRadius), 
     context.resources.displayMetrics) 
    ballColor = attributes.getColor(R.styleable.ball_textview_ball_color, ballColor) 
    } 

} 

Dank.

+0

posten Sie bitte Ihren XML-Code – Pranita

+1

Das XML macht hier keinen Unterschied. –

+1

Überprüfen Sie die 'getLineBounds()' Methode. Das "Rect", das Sie als zweites Argument übergeben, hat nach dem Aufruf den horizontalen Einschub als "linken" Feldwert. –

Antwort

1

Die TextView#getLineBounds(int, Rect) Methode ist, was Sie wollen.

Der erste Parameter ist die nullbasierte Zeilennummer und der zweite Parameter ist ein Rect Objekt, das die Begrenzungswerte der angegebenen Zeile nach dem Aufruf enthält. Das left Feld der Rect hat den horizontalen Einsatz der Linie, den Sie mit dem Radius des gezeichneten Kreises verwenden können, um die X-Koordinate des Mittelpunkts zu bestimmen.

2

Meine andere Lösung war:

override fun onDraw(canvas: Canvas) { 
    if (xPosition == 0f) { 
     xPosition = (width - paint.measureText(text.toString()))/3 
    } 
    canvas.drawCircle(xPosition, height.toFloat()/2, ballRadius, ballPaint) 
    super.onDraw(canvas) 
    } 

@MikeM. Was denkst du über diesen Ansatz?

+0

Oh, hey. Ja, was auch immer für dich funktioniert. Ich bin mir nicht sicher, warum Sie den Unterschied durch 3 teilen, aber ich nehme an, es ist nur Feinabstimmung für Ihren Anwendungsfall. Just FYI, das @ username Ding funktioniert nicht in Antworten, nur in Kommentaren. Anyhoo, froh, dass es funktioniert hat. Prost! –

Verwandte Themen