前言:在安卓上繪制關(guān)系圖譜網(wǎng)上的解決方案大多是用WebView+js,侵入性較高,對復(fù)雜的需求不友好。
Deponder是安卓原生的SDK,接入簡單,支持自定義布局和縮放,賦予布局接近物理特性的動態(tài)譜圖效果。
一、簡介和優(yōu)勢
1、簡介
Deponder作為在安卓上繪制動態(tài)圖譜的SDK,使用簡單,方便實現(xiàn)自定義需求。
2、Deponder的優(yōu)點
1.安卓原生,插件形式使用,侵入性低,簡單方便。
2.適用于任意布局,任意view集合,而且集合中的view可以是復(fù)雜布局,也可以互不相同。

二、基本使用
0.首先在build.gradle中加入以下代碼,引入依賴的SDK.
repositories {
google()
mavenCentral()
}
dependencies {
implementation 'io.github.cinpecan:deponder:0.2.7'
}
假設(shè)我們已有布局(也可以是動態(tài)布局,例如RecyclerView)
原先采用何種布局或排布并不重要,都會被Deponder變成動態(tài)的關(guān)系圖譜
<FrameLayout //myGroup
<TextView .../> //myItemA(也可以是復(fù)雜布局)
<ImageView .../> //myItemB(也可以是復(fù)雜布局)
</FrameLayout>
即
ViewGroup myGroup
TextView myItemA
ImageView myItemB
1.選擇myGroup作為圖譜的邊界,并創(chuàng)建Deponder
RootOption rootOption = SimpleRootOption.builder()
.itemView(myGroup)
.build());
DeponderControl<PlanetOption, RubberOption> deponder = new Deponder<>(this, rootOption);//this可為activity,fragment或其它實現(xiàn)生命周期回收者
2.設(shè)置你期望myItemA,myItemB擁有的物理屬性
PlanetOption myItemAOption = SimplePlanet.builder()
.itemView(myItemA)
//設(shè)定一個唯一標(biāo)識(默認(rèn)String.valueOf([YOUR CHILD VIEW].hashCode())
.id(String.valueOf(myItemA.hashCode()))
.build();
PlanetOption myItemBOption = SimplePlanet.builder()
.itemView(myItemB)
.id(String.valueOf(myItemB.hashCode()))
.build();
//放入集合
List<PlanetOption> listPlanet = new ArrayList<>();
listPlanet.add(myItemAOption );
listPlanet.add(myItemBOption );
3.提交包含物理屬性的視圖集合到Deponder中,讓圖譜動起來
(1)提交myItemA,myItemB的集合到Deponder中
deponder.submitPlanet(listPlanet);
deponder.submitRubber(new ArrayList());//這是橡皮筋集合,如果不需要,提交個空集合即可,需要的話往下看
動起來了! 現(xiàn)在,myItemA、myItemB 在 myGroup 的范圍中,因為物理特性而自然的分散開來。
如果你想要拖拽來操控它們,你可以自定義拖拽手勢監(jiān)聽,也可以使用Deponder提供的簡單手勢監(jiān)聽。
DeponderHelper.bindDefTouchPlanet(myItemA);
DeponderHelper.bindDefTouchPlanet(myItemB);
4.如果你希望有一根強(qiáng)力的橡皮筋,兩端綁上myItemA、myItemB,并可以像橡皮筋一樣橫向拉伸或壓縮,用以強(qiáng)調(diào)對象的關(guān)系
i:準(zhǔn)備一個寬高不為0的View加入myGroup中,作為橡皮筋
例如我們的布局中加入一個View:
<LinearLayout //myGroup
<TextView .../> //myItemA
<ImageView .../> //myItemB
<View .../> //myRubberA(寬高不為0)(也可以是復(fù)雜布局)
</LinearLayout>
即
View myRubberA
ii:設(shè)置你期望myRubberA擁有的物理屬性
RubberOption rubberA=SimpleRubber.builder()
//兩端綁定的item的id
.sId(myItemAOption.id())
.eId(myItemBOption .id())
//放入準(zhǔn)備好的橡皮筋視圖
.itemView(myRubberA)
//可以設(shè)定想要的彈性系數(shù)
.elasticityCoefficient(1.68f)
//設(shè)定橡皮筋的自然長度
.naturalLength(300)
.build();
//放入集合
List<RubberOption > listRubber=new ArrayList<>();
listRubber.add(rubberA);
iii:提交橡皮筋集合到Deponder中
deponder.submitRubber(listRubber);
橡皮筋生效了,它會將兩個關(guān)系的對象拉扯在一起,并保持一定距離
5.放大和縮小
當(dāng)元素過多過少,或者為了布局美觀,可能想要Deponder能縮放它們,這非常簡單,例如所有已接管對象放大到1.5倍
deponder.submitScale(1.5);
三、更進(jìn)一步
1.如果你希望橡皮筋視圖 不被伸縮 可以加入tag,告訴Deponder這個視圖不需要伸縮
<View //myRubberA
...
android:tag="UN_RUBBER_RUBBER"
...
.../>
如果橡皮筋是復(fù)雜視圖,還可以給局部添加該tag,僅局部不被伸縮
2.如果你希望對象間斥力變成引力,可以將彈性系數(shù)設(shè)為負(fù)數(shù)試試
3.還有更多接口,比如空氣阻尼,質(zhì)量,彈性系數(shù)可供開發(fā)者使用
i:比如希望圖譜穩(wěn)定得更快,可以試試減少質(zhì)量,加大彈性系數(shù),
ii:比如希望模仿重力,可以試試僅設(shè)置下邊框的引力,或設(shè)置上邊框的斥力,并設(shè)置鋪滿布局的影響范圍。
更詳細(xì)的內(nèi)容:Deponder GitHub傳送門
滿地打滾求求Star
本文最后更新于2022.6