Android SurfaceView实现画心

谁说程序员不会浪漫,浪漫是跟人有关的,程序员也是可以很浪漫的,今天就用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







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值