最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android實現(xiàn)仿通訊錄側(cè)邊欄滑動SiderBar效果代碼

 更新時間:2015年10月24日 12:13:36   作者:freesonhp  
這篇文章主要介紹了Android實現(xiàn)仿通訊錄側(cè)邊欄滑動SiderBar效果代碼,實例分析了通訊錄側(cè)邊欄滑動效果的實現(xiàn)技巧,并附帶完整實例代碼供讀者下載參考,需要的朋友可以參考下

本文實例講述了Android實現(xiàn)仿通訊錄側(cè)邊欄滑動SiderBar效果代碼。分享給大家供大家參考,具體如下:

之前看到某些應(yīng)用的側(cè)邊欄做得不錯,想想自己也弄一個出來,現(xiàn)在分享出來,當(dāng)然里面還有不足的地方,請大家多多包涵。

先上圖:

具體實現(xiàn)的代碼如下:

package com.freesonfish.listview_index; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
public class MySideBar extends View { 
  private OnTouchingLetterChangedListener touchListener; 
  // 26個字母 
  public static String[] b = { "#", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", 
      "U", "V", "W", "X", "Y", "Z" }; 
  private boolean showBkg = false; 
  int choose = -1; 
  int scrollChoose = -1; 
  Paint paint = new Paint(); 
  Paint rectPaint = new Paint(); 
  float rectWidth = 0f; 
  public MySideBar(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    init(); 
  } 
  public MySideBar(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
  } 
  public MySideBar(Context context) { 
    super(context); 
    init(); 
  } 
  private void init() { 
    rectPaint.setColor(Color.parseColor("#CCCCCC")); 
    rectWidth = paint.measureText("#"); 
  } 
  /** 
   * 重寫這個方法 
   */ 
  protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    if (showBkg) { 
      canvas.drawColor(Color.parseColor("#CCCCCC")); 
    } 
    final int height = getHeight(); 
    final int width = getWidth(); 
    final int singleHeight = height / b.length; 
    final float xRectPos = ((float) width - paint.measureText("#")) / 2.0f - rectWidth; 
    final float xRectPos2 = xRectPos + 3.0f * rectWidth; 
    for (int i = 0; i < b.length; i++) { 
      paint.setFakeBoldText(true); 
      paint.setAntiAlias(true); 
      final float xPos = ((float) width - paint.measureText(b[i])) / 2.0f;
      final float yPos = singleHeight * i + singleHeight; 
      if (i == choose) { 
        paint.setColor(Color.RED); 
        canvas.drawRect(xRectPos, yPos - singleHeight / 2.0f, xRectPos2, yPos + rectWidth, rectPaint); 
      } 
      canvas.drawText(b[i], xPos, yPos, paint); 
      paint.reset(); 
    } 
  } 
  @Override 
  public boolean dispatchTouchEvent(MotionEvent event) { 
    final int action = event.getAction(); 
    final float y = event.getY(); 
    final int c = (int) (y / getHeight() * b.length); 
    switch (action) { 
    case MotionEvent.ACTION_DOWN: 
      showBkg = true; 
      if (choose != c && touchListener != null) { 
        doOnActionDown(c); 
      } 
      break; 
    case MotionEvent.ACTION_MOVE: 
      if (choose != c && touchListener != null) { 
        doOnActionDown(c); 
      } 
      break; 
    case MotionEvent.ACTION_UP: 
      showBkg = false; 
      invalidate(); 
      break; 
    } 
    return true; 
  } 
  /** 
   * listview滾動時候調(diào)用它 
   * 
   * @param c 
   */ 
  public void setColorWhenListViewScrolling(int c) { 
    if (scrollChoose != c) { 
      scrollChoose = c; 
      String string = ListContantsUtil.AbcList.get(c); 
      for (int i = c; i < b.length; ++i) { 
        if (string.equals(b[i])) { 
          choose = i; 
          invalidate(); 
          break; 
        } 
      } 
    } 
  } 
  /** 
   * 當(dāng)側(cè)邊欄被按下的動作 
   * @param c 
   */ 
  private void doOnActionDown(int c) { 
    if (c > 0 && c < b.length) { 
      if (ListContantsUtil.indexPositionMap.containsKey(b[c])) { 
        touchListener.onTouchingLetterChanged(b[c]); 
        choose = c; 
        invalidate(); 
      } else { 
        c = c - 1; 
        doOnActionDown(c); 
      } 
    } 
  } 
  @Override 
  public boolean onTouchEvent(MotionEvent event) { 
    return super.onTouchEvent(event); 
  } 
  public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener touchListener) { 
    this.touchListener = touchListener; 
  } 
  /** 
   * 用來通知activity顯示選中的字母 
   * @author freeson 
   * 
   */ 
  public interface OnTouchingLetterChangedListener { 
    public void onTouchingLetterChanged(String s); 
  } 
}

