Android贝塞尔曲线应用-跳动的水滴

主要通过6个控制点实现。
val startPoint = PointF()
val endPoint = PointF()
val control1 = PointF()
val control2 = PointF()
val control3 = PointF()
val control4 = PointF()

绘制过程:
private fun drawWater(canvas: Canvas) {
    waterPath.apply {
        reset()
        moveTo(startPoint)
        cubicTo(control1, control3, endPoint)
        cubicTo(control4, control2, startPoint)
    }
    canvas.save()
    // clipOut 出中间的圆
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        canvas.clipOutPath(Path().apply { addCircle(circleX, circleY, circleR, Path.Direction.CW) })
    } else {
        canvas.clipPath(Path().apply {
            addCircle(circleX, circleY, circleR, Path.Direction.CW)
        }, Region.Op.DIFFERENCE)
    }
    canvas.drawPath(waterPath, waterPaint)
    canvas.drawCircle(circleX, circleY, circleR, waterPaint)
    canvas.restore()
}
一些扩展函数,方便直接使用 PointF。
private fun Path.moveTo(p: PointF) {
    moveTo(p.x, p.y)
}
private fun Path.lineTo(p: PointF) {
    lineTo(p.x, p.y)
}
private fun Path.cubicTo(control1: PointF, control2: PointF, end: PointF) {
    cubicTo(control1.x, control1.y, control2.x, control2.y, end.x, end.y)
}
private fun Path.quadTo(control: PointF, end: PointF) {
    quadTo(control.x, control.y, end.x, end.y)
}
private fun Canvas.drawPoint(p: PointF, paint: Paint) {
    drawPoint(p.x, p.y, paint)
}
动画
分为 6 个阶段完成
class AnimatorHelper(val target: JumpWater) {
    private var animDuration = 300L
    private var animStartDown: ValueAnimator? = null
    private var animStartJump: ValueAnimator? = null
    private var animJump: ValueAnimator? = null
    private var animDown: ValueAnimator? = null
    private var animTail: ValueAnimator? = null
    private var animTailReconver: ValueAnimator? = null
    private var animSet: AnimatorSet? = null
    internal fun startJump(tailMove: Float, jumpH: Float) {
        endJump()
        animStartDown = ValueAnimator.ofFloat(0f, jumpH).apply {
            addUpdateListener {
                target.updateStartDown(it.animatedValue as Float)
            }
        }
        animStartJump = ValueAnimator.ofFloat(jumpH, 0f).apply {
            addUpdateListener {
                target.updateStartDown(it.animatedValue as Float)
            }
        }
        animJump = ValueAnimator.ofFloat(0f, jumpH).apply {
            addUpdateListener {
                target.updateJump(it.animatedValue as Float)
            }
        }
        animDown = ValueAnimator.ofFloat(jumpH, 0f).apply {
            addUpdateListener {
                target.updateJump(it.animatedValue as Float)
            }
        }
        animTail = ValueAnimator.ofFloat(0f, tailMove).apply {
            addUpdateListener {
                target.updateTail(it.animatedValue as Float)
            }
        }
        animTailReconver = ValueAnimator.ofFloat(tailMove, 0f).apply {
            addUpdateListener {
                target.updateTail(it.animatedValue as Float)
            }
        }
        val tailSet = AnimatorSet().apply {
            playTogether(animJump, animTail)
        }
        val tailSetReconver = AnimatorSet().apply {
            playTogether(animDown, animTailReconver)
        }
        animSet = AnimatorSet().apply {
            playSequentially(animStartDown, animStartJump, tailSet, tailSetReconver)
            addListener(object : Animator.AnimatorListener {
                override fun onAnimationRepeat(animation: Animator?) {
                }
                override fun onAnimationEnd(animation: Animator?) {
                    mOnAnimEndListener?.onAnimEnd()
                }
                override fun onAnimationCancel(animation: Animator?) {
                }
                override fun onAnimationStart(animation: Animator?) {
                }
            })
            start()
        }
    }
}
具体请看:https://github.com/stefanJi/AndroidView/tree/master/jumpwater
Android贝塞尔曲线应用-跳动的水滴的更多相关文章
- Android 贝塞尔曲线 折线图
		1.贝塞尔曲线:http://baike.baidu.com/view/60154.htm,在这里理解什么是贝塞尔曲线 2.直接上图: 3.100多行代码就可以画出贝塞尔曲线,直接上代码 packag ... 
