簡單實現自定義橫向滾動選擇View
昨日有人舉行記者招待會,實名舉報頁遊運營平臺4399大股東蔡文勝涉嫌偷逃國家稅款3.6億元人民幣。舉報人稱4399隱瞞重大事實,意圖欺騙上市。而蔡文勝迴應稱2013年開始全面退出4399的管理層,已不再參與4399之後的所有經營管理活動,而舉報的很多事實發生在這之後的。
作者簡介本篇是 哦罷了 的第三篇投稿,分享了自己寫得橫向滾動View,效果不錯,希望大家喜歡。
哦罷了 的部落格地址:
需求http://blog.csdn.net/iamdingruihaha
今日產品經理讓在產品裡面加了個橫向選擇的功能,控制元件樣子大致要求為:
網上找了好久沒找到此控制元件,只能自己動手寫了,很適合新手練習自定義View,並貢獻給大家,效果如下:
其實很多滾輪控制元件也只是這個簡單控制元件組合一下就可以了 。
實現思路這裡我偷懶了,沒有把上、左、右三個箭頭寫到控制元件裡面,寫進去也簡單,不過突然感覺在外面佈局,寫個方法出來也是蠻帥的。所以今天我們的主角就是中間的可以橫向滑動的部分,乍一看就是個 recycleview,不過這裡我沒有想過要用 recycleview 來實現,不是不可以,是用 recycleview 的話,各種判斷、計算偏移量太多了。
而且需求中要求只是文字,無需載入佈局,所以為了節省時間就乾脆自定義一個名為 HorizontalselectedView 的 View,寬高無需自己計算,
控制元件特徵
1、中間箭頭下面的文字(被選中的文字)顏色和字型和其他的不一樣
2、可以橫向左右滑動,滑動過程當中,被選中的文字在變化
3、點選左右箭頭的時候也可以 實現滾動,從而改變被選中的文字
4、可見區域內,顯示的文字數是可以改變的
5、左右滑動的時候有回彈選擇效果
根據以上特徵,就能得到我們所需要的自定義屬性,如下:
在構造方法裡面初始化畫筆和屬性:
重寫onDraw()方法
所有的文字裡面,被選中的文字是特殊的,他的大小和顏色不一樣,所有我們先把他給畫出來,關鍵點在於要測量文字的寬高,程式碼如下:
下面要做的是就是要遍歷集合,把其他的文字給畫出來,剛才也提到了,座標是難點,我們看張圖來理一理:
其實最巧妙的是得到圖中所標註的一個單元的長度anInt,可見區域的長度除以可見個數就得到了 , 還有就是這個 n,給到資料來源的時候,我是讓資料來源集合的長度除以2的,這個可以理解的。然後遍歷集合的時候 就可以根據下面得到x的座標:x=width/2+anInt*(i-n)-textWidth/2,這裡面的 textWidth 我們預設他一樣長了,但實際情況中,可能會出現三位數,四位數,三個字,四個字,所以在程式碼中,我是獲得被選中文字左右兩面長度的平均值得到的。
接下來就可以在 onDraw() 方法裡面遍歷了:
這樣所得到的效果是把strings平鋪在了控制元件上,其實已經有點樣子了,下面就是進行滑動監聽了。
觸屏監聽事件
觸屏監聽,自然而然就是要複寫 onTouchEvent 方法了 , 這裡的觸屏事件還是比較簡單的,先貼上程式碼:
奇怪的是,在這裡面打 log,只有 down事件 觸發,move 和 up 事件觸發不了,這就要加上一行程式碼:
setClickable(true);//使可點選
down 的時候記錄下 downX 座標值,然後 move 時根據 scrollX 和 downX 的大小判斷向左還是向右
從而當 scrollX -downX 的絕對值剛好等於 anInt 的時候,n 相應的 加1 或者 減一 , 再進行重繪,繼而把此時的 scrollX 賦值給 downX;
這就實現了左右滑動,這個時候,整個文字向右或者向左 一個單元一個單元的移動,這顯然不是我們要的效果,我們要的是,滑動的過程當中,文字就跟著手勢在動,所以這裡面肯定需要個偏移量 offSet;
offset = scrollX - downX;
當移動一個單元長度的時候再把 offset 歸零就可以了;所以最終每個文字的x座標為:
這樣就基本實現需求了,需要注意的是有幾個地方需要加上 n 的大小判斷的,不能讓他小於0了,或者大於集合長度了,防止越界
對外提供的一些方法
經驗總結本篇文章為適合初級程式設計師學習的典型自定義View,可能很多人看到效果都覺得一頭霧水,不知用了什麼高大上的東西實現的,其實一步步理下來,就是先展示,再讓他動起來,最多就是難在計算座標而已,模糊的地方我們一定要善於畫圖去總結,發現裡面的規律,最後祝各位工作順利,幸福美滿!
只貼出了部分程式碼,原始碼已上傳至github:
更多https://github.com/385841539/HorizontalScrollSelectedView
每天學習累了,看些搞笑的段子放鬆一下吧。關注最具娛樂精神的公眾號,每天都有好心情。
如果你有好的技術文章想和大家分享,歡迎向我的公眾號投稿,投稿具體細節請在公眾號主頁點選“投稿”選單檢視。
歡迎長按下圖 -> 識別圖中二維碼或者掃一掃關注我的公眾號: