谁说程序员不会浪漫,浪漫是跟人有关的,程序员也是可以很浪漫的,今天就用Android 的SurfaceView 实现画心功能。
SurfaceView的用法有基础的应该知道,这里不多做介绍,大体流程:继承SurfaceView并实现SurfaceHolder.Callback接口 ----> SurfaceView.getHolder()获得SurfaceHolder对象 ---->SurfaceHolder.addCallback(callback)添加回调函数---->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布----> Canvas绘画 ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。
根据心形公式:(参考http://blog.csdn.net/decting/article/details/8580634)
公式中t的取值是0~360,这样的话开始画的位置是从下图2的位置开始,这里我让t的取值+180,目的是让开始画的位置从下面左边开始,如图从1处开始
公式中t的取值是0~360,但是编程中的三角函数都是用的弧度,所以要把t转成弧度
t = i * 2 * Math.PI / 360d;
核心代码如下:
Paint paint = new Paint();// 创建画笔
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(8);
paint.setColor(Color.GREEN);
Canvas canvas = null;
Path path = new Path();
for (int i = 0 + 180; i < 361 + 180; i++) {
try {
Thread.sleep(10);// 睡眠时间为10毫秒
synchronized (mHolder) {
canvas = mHolder.lockCanvas();// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
double st = i * 2 * Math.PI / 360d;
double x = 10 * 16 * Math.pow(Math.sin(sit), 3);
double y = 10 * (13 * Math.cos(sit) - 5 * Math.cos(2 * sit) - 2 * Math.cos(3 * sit) - Math.cos(4 * sit));
if (i == 180) {
path.moveTo(mWidth / 2 + (float) (x), mHeight / 2 - (float) (y));
}
path.lineTo(mWidth / 2 + (float) (x), mHeight / 2 - (float) (y));
if (canvas != null)
canvas.drawPath(path, paint);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
if (canvas != null) {
mHolder.unlockCanvasAndPost(canvas);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
效果图:
源码:http://download.csdn.net/detail/bigboysunshine/9722879