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

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • Android手机联系人快速索引(手机通讯录)

    最近需要实现一个手机通讯录的快速索引功能.根据姓名首字母快速索引功能.下面是一个手机联系人快速索引的效果,总体来说代码不算难,拼音转换的地方略有复杂.下面上源码:源码中有注释. 下面是效果图: MainActivity: import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.app.Activity; import android.os.Bundle; imp

  • 使用adb命令向Android模拟器中导入通讯录联系人的方法

    本文实例讲述了使用adb命令向Android模拟器中导入通讯录联系人的方法.分享给大家供大家参考.具体实现方法如下: 使用adb提供的命令, 可以非常方便地从PC中将通讯录导入android模拟器中. 首先要先准备好固定格式的contacts.vcf文件, 该文件即android中的通讯录存储文件. 格式如下: 复制代码 代码如下: BEGIN:VCARD  VERSION:3.0  N:15200000000;;;;  TEL;TYPE=cell:15200000000  END:VCARD 

  • Android保存联系人到通讯录的方法

    上一篇文章讲了如何获取所有联系人,这篇文章就讲下怎么保存联系人数据到本机通讯录.这里我就假设你已经拿到了要保存的联系人数据. 因为是一个工具类,所以我这里就只给一个方法了,也是很简单,但是写的没有读取联系人的数据那么多,要保存更多其实看下如何读取的就会了. 直接上源码: /** * 添加联系人到本机 * * @param context * @param contact * @return */ public static boolean addContact(Context context,

  • Android编程操作手机通讯录的方法示例

    本文实例讲述了Android编程操作手机通讯录的方法.分享给大家供大家参考,具体如下: 手机通讯录的操作是经常被用到的,例如添加联系人,删除联系人或者取得联系人信息.类似的操作还有收藏夹的操作,下面就针对通讯录的操作来做个小例子.同样的这次也会使用到内容提供者的知识. 1. 要操作通信录就要得到授权,也就是读或者写通讯录的权力.这里也需要使用Junit <?xml version="1.0" encoding="utf-8"?> <manifest

  • Android自定义View实现通讯录字母索引(仿微信通讯录)

    一.效果:我们看到很多软件的通讯录在右侧都有一个字母索引功能,像微信,小米通讯录,QQ,还有美团选择地区等等.这里我截了一张美团选择城市的图片来看看: 我们今天就来实现图片中右侧模块的索引功能,包括触摸显示以选中的索引字母.这里我的UI界面主要是参照微信的界面来实现,所以各位也可以对照微信来看看效果,什么都不说了,只有效果图最具有说服力! 二.分析: 我们看到这样的效果我们心理都回去琢磨,他是如何实现的: 首先,它肯定是通过自定义 View 来实现的,因为 Android 没有提供类似这样的控件

  • Android获取手机通讯录、sim卡联系人及调用拨号界面方法

    android获取手机通讯录联系人信息 复制代码 代码如下: private void getPhoneContacts() {        ContentResolver resolver = this.getContentResolver();                // 获取手机联系人       Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,                  new String[] { Phone

  • Android通讯录开发之删除功能的实现方法

    无论是Android开发或者是其他移动平台的开发,ListView肯定是一个大咖,那么对ListView的操作肯定是不会少的,上一篇博客介绍了如何实现全选和反选的功能,本篇博客介绍删除功能,删除列表中的项无谓就是及时刷新列表,这又跟UI线程扯上关系了,还是那句话,数据的更新通知一定要在UI线程上做,不然会出现各种错误,比如出现adapter数据源改变,但没有及时收到通知的情况.在执行遍历删除的时候,最好不要每删一个就直接通知,下面是我的实现方法,将需要删除的contact保存到一个List然后通

  • Android开发之自定义view实现通讯录列表A~Z字母提示效果【附demo源码下载】

    本文实例讲述了Android开发之自定义view实现通讯录列表A~Z字母提示效果.分享给大家供大家参考,具体如下: 开发工具:eclipse 运行环境:htc G9 android2.3.3 话不多说,先看效果图 其实左右边的A~Z是一个自定义的View,它直接覆盖在ListView上. MyLetterListView: public class MyLetterListView extends View { OnTouchingLetterChangedListener onTouching

  • Android跳转到通讯录获取用户名称和手机号码的实现思路

    效果图如下所示: 先给大家说下实现android 跳转到通讯录的实现思路: 1.点击跳转到通讯录界面 2.获取通讯录姓名和手机号码 3.回调显示姓名和手机号码 1首先是跳转到通讯录界面 Uri uri = Uri.parse("content://contacts/people"); Intent intent = new Intent(Intent.ACTION_PICK, uri); startActivityForResult(intent, 0); 通过设置通讯录url跳转,可

  • Android编程实现通讯录中联系人的读取,查询,添加功能示例

    本文实例讲述了Android编程实现通讯录中联系人的读取,查询,添加功能.分享给大家供大家参考,具体如下: 先加二个读和写权限: <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> 具体代码: package com.ebo

  • Android实现通讯录效果——获取手机号码和姓名

    首先给大家展示下运行效果图: 由于通讯录在手机里是以数据库贮存的 所以我们可以通过一个方法 context.getContentResolver().query(Phone.CONTENT_URI, null, null, null, null); 来获得通讯录 ,这个方法返回一个游标的数据类型,通过moveToNext()方法来获取所有的手机号码信息 当然读取手机通讯录需要权限 在adnroidManifest文件中声明即可 由于我也实现了打电话的功能 所以也要声明权限 <uses-permi

随机推荐