Android kotlin 自定义View 使用贝斯尔曲线可以设置中间位置是否有凸起效果
使用贝塞尔曲线实现自定义View,并设置中间位置是否有凸起效果,可以按照以下步骤进行:
-
创建一个继承自View的自定义View类,命名为CustomView。
-
在CustomView类中定义一些必要的属性,例如曲线的颜色、宽度等。
-
在CustomView类的构造方法中初始化一些默认值,并设置一些默认属性。
-
在CustomView类中重写onDraw方法,使用Canvas和Path来绘制贝塞尔曲线。
-
在绘制贝塞尔曲线之前,根据设置的中间位置是否有凸起效果,分别计算曲线的控制点坐标。
-
根据计算出的控制点坐标,使用Path.moveTo和Path.cubicTo绘制贝塞尔曲线。
-
最后,在自定义View的外部使用时,可以通过调用一些公开的方法来设置中间位置是否有凸起效果。
下面是一个简单的示例代码:
class CustomView(context: Context, attrs: AttributeSet) : View(context, attrs) {
private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
private val path = Path()
private var isRaised = false
init {
// 初始化默认属性
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomView)
val curveColor = typedArray.getColor(R.styleable.CustomView_curveColor, Color.BLACK)
val curveWidth = typedArray.getDimension(R.styleable.CustomView_curveWidth, 5f)
isRaised = typedArray.getBoolean(R.styleable.CustomView_isRaised, false)
typedArray.recycle()
paint.color = curveColor
paint.style = Paint.Style.STROKE
paint.strokeWidth = curveWidth
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val width = width.toFloat()
val height = height.toFloat()
val middleX = width / 2
val middleY = height / 2
path.reset()
path.moveTo(0f, middleY)
if (isRaised) {
// 有凸起效果
val controlY = middleY - height / 4
path.cubicTo(
middleX / 2, controlY,
middleX / 2, controlY,
middleX, middleY
)
path.cubicTo(
middleX + middleX / 2, controlY,
middleX + middleX / 2, controlY,
width, middleY
)
} else {
// 无凸起效果
path.lineTo(width, middleY)
}
canvas.drawPath(path, paint)
}
fun setRaised(isRaised: Boolean) {
this.isRaised = isRaised
invalidate()
}
}
在布局文件中使用自定义View时,可以通过设置app:isRaised属性来控制中间位置是否有凸起效果:
<com.example.CustomView
android:layout_width="match_parent"
android:layout_height="200dp"
app:isRaised="true"
app:curveColor="#FF0000"
app:curveWidth="6dp" />
在代码中,也可以通过调用setRaised方法来动态设置中间位置是否有凸起效果:
val customView = findViewById<CustomView>(R.id.customView)
customView.setRaised(true)
``
原文地址: https://www.cveoy.top/t/topic/iRMm 著作权归作者所有。请勿转载和采集!