資料介紹
軟件簡介
實現Android端的簡易思維導圖。可以保存數據。編輯樹形圖。
建立模型
主要模型結構相對簡單:TreeModel,NoteModel,NoteView,TreeView。
核心實現分布如下:
-
TreeModel:樹形結構的存儲,樹形結構的遍歷,添加、刪除節點;
-
NoteModel:節點關聯的指向,和Parent的指向;
-
TreeView :繪制樹形結構,對樹形結構位置的糾正,實現View層的添加,刪除,note關聯繪制;
-
NoteView:顯示text;
?
編寫位置計算核心代碼
在核心代碼中,我想和大家分享的是TreeView如何對多種Style(樹形形狀)進行適配的問題。因為我們的樹形結構的表達多種的,有的是一個半樹形圖,有點是圓形展開的等。對于這個問題,作為程序員如何進行解耦能,采用Interface進行解構適配,統一行為。所以在這里我寫了一個TreeLayoutManager進行管理樹形的位置表達。這里我實現了一個RightTreeLayoutManager。代碼概況如下:
public?interface?TreeLayoutManager?{ ????/** ?????*?進行樹形結構的位置計算 ?????*/ ????void?onTreeLayout(TreeView?treeView); ????/** ?????*?位置分布好后的回調,用于確認ViewGroup的大小 ?????*/ ????ViewBox?onTreeLayoutCallBack(); ????/** ?????*?修正位置 ?????* ?????*?@param?treeView ?????*?@param?next ?????*/ ????void?correctLayout(TreeView?treeView,?NodeView?next); }
?
實現
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)?{ ??????????????//主要是糾正對于標準布局出現的錯誤,譬如,在圖片糾正中的那種情況 ?????????????//糾正需要對同層的Note進行拉伸 ????} ????/** ?????*?標準分布 ?????* ?????*?@param?treeView ?????*?@param?rootView ?????*/ ????private?void?standardLayout(TreeView?treeView,?NodeView?rootView)?{ ????????????????//標準分布主要是在基于root節點進行排開 ????????????????//對于奇數和偶數不同的情況進行排開 ????????????????//中間向外計算位置 ????} ????/** ?????*?移動 ?????* ?????*?@param?rootView ?????*?@param?dy ?????*/ ????private?void?moveNodeLayout(TreeView?superTreeView,?NodeView?rootView,?int?dy)?{ ????????????????//如果一個note節點進行了移動,那么它 ????????????????//會影響到它的子節點的位置。 ????????????????//所以要進行重新計算,把它的所有的Note位置進行位移???????? ????} ????/** ?????*?root節點的定位 ?????* ?????*?@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的連線
要實現對View和View的連線,只要在View的位置定了之后,就進行畫線即可。用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); ????}
?
位置的糾正流程
位置糾正的問題;在對于我之前的位置的算法探索流程如下圖,關鍵是寫好已知的代碼,之后糾正。
?
- 全塑簡易TF卡座TF-017原理圖 11次下載
- labview的按鈕控件匯總 384次下載
- AT89S52單片機思維導圖
- Android示波器電路原理圖.pdf 36次下載
- arm嵌入式linux系統開發從入門到精通高清思維導圖
- 嵌入式思維導圖
- 簡易的電路圖繪圖軟件下載 82次下載
- 挑戰用200張思維導圖記完初中英語單詞資源 60次下載
- 基于1602加矩陣鍵盤的簡易計算機原理圖及源碼 4次下載
- 一張思維導圖介紹PCB散熱,你需要了解的都在這里資料下載
- 五張思維導看懂VoLTE兩高兩低處理思路資料下載
- 零基礎學python的思維導圖免費下載 6次下載
- 2020最新的Python思維導圖合集免費下載 16次下載
- MindMaster多平臺思維導圖軟件免費下載 6次下載
- Android控件使用 4次下載
- 圖片動畫控件和Video image控件的使用方法 1023次閱讀
- 關于數據通信的思維導圖 1552次閱讀
- 如何使用ZCadToMoreV2.0導圖軟件導出G代碼 3274次閱讀
- 幾種軟件架構設計的思維方式 4952次閱讀
- 整理思維!史上最全Linux/C/C++思維導圖! 4371次閱讀
- 單片機的引腳圖及引腳功能_單片機簡易編程 5.2w次閱讀
- LabWindows/CVI虛擬儀器 Tab 控件 7355次閱讀
- 基于NFC的移動導醫系統設計 1351次閱讀
- 簡易應急燈電路結構電路圖 6780次閱讀
- 簡易廉價的定時器電路圖 3880次閱讀
- 簡易的節能指示燈電路圖 5225次閱讀
- 家庭簡易夜間照明電路圖 1w次閱讀
- 簡易延時電路圖 8938次閱讀
- 簡易定時器電路圖 8147次閱讀
- 簡易差動式溫度傳感器電路圖 3216次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多