先上一张效果图吧:
说说这个东西的来源吧,今天突然想到笛卡尔心形图,想去看看能不能画个心出来。可是看到一篇不错的文章。那篇文章罗列了非常多关于心形的函数方程,这可把我高兴坏了。于是我选取了一个比較好看的“桃心”做了今天的效果。
以下贴代码:
import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Path; import android.util.AttributeSet; import android.view.View; public class LoveView extends View { private Paint paint; private float rate = 5; // 半径变化率 private AnimThread at; // 改变rate的线程 private Path path; // 路径 public LoveView(Context context) { super(context); init(); } public LoveView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { at = new AnimThread(); // 初始化画笔 paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.RED); paint.setStyle(Style.FILL); paint.setStrokeWidth(2); // 创建一个路径 path = new Path(); at.start(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 重置画板 path.reset(); // 得到屏幕的长宽的一半 int px = getMeasuredWidth() / 2; int py = getMeasuredHeight() / 2; // 路径的起始点 path.moveTo(px, py - 5 * rate); // 依据心形函数绘图 for (double i = 0; i <= 2 * Math.PI; i += 0.001) { float x = (float) (16 * Math.sin(i) * Math.sin(i) * Math.sin(i)); float y = (float) (13 * Math.cos(i) - 5 * Math.cos(2 * i) - 2 * Math.cos(3 * i) - Math.cos(4 * i)); x *= rate; y *= rate; x = px - x; y = py - y; path.lineTo(x, y); } canvas.drawPath(path, paint); } private class AnimThread extends Thread { public void run() { while (true) { rate += 0.05; if (rate > 20) { // 我的手机大于20后就非常大了,为了不超过屏幕 rate = 5; } try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } // 刷新画布 postInvalidate(); } } }; }
凝视非常清楚了,有些參数rate是依照我手机的实际情况来的,所以我给的值是固定的。
还有假设不过依照那篇文章中的函数来的,画出来的心形是反的,所以里面有代码变化过了。这样出来的图就是正的。
事实上有时候认为这东西没什么技术含量(本来不好意思发的),哈哈,只是认为好玩。还是忍不住发出来了。