自定义视图不是在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
分配不是一个好主意。 你可以在这里找到解释。