安卓自定义控件——水波纹扩散

先上效果图。。。。
在这里插入图片描述
先上代码,再说思路

class WaterView : View {
    private var heigh = 0
    private var widt = 0

    private var centerRadius = 0f // 中心园的半径
    private var maxDistance = 0f // 最大的宽度
    private var distance = 2 //每次圆递增间距

    private var centerColor = 0 //  中心颜色
    private var spreadColor = 0 //  扩散颜色
    private var ringNum = 3 //每次圆递增间距
    private var scale = 0.8f // 中心园的比例


    private var paintCenter: Paint = Paint()
    private var paint: Paint = Paint()

    private val listRing = ArrayList<ItemRing>()

    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
        val ta = context!!.obtainStyledAttributes(attrs, R.styleable.WaterView, 0, 0)
        centerColor = ta.getColor(R.styleable.WaterView_centerColor,Color.WHITE)
        spreadColor = ta.getColor(R.styleable.WaterView_spreadColor,Color.BLUE)
        ringNum = ta.getInteger(R.styleable.WaterView_ringNum,3)
        scale = ta.getFloat(R.styleable.WaterView_ringRatio,0.7f)
        distance = ta.getInteger(R.styleable.WaterView_ringSpeed,2)
        paintCenter.color = centerColor
        paint.color = spreadColor
        paintCenter.isAntiAlias = true
        paint.isAntiAlias = true
        listRing.add(ItemRing(255, 0f))
    }

    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)

        widt = w
        heigh = h

        centerRadius = widt / 2 * scale

        maxDistance = widt / 2 * (1 - scale)
    }

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

        // 循环外圈圆
        for (itemRing in listRing) {
            // 绘制外圈圆
            paint.alpha = itemRing.alpha
            canvas!!.drawCircle(widt.toFloat() / 2, heigh.toFloat() / 2, itemRing.width + centerRadius, paint)
            if (itemRing.width < widt / 2) {
                itemRing.width = itemRing.width + distance

                itemRing.alpha = 255- (255 * (itemRing.width / maxDistance)).toInt()
            }
        }

        if (listRing.last().width >= maxDistance / ringNum) {
            listRing.add(ItemRing(255, 0f))
        }


        if (listRing.first().width >= maxDistance) {
            listRing.removeAt(0)
        }
      // 循环内圈圆  
        canvas!!.drawCircle(widt.toFloat() / 2, heigh.toFloat() / 2, centerRadius, paintCenter)
        postInvalidateDelayed(20)
    }

    data class ItemRing(var alpha: Int
                        , var width: Float)

}

先说一下思路,借鉴网上的思路
首先绘制外圈圆,确定中心位置。最重要的是半径和透明度
ItemRing 收集透明度和半径
listRing用来装外圈圆,每一个item就是一个外圈圆。

 // 循环外圈圆
        for (itemRing in listRing) {
            // 绘制外圈圆
            paint.alpha = itemRing.alpha
            canvas!!.drawCircle(widt.toFloat() / 2, heigh.toFloat() / 2, itemRing.width + centerRadius, paint)
            if (itemRing.width < widt / 2) {
                itemRing.width = itemRing.width + distance

                itemRing.alpha = 255- (255 * (itemRing.width / maxDistance)).toInt()
            }
        }

每一次绘制外圈圆,就增加半径和透明度。以造成扩散的效果。


  if (listRing.last().width >= maxDistance / ringNum) {
            listRing.add(ItemRing(255, 0f))
        }

当外圈圆的半径大于间隔的时候 添加外圈圆 源源不断


if (listRing.first().width >= maxDistance) {
            listRing.removeAt(0)
        }

当外圈圆超过了最大距离 就remove掉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值