【问题标题】:Get space between text and bound of TextView获取文本和 TextView 边界之间的空间
【发布时间】:2016-09-10 08:08:35
【问题描述】:

我正在尝试获取文本与 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)
  }

}

谢谢。

【问题讨论】:

  • 请发布您的 xml 代码
  • XML 在这里没有区别。
  • 查看getLineBounds() 方法。作为第二个参数传递的Rect 将在调用后将水平插入作为其left 字段值。
  • @MikeM.你知道有什么方法可以获取 TextView 的画布吗?
  • @MikeM。你能创造出答案吗?这解决了我的问题。

标签: android android-layout android-custom-view


【解决方案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。您如何看待这种方法?

    【讨论】:

    • 哦,嘿。是的,任何对你有用的东西。不过,我不确定您为什么将差异除以 3,但我认为这只是针对您的用例进行的微调。仅供参考,@username 在答案中不起作用,仅在 cmets 中起作用。 Anyhoo,很高兴你让它工作。干杯!
    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2014-08-16
    • 2013-01-21
    • 2014-12-05
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多