- Android -- 贝塞尔曲线公式的推导
		1,最近看了几个不错的自定义view,发现里面都会涉及到贝塞尔曲线知识,深刻的了解到贝塞尔曲线是进阶自定义view的一座大山,so,今天先和大家来了解了解. 2,贝塞尔曲线作用十分广泛,简单举几个的栗 ... 
- Android -- 贝塞尔曲线公式的推导和简单使用
		1,最近看了几个不错的自定义view,发现里面都会涉及到贝塞尔曲线知识,深刻的了解到贝塞尔曲线是进阶自定义view的一座大山,so,今天先和大家来了解了解. 2,贝塞尔曲线作用十分广泛,简单举几个的栗 ... 
- Android 贝塞尔曲线解析
		相信很多同学都知道"贝塞尔曲线"这个词,我们在很多地方都能经常看到.利用"贝塞尔曲线"可以做出很多好看的UI效果,本篇博客就让我们一起学习"贝塞尔曲线 ... 
- Android 贝塞尔曲线的浅析
		博客也开了挺长时间了,一直都没有来写博客,主要原因是自己懒---此篇博客算是给2017年一个好的开始,同时也给2016年画上一个句点,不留遗憾. 那就让我们正式进入今天的主题:贝塞尔曲线. 首先,让我 ... 
- Android 贝塞尔曲线库
		最近做的一个小项目需要绘制一些折线图,AChartEngine其实里面包含很多图,虽然是开源的,但毕竟不是自己写的,而且项目稍有点庞大,有些东西修改起来还是得花点时间的,所以最后打算自己写一个,参考了 ... 
- Android 贝塞尔曲线
		博客图片备份位置: 
- Android中贝塞尔曲线的绘制方法
		贝塞尔曲线,很多人可能不太了解,什么叫做贝塞尔曲线呢?这里先做一下简单介绍:贝塞尔曲线也可以叫做贝济埃曲线或者贝兹曲线,它由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋.一般的矢量图形软件常 ... 
- android 利用Path.cubicTo 画 贝塞尔曲线
		Path.cubicTo void android.graphics.Path.cubicTo(float x1, float y1, float x2, float y2, float x3, fl ... 
随机推荐
- 第四节:DataFrame属性及方法(下)
- STM32串口通信配置(USART1+USART2+USART3+UART4)
			一.串口一的配置(初始化+中断配置+中断接收函数) 1 /*====================================================================== ... 
- KD树学习小结
			几个月后的UPD: 学习完下面之后,实战中的总结: 0.比赛中正解就是kdtree的题目很少很少 1.几类优先考虑kdtree的题目: k(维度) >= 3 的题目 二维平面上涉及区间标记的题目 ... 
- 清北学堂模拟赛d7t6 拯救世界
			分析:如果题目中没有环的话就是一道裸的最长路的题目,一旦有环每个城市就会被救多次火了.把有向有环图变成有向无环图只需要tarjan一边就可以了. #include <bits/stdc++.h& ... 
- BZOJ2730 矿场搭建 解题报告 点双联通分量
			题意概述: 一张有向图,在其中设置一些关键点(即题目中的逃生出口),使得删除任意一个点之后其余点都可以到达至少一个关键点. 问至少需要设置多少中关键点,有多少种设置方法. 解析: 首先,这道题要求删掉 ... 
- Spring中Bean的作用域差别
			我觉得servlet和spring交叉起来,理解得快. Bean的作用域中,prototype和singleton作用域效果不一样,前者每次都会有新的实例,而后者始终一个实例 . 所以,java.ut ... 
- 洛谷—— P2424 约数和
			https://www.luogu.org/problem/show?pid=2424 题目背景 Smart最近沉迷于对约数的研究中. 题目描述 对于一个数X,函数f(X)表示X所有约数的和.例如:f ... 
- C语言里全局变量管理
			C语言里信息封装比較弱,仅仅有静态变量的文件作用域. 假设不加约束.非常easy造成全局变量满天飞. 假设定义一个全局结构体.把全局变量都放到这个GlobleVariate里,应该好管一些,至少比裸奔 ... 
- 你不知道的JavaScript--Item33 跨域总结与解决的方法
			一.神马是跨域(Cross Domain) 说白点就是post.get的url不是你当前的站点,域名不同.比如在*aaa.com/a.html*里面,表单的提交action是bbb.com/b.htm ... 
- IntelliJ IDEA 问题总结之二(待补充) —— 快捷键、主题样式、导出jar、sqlite
			随着对idea的使用,问题越来越多,開始第二篇问题总结. 1.快捷键. 用惯了eclipse再用idea后,快捷键就是一个大问题. 并且网上idea的快捷键有非常多版本号.不知道是不是老版本号和新版本 ... 
