在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>電子資料>ThinkMap Android簡易思維導圖控件

ThinkMap Android簡易思維導圖控件

2022-05-20 | zip | 0.59 MB | 次下載 | 2積分

資料介紹

授權協議 GPL
開發語言 Kotlin Java
軟件類型 開源軟件
所屬分類 手機/移動開發、 Android UI 組件

軟件簡介

實現Android端的簡易思維導圖。可以保存數據。編輯樹形圖。

poYBAGJ2P_mATIRPAAKrZeFgCtQ448.png

建立模型

主要模型結構相對簡單: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畫個演示如下:

pYYBAGJ2P_2AIMyBAAAtGqmqqQ8437.png

其中線為一個貝塞爾曲線。代碼如下:

????@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);
????}

?

位置的糾正流程

位置糾正的問題;在對于我之前的位置的算法探索流程如下圖,關鍵是寫好已知的代碼,之后糾正。

poYBAGJ2P_-AchqiAAHJTEkaJXg611.png

poYBAGJ2QAKAYAHnAACsa_zuYyI888.png

?

pYYBAGJ2QBqAMdldAADn2M6Fx_0549.png

?

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數據手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 999av视频 | 国产热| 狠狠丁香激情久久综合 | 午夜亚洲视频 | 四虎美女| 五月婷婷爱 | 理论片免费午夜 | 免费网站日本永久免费观看 | 777国产精品永久免费观看 | 伊人天伊人天天网综合视频 | 国产精品乱码高清在线观看 | xxxx人妖| 年轻人影院www你懂的 | 加勒比在线免费视频 | 色香五月 | 日韩精品一级毛片 | 精品国产亚洲人成在线 | 免费看黄色的网站 | 一级特黄性色生活片一区二区 | 91大神网址 | 亚洲欧美视频网站 | 免费观看黄色在线视频 | 一区二区三 | 丁香综合在线 | 亚洲一级特黄特黄的大片 | 韩国成人毛片aaa黄 韩国床戏合集三小时hd中字 | 亚洲成人99 | 永久网站色视频在线观看免费 | 激情深爱| 啪啪亚洲 | a级男女性高爱潮高清试 | 狼人久草 | 插吧插吧综合网 | 日韩黄页 | 国产在线观看午夜不卡 | 夜夜狠狠操 | 天天澡天天摸天天添视频 | 四虎国产精品影库永久免费 | 午夜精品久视频在线观看 | 成人精品第一区二区三区 | 色偷偷亚洲 |