有兩種方法: 1你先新建一個記事本,把頭文件的代碼復(fù)制進去,然后保存為
10年積累的成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有濮陽免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
CCTerrain.h 然后復(fù)制到你的程序目錄下,或者VC的安裝目錄下就可以了。
2 把頭文件和工程放在同一個CPP文件里。
CustomPaint class提供了讓用戶自定義widget的能力,它暴露了一個canvas,可以通過這個canvas來繪制widget,CustomPaint會先調(diào)用painter繪制背景,然后再繪制child,最后調(diào)用foregroundPainter來繪制前景,CustomPaint的定義如下
CustomPaint的繪制過程都將會交給CustomPainter來完成,CustomPainter是個抽象接口,在子類化CustomPainter的時候必須要重寫它的 paint 跟 shouldRepaint 接口,可以根據(jù)自己的場景來選擇性的重寫 hitTest 跟 shouldRebuildSemantics 方法。
canvas--畫布,真正的繪制是由canvas跟paint來完成的,畫布提供了各種繪制的接口來繪制圖形,除此以外畫布還提供了平移、縮放、旋轉(zhuǎn)等矩陣變換接口,畫布都有固定大小跟形狀,還可以使用畫布提供的裁剪接口來裁剪畫布的大小形狀等等。
常用的繪制接口有 更多請查看官方文檔
Paint---筆畫,是用來設(shè)置在畫布上面繪制圖形時的一些筆畫屬性,如:顏色、線寬、繪制模式、抗鋸齒等等。常用屬性有 更多請查看官方文檔
color : 設(shè)置畫筆顏色
isAntiAlias : 設(shè)置畫筆是否扛鋸齒
shader : 著色器,填充形狀或者畫線時用到,如果沒設(shè)置將會使用color
strokeWidth : 設(shè)置畫筆畫線寬度
style :繪制模式,畫線或充滿
下面這個例子來自于官方,通過 CustomPaint 畫出了一個藍天跟太陽出來
效果如下:
對于初學(xué)flutter的朋友來說,要知道,flutter的UI萬物皆Widget。
flutter所寫的頁面的結(jié)構(gòu)可以被看成套娃,一層套一層,一層套一層,一層套一層。。。。。。
Flutter Widget采用現(xiàn)代響應(yīng)式框架構(gòu)建,這是從 React 中獲得的靈感,中心思想是用widget構(gòu)建你的UI。 Widget描述了他們的視圖在給定其當(dāng)前配置和狀態(tài)時應(yīng)該看起來像什么。當(dāng)widget的狀態(tài)發(fā)生變化時,widget會重新構(gòu)建UI,F(xiàn)lutter會對比前后變化的不同, 以確定底層渲染樹從一個狀態(tài)轉(zhuǎn)換到下一個狀態(tài)所需的最小更改。
Text : 該 widget 可讓創(chuàng)建一個帶格式的文本。
Row 、 Column : 這些具有彈性空間的布局類Widget可讓您在水平( Row )和垂直( Column )方向上創(chuàng)建靈活的布局。
Stack :取代線性布局 (和Android中的LinearLayout相似),Stack允許子 widget 堆疊, 你可以使用 Positioned 來定位他們相對于 Stack 的上下左右四條邊的位置。
Container : Container 可讓您創(chuàng)建矩形視覺元素。 您可以為 Container 裝飾一個 BoxDecoration , 如 background、一個邊框、或者一個陰影。 Container 也可以具有邊距(margins)、填充(padding)和應(yīng)用于其大小的約束(constraints)。另外, Container 可以使用矩陣在三維空間中對其進行變換。
具體的演示見我另外的博客
有一部分Widget都有一個 child 屬性,用于容納唯一的子Widget。
例如:Container、Center、Padding、Align等Widget。
還有一部分Widget允許存在多個子Widget,用 children 作為屬性。
例如:Row、Column、Stack等Widget。
在StatefulWidget調(diào)用createState之后,框架將新的狀態(tài)插入樹種,然后調(diào)用狀態(tài)對象的initState。子類化State可以重寫initState,以完成僅需要一次執(zhí)行的工作。當(dāng)然在initState的實現(xiàn)中需要調(diào)用super.initState
當(dāng)一個狀態(tài)對象不再需要時,框架調(diào)用狀態(tài)對象的dispose。也可以通過覆蓋dispose方法來執(zhí)行清理工作。
OVER~
窗口小部件(Widget)可以在Paint之前應(yīng)用Transform進行轉(zhuǎn)換,通過Transform可以對widget進行平移、旋轉(zhuǎn)、縮放等矩陣變換。不像RotatedBox在layout前就對Widget進行旋轉(zhuǎn)操作,Transform是在Widget繪制前進行轉(zhuǎn)換,這意味著在計算Widget的顯示需要占用多少空間時,不會去考慮Transform變換。
例子
在垂直方向移動15個單位距離
例子
順時針旋轉(zhuǎn)45°
例子
放大1.5倍
之前講到了 flutter的Texture
SurfaceTexture 是 Surface 和 OpenGL ES (GLES) 紋理的組合。SurfaceTexture 用于提供輸出到 GLES 紋理的 Surface
SurfaceTexture 包含一個 BufferQueue。當(dāng)生產(chǎn)方將新的緩沖區(qū)排入隊列時,onFrameAvailable() 回調(diào)會通知應(yīng)用。然后,應(yīng)用調(diào)用 updateTexImage(),這會釋放先前占有的緩沖區(qū),從隊列中獲取新緩沖區(qū)并執(zhí)行 EGL 調(diào)用,從而使 GLES 可將此緩沖區(qū)作為外部紋理使用。
關(guān)鍵方法:
SurfaceTexture(int texName, boolean singleBufferMode)構(gòu)造方法
setOnFrameAvailableListener 設(shè)置回調(diào),當(dāng)生產(chǎn)者準(zhǔn)備好新的幀后會調(diào)用Listener
updateTexImage 更新texture到指定的GLESContext
detachFromGLContext
attachToGLContext
解綁/綁定 當(dāng)前GLContext
getTransformMatrix 設(shè)置重采樣紋理矩陣,當(dāng)渲染的時候會用到這個數(shù)據(jù)
release() 完全釋放 SufaceTexture的 buffers并且吧Surface狀態(tài)置為abandoned
android-8.0.0_r1 源碼解析:
GLConsumer參數(shù)解釋:
bq是BufferQueue創(chuàng)建BufferConsumer
tex 表示要將圖像流傳輸?shù)降腛penGL ES紋理名稱。
texTarget指定了哪個紋理將被綁定
useFenceSync表示是否需要同步訪問緩沖區(qū)
可以從一個OpenGL ES上下文中分離GLConsumer,然后分別使用detachFromContext和attachToContext方法將GLConsumer附加到另一個上下文。
如果設(shè)置tex參數(shù)則會通過attachToContext將GLConsumer附加到OpenGL ES context中。
第一次調(diào)用updateTexImage才會綁定,之后所有對updateTexImage的調(diào)用必須使用相同的當(dāng)前OpenGL ES context進行
acquireBufferLocked創(chuàng)建EglImage并設(shè)置到EglSlots中
updateAndReleaseLocked 更新 EglImage
createIfNeeded 如果EGLDisplay改變或者crop改變則會創(chuàng)建EglImage
bindToTextureTarget 將調(diào)用glEGLImageTargetTexture2DOES去綁定image到指定的目標(biāo)紋理
這里創(chuàng)建EGLImageKHR,EGLImageKHR用于共享EGL資源
EGL的ShareContext是常見的共享上下文的方式(iOS平臺的EAGL叫ShareGroup)。
當(dāng)share_context參數(shù)傳入另一個EGL的context時,這兩個EGLContext就可以共享紋理以及VBO等。
需要注意的是container objects不能被共享,比如:
Framebuffer objects
Vertex array objects
Transform feedback objects
Program pipeline objects
參考:
EGLImageKHR:
設(shè)置如下:
輸入OD成本矩陣所需要的輸入元素是至少1個起始點與至少1個目的點。
當(dāng)起始點和目的點都是1個時,就成了最短路徑分析了,只不過看不到代表最短路徑的那條折線了。
通常,我們可以通過批量導(dǎo)入起始點和目的地點,而不用手工去打。
分析設(shè)置
和最短路徑分析類似,在輸出Shape中只有“無”、“直線”兩個選項。
多了兩個新的設(shè)置參數(shù):中斷值和要查找的目的地。
中斷值:當(dāng)超過給定的中斷值(搜索半徑),就認(rèn)為目的點不能到達,就不作為結(jié)果。例如,超過1000km的距離的城市,就不算了,比如北京和廣州。
要查找的目的地:這個數(shù)值要小于等于目的點的個數(shù),默認(rèn)和目的點個數(shù)相等。如果給了一個值n,那么就會取該起始點的前n個最近目的點。