自定义视图不是在Android中绘制的

我为我的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类错误或者我错误的坐标系理解。 如何正确绘制视图中心的中心圆?

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

该代码将在实例初始化时进行评估。 此时, width = 0, height = 0。因为视图还没有被测量。

您可以在onDraw添加一个Log.d(...)或一个断点,您将看到该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分配不是一个好主意。 你可以在这里找到解释。