1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 2097字,需瀏覽 5分鐘

         ·

        2021-09-26 03:07

        效果圖

        全部正確:


        有對有錯:


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


        支持圖片


        實現(xiàn)思路


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

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

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


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

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

        在所有連線完成之前,連線是可以取消掉的;在所有連線完成后,我們需要用連線結(jié)果跟正確結(jié)果進行比對的,所以我們需要針對每次連線定義一個數(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的起點等于連線B的終點,連線A的終點等于連線B的起點,我們就認(rèn)為他們是同一條連線,這個也符合我們的常識,同一條線從左向右連和從右向左連是一樣的。

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

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

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

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            aa亚洲| 欧美日韩在线观看一区二区 | 娇妻玩4p被三个男人玩 | 亚洲青青草原 | 美女裸体网站91 | 亚洲成人影视大全 | 超碰自拍网 | 一级片大片 | 国产精品久久久久久9999 | 紧身少妇瑜伽裤啪啪 |