使用Deponder繪制安卓原生的動態(tài)關(guān)系圖譜

前言:在安卓上繪制關(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ù)雜布局,也可以互不相同。

效果圖

Deponder GitHub傳送門

二、基本使用

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容