java浪漫之心代码_浪漫桃心的Android表白程序

几年前,看到过有个牛人用HTML5绘制了浪漫的爱心表白动画。地址在这:浪漫程序员 HTML5爱心表白动画。发现原来程序员也是可以很浪……漫…..的。那么在Android怎么打造如此这个效果呢?参考了一下前面HTML5的算法,在Android中实现了类似的效果。先贴上最终效果图:

e3a06ed86e47edefd0e115662a8be3e5.gif

生成心形线

心形线的表达式可以参考:桃心线。里面对桃心线的表达式解析的挺好。可以通过使用极坐标的方式,传入角度和距离(常量)计算出对应的坐标点。其中距离是常量值,不需改变,变化的是角度。

桃心线极坐标方程式为:

x=16×sin3α

y=13×cosα?5×cos2α?2×cos3α?cos4α

如果生成的桃心线不够大,可以吧x、y乘以一个常数,使之变大。考虑到大部分人都不愿去研究具体的数学问题,我们直接把前面HTML5的JS代码直接翻译成Java代码就好。代码如下:

public Point getHeartPoint(floatangle) {float t = (float) (angle /Math.PI);float x = (float) (19.5 * (16 * Math.pow(Math.sin(t), 3)));float y = (float) (-20 * (13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 *t)));return new Point(offsetX + (int) x, offsetY + (int) y);

}

其中offsetX和offsetY是偏移量。使用偏移量主要是为了能让心形线处于中央。offsetX和offsetY的值分别为:

offsetX = width / 2;

offsetY = height / 2 - 55;

通过这个函数,我们可以将角度从(0,180)变化,不断取点并画点将这个心形线显示出来。好了,我们自定义一个View,然后把这个心形线画出来吧!

@Overrideprotected voidonDraw(Canvas canvas) {float angle = 10;while (angle < 180) {

Point p=getHeartPoint(angle);

canvas.drawPoint(p.x, p.y, paint);

angle= angle + 0.02f;

}

}

运行结果如下:

aebbd660969d9b6b7bd1c2a7cfc6662e.png

绘制花瓣原理

我们想要的并不是简单绘制一个桃心线,要的是将花朵在桃心线上摆放。首先,得要知道怎么绘制花朵,而花朵是由一个个花瓣组成。因此绘制花朵的核心是绘制花瓣。绘制花瓣的原理是:3次贝塞尔曲线。三次贝塞尔曲线是由两个端点和两个控制点决定。假设花芯是一个圆,有n个花瓣,那么两个端点与花芯的圆心连线之间的夹角即为360/n。因此可以根据花瓣数量和花芯半径确定每个花瓣的位置。将两个端点与花芯的圆心连线的延长线分别确定另外两个控制点。通过随机生成花芯半径、每个花瓣的起始角以及随机确定延长线得到两个控制点,可以绘制一个随机的花朵。参数的改变如下图所示:

fad81bea40210909f472659db00334d9.gif

将花朵绘制到桃心线上

一大波代码来袭

首先定义花瓣类Petal:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagecom.hc.testheart;2

3 importandroid.graphics.Canvas;4 importandroid.graphics.Paint;5 importandroid.graphics.Path;6

7 /**

8 * Package com.example.administrator.testrecyclerview9 * Created by HuaChao on 2016/5/25.10 */

11 public classPetal {12 private float stretchA;//第一个控制点延长线倍数

13 private float stretchB;//第二个控制点延长线倍数

14 private float startAngle;//起始旋转角,用于确定第一个端点

15 private float angle;//两条线之间夹角,由起始旋转角和夹角可以确定第二个端点

16 private int radius = 2;//花芯的半径

17 private float growFactor;//增长因子,花瓣是有开放的动画效果,这个参数决定花瓣展开速度

18 private int color;//花瓣颜色

19 private boolean isFinished = false;//花瓣是否绽放完成

20 private Path path = new Path();//用于保存三次贝塞尔曲线

21 private Paint paint = new Paint();//画笔22 //

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值