在 TextView 的文本和边界之间获取 space
Get space between text and bound of TextView
我正在尝试获取文本与 TextView 左侧之间的距离。它使用 属性 android:gravity="center"
.
我想得到红色条(这个红色条不是布局的一部分)到蓝色按钮居中的距离。我应该怎么办?
深色区域表示 TextView 的边界。
我不想使用 compoundDrawable,因为这个视图会随机改变按钮的颜色。
视图代码(Kotlin编写):
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)
}
}
谢谢。
TextView#getLineBounds(int, Rect)
方法就是你想要的。
第一个参数是从零开始的行号,第二个参数是一个 Rect
对象,它将在调用后保存给定行的边界值。 Rect
的 left
字段将有直线的水平插入,您可以将其与绘制的圆的半径一起使用来计算其中心的 x 坐标。
我的另一个解决方案是:
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。您如何看待这种做法?
我正在尝试获取文本与 TextView 左侧之间的距离。它使用 属性 android:gravity="center"
.
我想得到红色条(这个红色条不是布局的一部分)到蓝色按钮居中的距离。我应该怎么办? 深色区域表示 TextView 的边界。
我不想使用 compoundDrawable,因为这个视图会随机改变按钮的颜色。
视图代码(Kotlin编写):
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)
}
}
谢谢。
TextView#getLineBounds(int, Rect)
方法就是你想要的。
第一个参数是从零开始的行号,第二个参数是一个 Rect
对象,它将在调用后保存给定行的边界值。 Rect
的 left
字段将有直线的水平插入,您可以将其与绘制的圆的半径一起使用来计算其中心的 x 坐标。
我的另一个解决方案是:
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。您如何看待这种做法?