自定义View-毕达哥拉斯树

让我们一起来撸个android版本的毕达哥拉斯树吧

先上个效果图

自定义View-毕达哥拉斯树_第1张图片
bida.png

我们这里是利用继承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)));
}
~~~~~ ZZZZ,看完之后有没有感觉到so easy呢。这个函数呢其实也就是在旋转画布和不停的递归辣/(ㄒoㄒ)/。deep是递归的深度-也就是树繁茂的程度。我们其实可以利用这个deep属性来实现一种动画的效果,实现一种树在生长的过程。/(ㄒoㄒ)/~~

你可能感兴趣的:(自定义View-毕达哥拉斯树)