資料介紹
軟件簡介
實(shí)現(xiàn)Android端的簡易思維導(dǎo)圖。可以保存數(shù)據(jù)。編輯樹形圖。
建立模型
主要模型結(jié)構(gòu)相對簡單:TreeModel,NoteModel,NoteView,TreeView。
核心實(shí)現(xiàn)分布如下:
-
TreeModel:樹形結(jié)構(gòu)的存儲,樹形結(jié)構(gòu)的遍歷,添加、刪除節(jié)點(diǎn);
-
NoteModel:節(jié)點(diǎn)關(guān)聯(lián)的指向,和Parent的指向;
-
TreeView :繪制樹形結(jié)構(gòu),對樹形結(jié)構(gòu)位置的糾正,實(shí)現(xiàn)View層的添加,刪除,note關(guān)聯(lián)繪制;
-
NoteView:顯示text;
?
編寫位置計(jì)算核心代碼
在核心代碼中,我想和大家分享的是TreeView如何對多種Style(樹形形狀)進(jìn)行適配的問題。因?yàn)槲覀兊臉湫谓Y(jié)構(gòu)的表達(dá)多種的,有的是一個半樹形圖,有點(diǎn)是圓形展開的等。對于這個問題,作為程序員如何進(jìn)行解耦能,采用Interface進(jìn)行解構(gòu)適配,統(tǒng)一行為。所以在這里我寫了一個TreeLayoutManager進(jìn)行管理樹形的位置表達(dá)。這里我實(shí)現(xiàn)了一個RightTreeLayoutManager。代碼概況如下:
public?interface?TreeLayoutManager?{ ????/** ?????*?進(jìn)行樹形結(jié)構(gòu)的位置計(jì)算 ?????*/ ????void?onTreeLayout(TreeView?treeView); ????/** ?????*?位置分布好后的回調(diào),用于確認(rèn)ViewGroup的大小 ?????*/ ????ViewBox?onTreeLayoutCallBack(); ????/** ?????*?修正位置 ?????* ?????*?@param?treeView ?????*?@param?next ?????*/ ????void?correctLayout(TreeView?treeView,?NodeView?next); }
?
實(shí)現(xiàn)
public?class?RightTreeLayoutManager?implements?TreeLayoutManager{ ????final?int?msg_standard_layout?=?1; ????final?int?msg_correct_layout?=?2; ????final?int?msg_box_call_back?=?3; ????private?ViewBox?mViewBox; ????private?int?mDy; ????private?int?mDx; ????private?int?mHeight; ????public?RightTreeLayoutManager(int?dx,?int?dy,?int?height)?{ ????????mViewBox?=?new?ViewBox(); ????????this.mDx?=?dx; ????????this.mDy?=?dy; ????????this.mHeight?=?height; ????} ????@Override ????public?void?onTreeLayout(final?TreeView?treeView)?{ ????????final?TreeModel?mTreeModel?=?treeView.getTreeModel(); ????????if?(mTreeModel?!=?null)?{ ????????????View?rootView?=?treeView.findNodeViewFromNodeModel(mTreeModel.getRootNode()); ????????????if?(rootView?!=?null)?{ ????????????????rootTreeViewLayout((NodeView)?rootView); ????????????} ????????????mTreeModel.addForTreeItem(new?ForTreeItem >()?{ ????????????????@Override ????????????????public?void?next(int?msg,?NodeModel ?next)?{ ????????????????????doNext(msg,?next,?treeView); ????????????????} ????????????}); ????????????//基本布局 ????????????mTreeModel.ergodicTreeInWith(msg_standard_layout); ????????????//糾正 ????????????mTreeModel.ergodicTreeInWith(msg_correct_layout); ????????????mViewBox.clear(); ????????????mTreeModel.ergodicTreeInDeep(msg_box_call_back); ????????} ????} ????@Override ????public?ViewBox?onTreeLayoutCallBack()?{ ????????if?(mViewBox?!=?null)?{ ????????????return?mViewBox; ????????}?else?{ ????????????return?null; ????????} ????} ????/** ?????*?布局糾正 ?????* ?????*?@param?treeView ?????*?@param?next ?????*/ ????public?void?correctLayout(TreeView?treeView,?NodeView?next)?{ ??????????????//主要是糾正對于標(biāo)準(zhǔn)布局出現(xiàn)的錯誤,譬如,在圖片糾正中的那種情況 ?????????????//糾正需要對同層的Note進(jìn)行拉伸 ????} ????/** ?????*?標(biāo)準(zhǔn)分布 ?????* ?????*?@param?treeView ?????*?@param?rootView ?????*/ ????private?void?standardLayout(TreeView?treeView,?NodeView?rootView)?{ ????????????????//標(biāo)準(zhǔn)分布主要是在基于root節(jié)點(diǎn)進(jìn)行排開 ????????????????//對于奇數(shù)和偶數(shù)不同的情況進(jìn)行排開 ????????????????//中間向外計(jì)算位置 ????} ????/** ?????*?移動 ?????* ?????*?@param?rootView ?????*?@param?dy ?????*/ ????private?void?moveNodeLayout(TreeView?superTreeView,?NodeView?rootView,?int?dy)?{ ????????????????//如果一個note節(jié)點(diǎn)進(jìn)行了移動,那么它 ????????????????//會影響到它的子節(jié)點(diǎn)的位置。 ????????????????//所以要進(jìn)行重新計(jì)算,把它的所有的Note位置進(jìn)行位移???????? ????} ????/** ?????*?root節(jié)點(diǎn)的定位 ?????* ?????*?@param?rootView ?????*/ ????private?void?rootTreeViewLayout(NodeView?rootView)?{ ????????int?lr?=?mDy; ????????int?tr?=?mHeight?/?2?-?rootView.getMeasuredHeight()?/?2; ????????int?rr?=?lr?+?rootView.getMeasuredWidth(); ????????int?br?=?tr?+?rootView.getMeasuredHeight(); ????????rootView.layout(lr,?tr,?rr,?br); ????} }
?
View的連線
要實(shí)現(xiàn)對View和View的連線,只要在View的位置定了之后,就進(jìn)行畫線即可。用Sketch畫個演示如下:
其中線為一個貝塞爾曲線。代碼如下:
????@Override ????protected?void?dispatchDraw(Canvas?canvas)?{ ????????if?(mTreeModel?!=?null)?{ ????????????drawTreeLine(canvas,?mTreeModel.getRootNode()); ????????} ????????super.dispatchDraw(canvas); ????} ????/** ?????*?繪制樹形的連線 ?????* ?????*?@param?canvas ?????*?@param?root ?????*/ ????private?void?drawTreeLine(Canvas?canvas,?NodeModel?root)?{ ????????NodeView?fatherView?=?(NodeView)?findNodeViewFromNodeModel(root); ????????if?(fatherView?!=?null)?{ ????????????LinkedList >?childNodes?=?root.getChildNodes(); ????????????for?(NodeModel ?node?:?childNodes)?{ ????????????????//連線 ????????????????drawLineToView(canvas,?fatherView,?findNodeViewFromNodeModel(node)); ????????????????//遞歸 ????????????????drawTreeLine(canvas,?node); ????????????} ????????} ????} ????/** ?????*?繪制兩個View直接的連線 ?????* ?????*?@param?canvas ?????*?@param?from ?????*?@param?to ?????*/ ????private?void?drawLineToView(Canvas?canvas,?View?from,?View?to)?{ ????????if?(to.getVisibility()?==?GONE)?{ ????????????return; ????????} ????????Paint?paint?=?new?Paint(); ????????paint.setAntiAlias(true); ????????paint.setStyle(Paint.Style.STROKE); ????????float?width?=?2f; ????????paint.setStrokeWidth(dp2px(mContext,?width)); ????????paint.setColor(mContext.getResources().getColor(R.color.chelsea_cucumber)); ????????int?top?=?from.getTop(); ????????int?formY?=?top?+?from.getMeasuredHeight()?/?2; ????????int?formX?=?from.getRight(); ????????int?top1?=?to.getTop(); ????????int?toY?=?top1?+?to.getMeasuredHeight()?/?2; ????????int?toX?=?to.getLeft(); ????????Path?path?=?new?Path(); ????????path.moveTo(formX,?formY); ????????path.quadTo(toX?-?dp2px(mContext,?15),?toY,?toX,?toY); ????????canvas.drawPath(path,?paint); ????}
?
位置的糾正流程
位置糾正的問題;在對于我之前的位置的算法探索流程如下圖,關(guān)鍵是寫好已知的代碼,之后糾正。
?
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
- 全塑簡易TF卡座TF-017原理圖 11次下載
- labview的按鈕控件匯總 384次下載
- AT89S52單片機(jī)思維導(dǎo)圖
- Android示波器電路原理圖.pdf 36次下載
- arm嵌入式linux系統(tǒng)開發(fā)從入門到精通高清思維導(dǎo)圖
- 嵌入式思維導(dǎo)圖
- 簡易的電路圖繪圖軟件下載 82次下載
- 挑戰(zhàn)用200張思維導(dǎo)圖記完初中英語單詞資源 60次下載
- 基于1602加矩陣鍵盤的簡易計(jì)算機(jī)原理圖及源碼 4次下載
- 一張思維導(dǎo)圖介紹PCB散熱,你需要了解的都在這里資料下載
- 五張思維導(dǎo)看懂VoLTE兩高兩低處理思路資料下載
- 零基礎(chǔ)學(xué)python的思維導(dǎo)圖免費(fèi)下載 6次下載
- 2020最新的Python思維導(dǎo)圖合集免費(fèi)下載 16次下載
- MindMaster多平臺思維導(dǎo)圖軟件免費(fèi)下載 6次下載
- Android控件使用 4次下載
- 圖片動畫控件和Video image控件的使用方法 1023次閱讀
- 關(guān)于數(shù)據(jù)通信的思維導(dǎo)圖 1552次閱讀
- 如何使用ZCadToMoreV2.0導(dǎo)圖軟件導(dǎo)出G代碼 3274次閱讀
- 幾種軟件架構(gòu)設(shè)計(jì)的思維方式 4952次閱讀
- 整理思維!史上最全Linux/C/C++思維導(dǎo)圖! 4371次閱讀
- 單片機(jī)的引腳圖及引腳功能_單片機(jī)簡易編程 5.2w次閱讀
- LabWindows/CVI虛擬儀器 Tab 控件 7355次閱讀
- 基于NFC的移動導(dǎo)醫(yī)系統(tǒng)設(shè)計(jì) 1351次閱讀
- 簡易應(yīng)急燈電路結(jié)構(gòu)電路圖 6780次閱讀
- 簡易廉價(jià)的定時(shí)器電路圖 3880次閱讀
- 簡易的節(jié)能指示燈電路圖 5225次閱讀
- 家庭簡易夜間照明電路圖 1w次閱讀
- 簡易延時(shí)電路圖 8938次閱讀
- 簡易定時(shí)器電路圖 8147次閱讀
- 簡易差動式溫度傳感器電路圖 3216次閱讀
下載排行
本周
- 1晶體三極管的電流放大作用詳細(xì)說明
- 0.77 MB | 29次下載 | 2 積分
- 2雙極型三極管放大電路的三種基本組態(tài)的學(xué)習(xí)課件免費(fèi)下載
- 4.03 MB | 23次下載 | 1 積分
- 3多級放大電路的學(xué)習(xí)課件免費(fèi)下載
- 1.81 MB | 20次下載 | 2 積分
- 4PC4401_DC-DC 42V反激式隔離開關(guān)電路
- 0.85 MB | 4次下載 | 免費(fèi)
- 5AIWA HS-J505MKⅡ維修手冊
- 22.63 MB | 2次下載 | 10 積分
- 6GPRS智能超聲波液位監(jiān)測終端
- 835.55 KB | 2次下載 | 免費(fèi)
- 7電磁兼容性原理與設(shè)計(jì)
- 6.18 MB | 1次下載 | 3 積分
- 8AIWA HS-JX3000/HS-JX3000D維修手冊
- 14.78 MB | 次下載 | 10 積分
本月
- 1晶體三極管的電流放大作用詳細(xì)說明
- 0.77 MB | 29次下載 | 2 積分
- 2雙極型三極管放大電路的三種基本組態(tài)的學(xué)習(xí)課件免費(fèi)下載
- 4.03 MB | 23次下載 | 1 積分
- 3第十一屆 藍(lán)橋杯 單片機(jī)設(shè)計(jì)與開發(fā)項(xiàng)目 省賽 程序設(shè)計(jì)試題及源碼
- 90.88KB | 23次下載 | 3 積分
- 4Python從入門到精通背記手冊
- 18.77 MB | 21次下載 | 1 積分
- 5多級放大電路的學(xué)習(xí)課件免費(fèi)下載
- 1.81 MB | 20次下載 | 2 積分
- 6STM32F103C8T6開發(fā)板最小系統(tǒng)原理圖
- 0.78 MB | 17次下載 | 免費(fèi)
- 7SX1308應(yīng)用電路圖與SX1308升壓電路圖
- 0.18 MB | 8次下載 | 1 積分
- 8東芝彩色電視機(jī)29SF6C維修說明書
- 4.86 MB | 8次下載 | 1 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935127次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420063次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191382次下載 | 10 積分
- 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183337次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81584次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73814次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評論