然后ListContantsUtil類是存儲通訊錄名字的拼音等的類,具體也如下:

package com.freesonfish.listview_index; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
public class ListContantsUtil { 
  static final List<Integer> indexPositionList = new ArrayList<Integer>(); 
  static final List<String> AbcList = new ArrayList<String>(); 
  static final HashMap<String, Integer> indexPositionMap = new HashMap<String, Integer>(); 
  static void putNameIndexToMap(List<String> list, HashMap<String, String> nameAndPinyin) { 
    int lenght = list.size(); 
    for (int i = 0; i < lenght; ++i) { 
      String name = nameAndPinyin.get(list.get(i)).substring(0, 1); 
      // 判斷該字符是屬于字母還是數(shù)字或其他的 
      int ascii = name.toCharArray()[0]; 
      if (ascii >= 65 && ascii <= 90) { 
        if (!indexPositionMap.containsKey(name)) { 
          indexPositionMap.put(name, i); 
          AbcList.add(name); 
          indexPositionList.add(i); 
        } 
      } else { 
        if (!indexPositionMap.containsKey("#")) { 
          indexPositionMap.put("#", i); 
          AbcList.add("#"); 
          indexPositionList.add(i); 
        } 
      } 
    } 
  } 
}

注意,上面的程序還是有些小問題的,請大家注意優(yōu)化解決。

完整實例代碼代碼點擊此處本站下載

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

  • Android提高之Activity+Intent用法示例

    Android提高之Activity+Intent用法示例

    這篇文章主要介紹了Android提高之Activity+Intent用法,是很實用的功能,需要的朋友可以參考下
    2014-08-08
  • Android編程實現(xiàn)只顯示圖片一部分的方法

    Android編程實現(xiàn)只顯示圖片一部分的方法

    這篇文章主要介紹了Android編程實現(xiàn)只顯示圖片一部分的方法,涉及Android針對圖片的局部顯示操作技巧,需要的朋友可以參考下
    2016-10-10
  • Android之PreferenceActivity應(yīng)用詳解

    Android之PreferenceActivity應(yīng)用詳解

    為了引入這個概率 首先從需求說起 即:現(xiàn)有某Activity專門用于手機屬性設(shè)置 那么應(yīng)該如何做呢
    2012-11-11
  • Android BadTokenException異常解決案例詳解

    Android BadTokenException異常解決案例詳解

    這篇文章主要介紹了Android BadTokenException異常詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-08-08
  • linphone-sdk-android版本號生成解析

    linphone-sdk-android版本號生成解析

    這篇文章主要為大家介紹了linphone-sdk-android版本號生成解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Android入門之利用Spinner實現(xiàn)彈出選擇對話框

    Android入門之利用Spinner實現(xiàn)彈出選擇對話框

    這篇文章主要為大家詳細介紹了Android里如何巧用Spinner做彈出選擇對話框,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2022-11-11
  • Android獲取網(wǎng)絡(luò)圖片并顯示的方法

    Android獲取網(wǎng)絡(luò)圖片并顯示的方法

    這篇文章主要為大家詳細介紹了Android獲取網(wǎng)絡(luò)圖片并顯示的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • ToolBar使用方法詳解

    ToolBar使用方法詳解

    這篇文章主要為大家詳細介紹了Android中ToolBar的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Flutter 假異步的實現(xiàn)示例

    Flutter 假異步的實現(xiàn)示例

    這篇文章主要介紹了Flutter 假異步的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Kotlin List與Set和Map實例講解

    Kotlin List與Set和Map實例講解

    集合是可變數(shù)量(可能為0)的一組條目,kotlin標準庫提供一個整套用于集合管理的工具,各種集合對于解決問題都具有重要意義,并且經(jīng)常用到。kotlin中的集合與Java基本類似
    2022-10-10

最新評論

琼中| 林西县| 家居| 雷波县| 临城县| 湖南省| 永德县| 宝坻区| 板桥市| 高淳县| 涿鹿县| 城市| 禄劝| 蒲城县| 青海省| 陇西县| 巩留县| 林周县| 柳江县| 大竹县| 龙海市| 建平县| 措勤县| 瑞金市| 天津市| 麦盖提县| 什邡市| 广丰县| 察哈| 曲水县| 东港市| 曲麻莱县| 金沙县| 和林格尔县| 南召县| 裕民县| 常熟市| 汉中市| 蛟河市| 长沙市| 荔波县|