天天看點

offest與layout的差別

     好久沒有更新部落格,因為最近一直專注于手機銀行的開發,其中代碼業務邏輯以及安全性至關重要,工作學習的重心也就不太在代碼美觀性以及UI動畫上面了,新出的姿勢也沒有好好去學習,嗯哼。當然程式員之間打屁什麼的也攔不住,在一個技術牛群,作為一直萌新,是不敢大聲說話的,隻能默默的聽着大佬們吹下的B ,談論的姿勢,然後回頭默默的用鉛筆記下來。

     群裡的大佬們 談到 offest 與layout的差別 當然 這都是因為一個大神級别的人物曬出了自己寫的代碼。如下:

offest與layout的差別
offest與layout的差別

    限于代碼的公正性  我暫時隻粘出這一部分 僅供今天讨論的話題。可以看到offset這個偏移量函數,對于大學不挂科的本萌新,函數 好頭疼啊。 

   首先講一下layout,有個 getLayout()方法,傳回類型是Layout ,也就是傳回textView的布局。

 然後重要的是通過這個 layout調用一個方法:

      getLineForVertical(int verticalPointPosition)  //得到某點在垂直方向上的行數值

      于是綜上所述,在實際的觸摸事件中可以這樣使用:

      Layout layout=textView.getLayout();

      int line = layout.getLineForVertical(textView.getScrollY() + (int) event.getY());

      //得到觸摸點在textView中垂直方向上的行數值。參數是觸摸點在Y軸上的偏移量

 接下來繼續介紹一個方法,要用到上邊的 layout 和 line:

      layout.getOffsetForHorizontal( line , (int) event.getX() );

      //得到觸摸點在某一行水準方向上的偏移量。

      參數分别是: 該行行數值 和 觸摸點在該行X軸上的偏移量。

      此方法得到的該值會根據該行上的文字的多少而變化,并不是橫向上的像素大小;

    大家都知道手機螢幕中整個坐标系是以左上角為原點(0,0),如果在螢幕沒有滑動之前,這一了解肯定是ok的,但在滑屏之後,就會産生很多歧義和混淆,原因在于使用過程當中,很多方法的參數并非是參照螢幕,而是相對于父視圖,對這整個過程和後面自定義控件的坐标變化帶來的各個參數變化來說了解起來就并不那麼适合了,最開始給人的感覺是越來越不清楚這個坐标該怎麼設定,好像坐标系總在發生變化,後來才慢慢在思維當中建構起視圖與視圖容器以及螢幕之間的關系。

    這時那位貼出代碼的大佬,發話了。 如果在動畫過程中觸發layout 很容易丢幀,layout 接下來就是measure   是個很耗時的過程,是以在動畫的過程中 不可以觸發到layout,用到offset的原因在于我現在圖檔在位移的同時還進行着縮放,是以為了不丢幀 我用offset 而不是layout。

    (附加一個姿勢點  寫一個自定義控件 包含一個圖檔和一個文字,怎麼才能讓圖檔和文字随控件的大小同樣放大縮小,請直接讓你的view setScale)。 

       今天的部落格好像有一點亂  但是目的在于記錄一個知識點,有不明白layout或者offset 自身的知識  請自行百度,本文僅限對比不同之處