讓我們一起來擼個android版本的畢達(dá)哥拉斯樹吧
先上個效果圖
我們這里是利用繼承View來實(shí)現(xiàn)自定義View的
繼承View主要是要重寫兩個函數(shù) onDraw()和onMeasure()
onDraw() :我們想要的顯現(xiàn)的內(nèi)容一般都是要在這個函數(shù)里面寫的
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()函數(shù)了.
在看create函數(shù)之前叛氨,我們先看看下面這張圖
![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)
這張圖其實(shí)是整個畢達(dá)哥斯拉樹的縮影。我們可以看出來所有這顆樹的其他結(jié)構(gòu)都是這個是一樣的盹靴,只是大小和位置上的不同第练。 我們在仔細(xì)觀察這個圖,可以發(fā)現(xiàn)這三個正方形之間所成的三角形是直角三角形-/(ㄒoㄒ)/~~這也是為什么叫做畢達(dá)哥斯拉樹的原因每强。
既然知道是直角三角形始腾,那么我們就可以利用大正方形的邊長州刽,角度和sin函數(shù)計(jì)算出另外兩個正方形的邊長。(我這個圖的角度是60度)浪箭。
OK穗椅,說了那么多,我們現(xiàn)在就來正式看看我的create()函數(shù)
create():
private void create(Canvas canvas,int deep,float length){
if(deep==0){//遞歸結(jié)束
return ;
}
float angle1= (float) (Math.PI*(angle/180));
canvas.rotate(-angle);//旋轉(zhuǎn)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();//保存下畫布的狀態(tài)
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)));
}