Android实现仿通讯录侧边栏滑动SiderBar效果代码

所属分类: 软件编程 / Android 阅读数: 2071
收藏 0 赞 0 分享

本文实例讲述了Android实现仿通讯录侧边栏滑动SiderBar效果代码。分享给大家供大家参考,具体如下:

之前看到某些应用的侧边栏做得不错,想想自己也弄一个出来,现在分享出来,当然里面还有不足的地方,请大家多多包涵。

先上图:

具体实现的代码如下:

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滚动时候调用它 
   * 
   * @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; 
        } 
      } 
    } 
  } 
  /** 
   * 当侧边栏被按下的动作 
   * @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); 
      // 判断该字符是属于字母还是数字或其他的 
      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); 
        } 
      } 
    } 
  } 
}

注意,上面的程序还是有些小问题的,请大家注意优化解决。

完整实例代码代码点击此处本站下载

希望本文所述对大家Android程序设计有所帮助。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多