1. 程式人生 > >簡單實現自定義橫向滾動選擇View

簡單實現自定義橫向滾動選擇View

640?wx_fmt=png

今日科技快訊

昨日有人舉行記者招待會,實名舉報頁遊運營平臺4399大股東蔡文勝涉嫌偷逃國家稅款3.6億元人民幣。舉報人稱4399隱瞞重大事實,意圖欺騙上市。而蔡文勝迴應稱2013年開始全面退出4399的管理層,已不再參與4399之後的所有經營管理活動,而舉報的很多事實發生在這之後的。

作者簡介

本篇是 哦罷了 的第三篇投稿,分享了自己寫得橫向滾動View,效果不錯,希望大家喜歡。

哦罷了 的部落格地址:

http://blog.csdn.net/iamdingruihaha

需求

今日產品經理讓在產品裡面加了個橫向選擇的功能,控制元件樣子大致要求為:

640?wx_fmt=png

網上找了好久沒找到此控制元件,只能自己動手寫了,很適合新手練習自定義View,並貢獻給大家,效果如下:

640?wx_fmt=gif

其實很多滾輪控制元件也只是這個簡單控制元件組合一下就可以了 。

實現思路

這裡我偷懶了,沒有把上、左、右三個箭頭寫到控制元件裡面,寫進去也簡單,不過突然感覺在外面佈局,寫個方法出來也是蠻帥的。所以今天我們的主角就是中間的可以橫向滑動的部分,乍一看就是個 recycleview,不過這裡我沒有想過要用 recycleview 來實現,不是不可以,是用 recycleview 的話,各種判斷、計算偏移量太多了。

而且需求中要求只是文字,無需載入佈局,所以為了節省時間就乾脆自定義一個名為 HorizontalselectedView 的 View,寬高無需自己計算,

只需在 onDraw() 方法裡面把每個String 畫出來, 然後監聽滑動事件或者點選左右箭頭的時候,重走onDraw()方法就可以了,難點在於 onDraw 的時候,每個 String 的座標如何獲得

控制元件特徵

1、中間箭頭下面的文字(被選中的文字)顏色和字型和其他的不一樣

2、可以橫向左右滑動,滑動過程當中,被選中的文字在變化

3、點選左右箭頭的時候也可以 實現滾動,從而改變被選中的文字

4、可見區域內,顯示的文字數是可以改變的

5、左右滑動的時候有回彈選擇效果

根據以上特徵,就能得到我們所需要的自定義屬性,如下:

640?wx_fmt=png

在構造方法裡面初始化畫筆和屬性:

640?wx_fmt=png

重寫onDraw()方法

所有的文字裡面,被選中的文字是特殊的,他的大小和顏色不一樣,所有我們先把他給畫出來,關鍵點在於要測量文字的寬高,程式碼如下:

640?wx_fmt=png

下面要做的是就是要遍歷集合,把其他的文字給畫出來,剛才也提到了,座標是難點,我們看張圖來理一理:

640?wx_fmt=png

其實最巧妙的是得到圖中所標註的一個單元的長度anInt,可見區域的長度除以可見個數就得到了 , 還有就是這個 n,給到資料來源的時候,我是讓資料來源集合的長度除以2的,這個可以理解的。然後遍歷集合的時候 就可以根據下面得到x的座標:x=width/2+anInt*(i-n)-textWidth/2,這裡面的 textWidth 我們預設他一樣長了,但實際情況中,可能會出現三位數,四位數,三個字,四個字,所以在程式碼中,我是獲得被選中文字左右兩面長度的平均值得到的

640?wx_fmt=png

接下來就可以在 onDraw() 方法裡面遍歷了:

640?wx_fmt=png

這樣所得到的效果是把strings平鋪在了控制元件上,其實已經有點樣子了,下面就是進行滑動監聽了。

觸屏監聽事件

觸屏監聽,自然而然就是要複寫 onTouchEvent 方法了 , 這裡的觸屏事件還是比較簡單的,先貼上程式碼:

640?wx_fmt=png

奇怪的是,在這裡面打 log,只有 down事件 觸發,move 和 up 事件觸發不了,這就要加上一行程式碼:

setClickable(true);//使可點選

down 的時候記錄下 downX 座標值,然後 move 時根據 scrollX 和 downX 的大小判斷向左還是向右

從而當 scrollX -downX 的絕對值剛好等於 anInt 的時候,n 相應的 加1 或者 減一 , 再進行重繪,繼而把此時的 scrollX 賦值給 downX;

這就實現了左右滑動,這個時候,整個文字向右或者向左 一個單元一個單元的移動,這顯然不是我們要的效果,我們要的是,滑動的過程當中,文字就跟著手勢在動,所以這裡面肯定需要個偏移量 offSet;

offset = scrollX - downX;

當移動一個單元長度的時候再把 offset 歸零就可以了;所以最終每個文字的x座標為:

640?wx_fmt=png

這樣就基本實現需求了,需要注意的是有幾個地方需要加上 n 的大小判斷的,不能讓他小於0了,或者大於集合長度了,防止越界

對外提供的一些方法

640?wx_fmt=png

經驗總結

本篇文章為適合初級程式設計師學習的典型自定義View,可能很多人看到效果都覺得一頭霧水,不知用了什麼高大上的東西實現的,其實一步步理下來,就是先展示,再讓他動起來,最多就是難在計算座標而已,模糊的地方我們一定要善於畫圖去總結,發現裡面的規律,最後祝各位工作順利,幸福美滿!

只貼出了部分程式碼,原始碼已上傳至github:

https://github.com/385841539/HorizontalScrollSelectedView

更多

每天學習累了,看些搞笑的段子放鬆一下吧。關注最具娛樂精神的公眾號,每天都有好心情。

640?wx_fmt=gif

如果你有好的技術文章想和大家分享,歡迎向我的公眾號投稿,投稿具體細節請在公眾號主頁點選“投稿”選單檢視。

歡迎長按下圖 -> 識別圖中二維碼或者掃一掃關注我的公眾號:

640?wx_fmt=jpeg