<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Android實(shí)現(xiàn)連線題效果

          共 2097字,需瀏覽 5分鐘

           ·

          2021-09-26 03:07

          效果圖

          全部正確:


          有對有錯:


          結(jié)果展示,純黑色:


          支持圖片


          實(shí)現(xiàn)思路


          仔細(xì)分析可以發(fā)現(xiàn),連線題的布局可以分為兩部分,一個是左右兩列矩形,另一個是他們之間的連線。

          每個矩形的寬高都一樣,或者等比例,這樣利于給他們定位,添加矩形時使用ViewGroup#ddView(View child, LayoutParams params)方法,我們通過LayoutParams參數(shù)來控制每個矩形的位置。

          為了方便添加矩形,這里我們的自定義布局繼承自RelativeLayout。
          public class LinkLineView extends RelativeLayout {    ...}


          接下來說連線,連線我們通過記錄他們的起點(diǎn)和終點(diǎn)數(shù)據(jù),然后調(diào)用View#invalidate方法,在ViewGgroup#dispatchDraw()方法里面通過canvas.drawLine()方法進(jìn)行繪制。

          我們假設(shè)線都是從左向右連的,起點(diǎn)就是左邊矩形右邊距的中點(diǎn),終點(diǎn)就是右邊矩形左邊距的中點(diǎn)。在添加矩形的時候我們可以知道每個矩形的具體參數(shù),所以所有連線的起點(diǎn)和終點(diǎn)的數(shù)據(jù)我們是知道的,接著就是如何表示一根線的問題。

          在所有連線完成之前,連線是可以取消掉的;在所有連線完成后,我們需要用連線結(jié)果跟正確結(jié)果進(jìn)行比對的,所以我們需要針對每次連線定義一個數(shù)據(jù)結(jié)構(gòu),具體如下:
          public class LinkLineBean {
          /** * 直線的橫縱坐標(biāo) */ private float startX; private float startY; private float endX; private float endY;
          public LinkLineBean(float startX, float startY, float endX, float endY) { this.startX = startX; this.startY = startY; this.endX = endX; this.endY = endY; }
          // 省略getter和setter方法
          @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof LinkLineBean)) { return false; } LinkLineBean that = (LinkLineBean) o; return (Float.compare(that.startX, startX) == 0 && Float.compare(that.startY, startY) == 0 && Float.compare(that.endX, endX) == 0 && Float.compare(that.endY, endY) == 0) || (Float.compare(that.startX, endX) == 0 && Float.compare(that.startY, endY) == 0 && Float.compare(that.endX, startX) == 0 && Float.compare(that.endY, startY) == 0); }
          @Override public int hashCode() { return Objects.hash(startX, startY, endX, endY); }}


          這里省略了一些不必要的代碼。

          重寫equals和hashCode方法是為了比較是否是同一條連線。如果連線A的起點(diǎn)等于連線B的終點(diǎn),連線A的終點(diǎn)等于連線B的起點(diǎn),我們就認(rèn)為他們是同一條連線,這個也符合我們的常識,同一條線從左向右連和從右向左連是一樣的。

          核心思路說完了,剩下的就是一些細(xì)節(jié)處理了。

          源碼地址:
          https://github.com/tinyvampirepudge/LinkLineDemo

          到這里就結(jié)束啦。
          瀏覽 77
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  尻屄在线观看 | 精品一区二区三区四区五区六区七区八区九区 | 韩国三级片久久久久 | 91九色网 | 亚洲三级片在线播放 |