1. 程式人生 > >android自定義View之仿通訊錄側邊欄滑動,實現A-Z字母檢索

android自定義View之仿通訊錄側邊欄滑動,實現A-Z字母檢索

我們的手機通訊錄一般都有這樣的效果,如下圖:

OK,這種效果大家都見得多了,基本上所有的android手機通訊錄都有這樣的效果。那我們今天就來看看這個效果該怎麼實現。

一.概述

1.頁面功能分析

整體上來說,左邊是一個ListView,右邊是一個自定義View,但是左邊的ListView和我們平常使用的ListView還有一點點不同,就是在ListView中我對所有的聯絡人進行了分組,那麼這種效果的實現最常見的就是兩種思路:

1.使用ExpandableListView來實現這種分組效果

2.使用普通ListView,在構造Adapter時實現SectionIndexer介面,然後在Adapter中做相應的處理

這兩種方式都不難,都屬於普通控制元件的使用,那麼這裡我們使用第二種方式來實現,第一種方式的實現方法大家可以自行研究,如果你還不熟悉ExpandableListView的使用,可以參考我的另外兩篇部落格:

1.使用ExpandableListView實現一個時光軸

2.android開發之ExpandableListView的使用,實現類似QQ好友列表

OK,這是我們左邊ListView的實現思路,右邊這個東東就是我們今天的主角,這裡我通過自定義一個View來實現,View中的A、B......#這些字元我都通過canvas的drawText方法繪製上去。然後重寫onTouchEvent方法來實現事件監聽。

2.要實現的效果

要實現的效果如上圖所示,但是大家看圖片有些地方可能還不太清楚,所以這裡我再強調一下:

1.左邊的ListView對資料進行分組顯示

2.當左邊ListView滑動的時候,右邊滑動控制元件中的文字顏色能夠跟隨左邊ListView的滑動自動變化

3.當手指在右邊的滑動控制元件上滑動時,手指滑動到的地方的文字顏色應當發生變化,同時在整個頁面的正中央有一個TextView顯示手指目前按下的文字

4.當手指按下右邊的滑動控制元件時,右邊的滑動控制元件背景變為灰色,手指鬆開後,右邊的滑動控制元件又變為透明色

二.左邊ListView分組效果的實現

無論多大的工程,我們都要將之分解為一個個細小的功能塊分步來實現,那麼這裡我們就先來看看左邊的ListView的分組的實現,這個效果實現之後,我們再來看看右邊的滑動控制元件該怎麼實現。

首先我需要在佈局檔案中新增一個ListView,這個很簡單,和普通的ListView一模一樣,我就不貼程式碼了,另外,針對ListView中的資料集,我需要自建一個實體類,該實體類如下:

[java]  view plain  copy  print ?
  1. /** 
  2.  * Created by wangsong on 2016/4/24. 
  3.  */  
  4. public class User {  
  5.     private int img;  
  6.     private String username;  
  7.     private String pinyin;  
  8.     private String firstLetter;  
  9.   
  10.     public User() {  
  11.     }  
  12.   
  13.     public String getFirstLetter() {  
  14.         return firstLetter;  
  15.     }  
  16.   
  17.     public void setFirstLetter(String firstLetter) {  
  18.         this.firstLetter = firstLetter;  
  19.     }  
  20.   
  21.     public int getImg() {  
  22.         return img;  
  23.     }  
  24.   
  25.     public void setImg(int img) {  
  26.         this.img = img;  
  27.     }  
  28.   
  29.     public String getPinyin() {  
  30.         return pinyin;  
  31.     }  
  32.   
  33.     public void setPinyin(String pinyin) {  
  34.         this.pinyin = pinyin;  
  35.     }  
  36.   
  37.     public String getUsername() {  
  38.         return username;  
  39.     }  
  40.   
  41.     public void setUsername(String username) {  
  42.         this.username = username;  
  43.     }  
  44.   
  45.     public User(String firstLetter, int img, String pinyin, String username) {  
  46.         this.firstLetter = firstLetter;  
  47.         this.img = img;  
  48.         this.pinyin = pinyin;  
  49.         this.username = username;  
  50.     }  
  51. }  

username用來儲存使用者名稱,img表示使用者影象的資源id(這裡我沒有準備相應的圖片,大家有興趣可以自行新增),pinyin表示使用者姓名的拼音,firstLetter表示使用者姓名拼音的首字母,OK ,就這麼簡單的幾個屬性。至於資料來源,我在strings.xml檔案中添加了許多資料,這裡就不貼出來了,大家可以直接在文末下載原始碼看。知道了資料來源,知道了實體類,我們來看看在MainActivity中怎麼樣來初始化資料:

