自定义视图未在Android

时间:2016-10-15 09:00:08

标签: java android canvas kotlin

我正在为我的Android应用程序实现自定义按钮,其中必须只有非填充圆圈。我在Android开发方面相对较新,所以我遇到了麻烦。

有自定义属性:

<resources>
<declare-styleable name="CircleButton">
    <attr name="stroke_width" format="dimension"/>
</declare-styleable>

课程代码:

class CircleButton (context: Context,
                attrs: AttributeSet) : View(context, attrs) {

val paint: Paint = Paint()

init {
    var a = context.theme.obtainStyledAttributes(attrs, R.styleable.CircleButton, 0, 0)
    paint.color = Color.RED
    try {
        paint.strokeWidth = a.getDimension(R.styleable.CircleButton_stroke_width, 3f)
    } finally {
        a.recycle()
    }
}

var centerX = x + width / 2
var centerY = y + height / 2
var radius = width / 2


override fun onDraw(canvas: Canvas) {
   super.onDraw(canvas)
   canvas.drawCircle(centerX.toFloat(), centerY.toFloat(), radius.toFloat(), paint)
}

override fun onMeasure(w : Int, h : Int) {
    setMeasuredDimension(w, w)
}

这是Kotlin,但我想它一切都清楚了。但无论如何,如果需要,我可以提供Java代码。

布局XML:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:paddingLeft="0dp"
    android:paddingRight="0dp"
    android:paddingTop="0dp"
    android:paddingBottom="@dimen/activity_vertical_margin">

<com.prox1mity.myapplication.CircleButton
    android:layout_width="250dp"
    android:layout_height="300dp"
    android:layout_centerInParent="true"
    custom:stroke_width="3dp"
/>

当我运行应用程序时,我只看到白屏,这意味着onDraw方法无法正常工作。但是,如果我正在通过canvas.drawColor()改变画布来填充画布,那么视图就会完全填满。这导致我认为我的Paint课程有问题或我对坐标系统的错误理解。如何正确绘制中心在视图中心的圆圈?

1 个答案:

答案 0 :(得分:0)

var centerX = x + width / 2
var centerY = y + height / 2
var radius = width / 2

此代码将在实例初始化时进行评估。此时,width = 0且height = 0.因为视图尚未测量。

您可以在Log.d(...)中添加onDraw或断点,您会看到radius = 0。

要进行快速测试,您可以将onDraw更改为:

override fun onDraw(canvas: Canvas) {
   super.onDraw(canvas)

   val centerX = width / 2
   val centerY = height / 2
   val radius = width / 2
   canvas.drawCircle(centerX.toFloat(), centerY.toFloat(), radius.toFloat(), paint)
}

也许您可以优化此代码。在onDraw中进行分配并不是一个好主意。您可以找到解释here