让我们一起来撸个android版本的毕达哥拉斯树吧
先上个效果图
我们这里是利用继承View来实现自定义View的
继承View主要是要重写两个函数 onDraw()和onMeasure()
onDraw() :我们想要的显现的内容一般都是要在这个函数里面写的
onMeasure():测量View的大小。
先看我onDraw()的代码
super.onDraw(canvas);
float cx=getMeasuredWidth()/2;
float cy=getMeasuredHeight()/2;
cx=Math.min(cx,cy);
int restore=canvas.save();
canvas.translate(cx , cy );
canvas.drawRect(0, 0, cx / 3f, cx / 3f, paint);
create(canvas, deep, cx / 3f);
canvas.restoreToCount(restore);
我们可以看到我的onDraw()代码里面是先画了一个最底层的正方形。然后就是create()函数了.
在看create函数之前,我们先看看下面这张图
![T@SAGRY}Q$$LY$}B2KCX]1I.png](http://upload-images.jianshu.io/upload_images/1250148-5a8cd1266470e507.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这张图其实是整个毕达哥斯拉树的缩影。我们可以看出来所有这颗树的其他结构都是这个是一样的,只是大小和位置上的不同。 我们在仔细观察这个图,可以发现这三个正方形之间所成的三角形是直角三角形-/(ㄒoㄒ)/~~这也是为什么叫做毕达哥斯拉树的原因。
既然知道是直角三角形,那么我们就可以利用大正方形的边长,角度和sin函数计算出另外两个正方形的边长。(我这个图的角度是60度)。
OK,说了那么多,我们现在就来正式看看我的create()函数
create():
private void create(Canvas canvas,int deep,float length){
if(deep==0){//递归结束
return ;
}
float angle1= (float) (Math.PI*(angle/180));
canvas.rotate(-angle);//旋转angle角度
Log.d("cos60","cos 60"+(float)60f*(float)Math.sin(angle1));
Log.d("create","Length "+length+" cos "+(float) (length * Math.cos(angle1))+" angle "+angle1);
canvas.translate(0, -(float) (length * Math.cos(angle1)));//平移左上正方形的边长么
canvas.save();//保存下画布的状态
int clolor=getColor(deep);
paint.setColor(clolor);
canvas.drawRect(0, 0, (float) (length * Math.cos(angle1)), (float) (length * Math.cos(angle1)), paint);
create(canvas, deep - 1, (float) (length * Math.cos(angle1)));
canvas.restore();
canvas.translate((float) (length * Math.cos(angle1)), 0);
canvas.translate(0, (float) (length * Math.cos(angle1)));
clolor=getColor(deep);
paint.setColor(clolor);
canvas.drawRect(0, 0, (float) (length*Math.sin(angle1)), (float) (length*Math.sin(angle1)), paint);
canvas.translate( (float) (length*Math.sin(angle1)), 0);
canvas.rotate(90f);
create(canvas, deep - 1, (float) (length*Math.sin(angle1)));
}