2021-11-06

自定义控件(一):

1. 安卓自定义控件最基本的图形绘制依赖于两个工具,“Paint类/画笔”、“Canvas类/画布”
我们设置画笔大小、粗细、颜色、透明度、字体的样式,都在Paint类/画笔中操作;
我们凡是要画出成品的东西,比如圆形矩形文字等,都要调用Canvas类里的函数生成。

1.1画笔的三大基本属性

画笔颜色paint.color = Color.RED
填充样式paint.style = Paint.Style.STROKE
画笔宽度paint.strokeWidth =50
class BaseView : View {
    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

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

        //设置画笔的属性
        val paint = Paint()
        paint.color = Color.RED
        paint.style = Paint.Style.STROKE
        paint.strokeWidth = 50F

        //画图
        canvas?.drawCircle(190F, 200F, 150F, paint)
    }
}

上图代码块可以看出自定义控件继承了View类,如果你想生成一个类似于LinearLayout、RelativeLayout这样的一个容器,则需继承自ViewGroup类。当然ViewGroup类也是派生于View类。注意:这样生成的自定义控件全部都需要单独处理wrap_content情况!
这是因为直接继承View或者ViewGroup类的控件,如果不在onMeasure中对wrap_content做特殊处理,那么当外界在布局中使用wrap_content时就无法达到预期的结果。如果想要不自己处理自定义控件中的wrap_content和padding,就需要派生于特定的View,例如TextView。
观察上面代码块发现创建Paint对象和其他对象时都是在onDraw()方法中实现的,这是禁止的,因为onDraw()方法在重绘时就会被调用,所以该方法中创建的对象会被重复创建,引起严重的GC问题,从而会引起程序卡顿,甚至于ANR现象!
我们也应该注意到onDraw()方法的入参canvas,这就是当前控件的画布,我们只要调用onDraw()方法,效果就可以直接显示在当前控件上!
1.2 Canvas使用基础
兄弟们,我不写了,有点杂

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值