我正在为我的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
课程有问题或我对坐标系统的错误理解。如何正确绘制中心在视图中心的圆圈?
答案 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。