2016-05-14 68 views
1

我想要获得文本和TextView左边之间的距离。它使用属性android:gravity="center"获取文本和TextView边界之间的空间

enter image description here

我想要得到的红条的距离(这个红色条是不是布局的一部分)以中央的蓝色按钮。我该怎么办? 黑暗区域代表TextView的边界。

我不想使用compoundDrawable,因为此视图会随机更改按钮的颜色。

视图(写在科特林)的代码:

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) 
    } 

} 

感谢。

+0

请发布您的xml代码 – Pranita

+1

XML在这里没有任何区别。 –

+1

查看getLineBounds()方法。作为第二个参数传递的'Rect'将在调用后将水平插入作为它的'left'字段值。 –

回答

1

TextView#getLineBounds(int, Rect)方法是你想要的。

第一个参数是基于零的行号,第二个参数是一个Rect对象,该对象将保存调用后给定行的边界值。 Rectleft字段将具有该线的水平插入点,您可以使用您绘制的圆的半径来计算其中心的x坐标。

2

我的另一种解决方案是:

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。你对这种方法有什么看法?

+0

哦,嘿。是的,无论什么工作适用于你。我不确定为什么你将差异除以3,但我认为这只是对你的用例进行微调。只是供参考,@username的东西不适用于答案,只是在评论中。 Anyhoo,很高兴你能工作。干杯! –

相关问题