[java]  view plain  copy  print ?
  1. private void initData() {  
  2.     list = new ArrayList<>();  
  3.     String[] allUserNames = getResources().getStringArray(R.array.arrUsernames);  
  4.     for (String allUserName : allUserNames) {  
  5.         User user = new User();  
  6.         user.setUsername(allUserName);  
  7.         String convert = ChineseToPinyinHelper.getInstance().getPinyin(allUserName).toUpperCase();  
  8.         user.setPinyin(convert);  
  9.         String substring = convert.substring(01);  
  10.         if (substring.matches("[A-Z]")) {  
  11.             user.setFirstLetter(substring);  
  12.         }else{  
  13.             user.setFirstLetter("#");  
  14.         }  
  15.         list.add(user);  
  16.     }  
  17.     Collections.sort(list, new Comparator<User>() {  
  18.         @Override  
  19.         public int compare(User lhs, User rhs) {  
  20.             if (lhs.getFirstLetter().contains("#")) {  
  21.                 return 1;  
  22.             } else if (rhs.getFirstLetter().contains("#")) {  
  23.                 return -1;  
  24.             }else{  
  25.                 return lhs.getFirstLetter().compareTo(rhs.getFirstLetter());  
  26.             }  
  27.         }  
  28.     });  
  29. }  

首先建立一個List集合用來存放所有的資料,然後從strings.xml檔案中讀取出來所有的資料,遍歷資料然後儲存到List集合中,在遍歷的過程中,我通過ChineseToPinyinHelper這個工具類來將中文轉為拼音,然後擷取拼音的第一個字母,如果該字母是A~Z,那麼直接設定給user物件的firstLetter屬性,否則user物件的firstLetter屬性為一個#,這是由於我的資料來源中有一些不是以漢字開頭的姓名,而是以其他字元開頭的姓名,那麼我將這些統一歸為#這個分組。

OK,資料來源構造好之後,我還需要對List集合進行一個簡單的排序,那麼這個排序是Java中的操作,我這裡就不再贅述。

構造完資料來源之後,接著就該是構造ListView的Adapter了,我們來看看這個怎麼做,先來看看原始碼:

[java]  view plain  copy  print ?
  1. /** 
  2.  * Created by wangsong on 2016/4/24. 
  3.  */  
  4. public class MyAdapter extends BaseAdapter implements SectionIndexer {  
  5.     private List<User> list;  
  6.     private Context context;  
  7.     private LayoutInflater inflater;  
  8.   
  9.     public MyAdapter(Context context, List<User> list) {  
  10.         this.context = context;  
  11.         this.list = list;  
  12.         inflater = LayoutInflater.from(context);  
  13.     }  
  14.   
  15.     @Override  
  16.     public int getCount() {  
  17.         return list.size();  
  18.     }  
  19.   
  20.     @Override  
  21.     public Object getItem(int position) {  
  22.         return list.get(position);  
  23. 相關推薦

    android定義View仿通訊錄滑動實現A-Z字母檢索

    我們的手機通訊錄一般都有這樣的效果,如下圖: OK,這種效果大家都見得多了,基本上所有的android手機通訊錄都有這樣的效果。那我們今天就來看看這個效果該怎麼實現。 一.概述 1.頁面功能分析 整體上來說,左邊是一個ListView,右邊是一個自定義View,但

    Android定義View仿QQ滑選單實現

    最近,由於正在做的一個應用中要用到側滑選單,所以通過查資料看視訊,學習了一下自定義View,實現一個類似於QQ的側滑選單,順便還將其封裝為自定義元件,可以實現類似QQ的側滑選單和抽屜式側滑選單兩種選單。 下面先放上效果圖: 我們這裡的側

    Android定義View仿京東售後稽核進度

    本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 概述:同常在做商城類的App時,都會有售後的需求,而售後流程通常會因為不同的業務,而分為不確定的幾個步驟,如下圖所示: 那麼問題就來了,像這樣的效果如何實現呢?讓我們先放下這個問題,先看

    Android 定義View仿華為圓形載入進度條

    效果圖 實現思路 可以看出該View可分為三個部分來實現 最外圍的圓,該部分需要區分進度圓和底部的刻度圓,進度部分的刻度需要和底色刻度區分開來 中間顯示的文字進度,需要讓文字在View中居中顯示 旋轉的小圓點,小圓點需要模擬小球下落運動時的加速度

    android 定義view滑效果

    效果圖: 看網上的都是兩個view拼接,預設右側的不顯示,水平移動的時候把右側的view顯示出來。但是看最新版QQ上的效果不是這樣的,但給人的感覺卻很好,所以獻醜來一發比較高仿的。 知識點: 1、ViewDragHelper 的用法; 2、滑動衝突的解決; 3、自定

    Android定義view實現仿抖音雙擊點贊單擊暫停特效

           2018年抖音、快手、火山等短視訊App比較火,最近自己做短視訊專案時有個需求,就是類似抖音的點贊特效,單擊螢幕時視訊暫停,再次點選時視訊恢復播放,雙擊或者連續多次點選時出現點贊特效(飄小心心特效),而且是全屏可以隨意點選,都

    Android定義View(下拉重新整理+滑刪除)

    以前專案中用到了一個放qq的側滑刪除的效果,結果github上一搜就copy了一個,不得不說大神們寫的真心牛逼,那個時候呢看到一個東西能用就可以了,也不管怎麼實現的,現在反過來一看,原來自定義還可以這麼玩,當然,前面專案中也因此出現了一個bug,就是我使用的是P

    Android定義View分貝儀

    一、說明        最近在整理自定義View方面的知識,偶爾看到meizu工具箱的分貝儀效果,感覺它的實效效果還挺好的,遂想自己模擬實現練練手,廢話不多說,直接開擼。 二、效果圖 首先看一下效果圖: 看效果還挺炫酷

    Android定義ViewCanvas

    https://www.jianshu.com/p/fb18c28d6627 用繼承View的方式來自定義View,我們就需要重寫onDraw方法,也就是得咱自己來畫圖了。畫圖就得用到畫筆和畫布,也就是Paint和Canvas。我們來了解下Canvas。 Canvas Canvas我們可

    Android 定義ViewCanvas詳解

    自定義View的相關文章: Android 實現一個簡單的自定義View Android 自定義View步驟 Android Paint詳解 Android 自定義View之Canvas相關方法說明 Android 自定義View例項之 “京東跑”

    Android : 定義View流式佈局

    寫了一個很簡單的佈局 這是周圍圓框的drawable <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android">

    Android定義ViewgetTextBounds()

    在Android自定義View的過程中一定會用到Paint,而paint屬性中有一個方法getTextBounds(String text,int start,int end,Rext bounds),它的中文解釋是:返回一個包含中文的矩形邊界,位置為(start,end) 英文解釋:Retur

    Android定義View定義屬性

    在Android開發中經常會用到自定義View的情況,而在自定義View時,自定義屬性是必須用到的。 1、新建一個自定義View如CustomView 它的自定義屬性主要是通過declare-styleable標籤為其配置自定義屬性。具體做法是:在res/values/目錄下增加一個reso

    Android -- 定義viewStepView

    先看看實現的效果: 2,首先我們來看看我們常規的自定義view的基礎步驟吧         1,繼承View,重寫構造方法 2,自定義屬性 3,重寫onMeasure()測量控制元件高度 4,重寫onDra

    Android 定義View 可隨意拖動的View

    因為趕專案本人停更兩個月 從今天開始又可以更新了 今天說一下這個可隨意拖動的view 簡單說一下這個view效果 和 發展 一開始這種效果是使用在網頁端的特別是購物類 例如某寶 某東 購物車和客服視窗 都有使用這個懸浮可拖動的設計效果 後來才發展到的移動端 還有

    定義View仿ios分段選擇器

    一:效果 1.1 可動態新增或刪除tab,更改指定tab的文字。 二:實現思路 自定義view,實現效果 動態建立textview,有幾個tab建立幾個textview 第一個tab和最後一個tab為圓角矩形,其餘的為直角矩形,通過shape檔案完成 預設選

    Android 定義View咖啡動畫

    文章目錄效果畫杯子畫杯墊畫煙霧 效果 大概思路 自定義view,直接繼承view 複寫onSizeChanged()方法,在此計算杯墊,杯子,煙霧效果的path 在onDraw()方法中,描繪杯墊,杯子 處理煙霧動畫效果 畫杯子 這裡需要畫兩部分內容,第

    Android 定義View下雨動畫

    文章目錄效果思路畫雲畫雨滴優化 效果 開始前先做個熱身( ˘•灬•˘ ) 自己實現比較容易,但是到了要出部落格整理思路,總結要點的時候就撓頭,不知雲所以,所以最簡單的還是 如果對安卓UI有興趣的朋友可以加我好友互相探討, 思路 思路比較簡單,整個view無

    android定義View定義EditText(新增刪除功能)

               忙忙碌碌20天,新的專案終於接近尾聲了。今天公司召集幾個使用者體驗師和美工一起吐糟這20天做的這個新產品,對於產品提出了很多建議,這幾天就改介面了。在這個專案中大量的使用了EditText元件,並且添加了刪除功能。這裡面都是用RelativeLayou

    android定義view畫圓隨著手指移動

    public class MyView extends View { private Paint mFanPaint,mTextPaint;//扇形畫筆和文字畫筆 public float AxisX=100; public float AxisY=100; public MyView(