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

本文实例讲述了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
, 通讯录
, 滑动
, 侧边栏
SiderBar
siderbar、bootstrap siderbar、通讯录侧边栏、bootstrap 滑动侧边栏、jq网页侧边栏滑动效果,以便于您获取更多的相关知识。

时间: 2024-09-20 12:48:44

Android实现仿通讯录侧边栏滑动SiderBar效果代码_Android的相关文章

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

本文实例讲述了Android实现仿通讯录侧边栏滑动SiderBar效果代码.分享给大家供大家参考,具体如下: 之前看到某些应用的侧边栏做得不错,想想自己也弄一个出来,现在分享出来,当然里面还有不足的地方,请大家多多包涵. 先上图: 具体实现的代码如下: package com.freesonfish.listview_index; import android.content.Context; import android.graphics.Canvas; import android.grap

基于jQuery实现的仿百度首页滑动选项卡效果代码_jquery

本文实例讲述了基于jQuery实现的仿百度首页滑动选项卡效果代码.分享给大家供大家参考,具体如下: 今天给大家分享一款基于jQuery的仿百度首页滑动选项卡,可实现tab选项卡内容上下翻滚切换的功能.这款选项卡适用浏览器有:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗.效果图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-f-baidu-hd-nav-style-codes/ 完整实例代码代码点击

Android高仿QQ6.0侧滑删除实例代码_Android

推荐阅读: 先给大家分享一下,侧滑删除,布局也就是前面一个item,然后有两个隐藏的按钮(TextView也可以),然后我们可以向左侧滑动,然后显示出来,然后对delete(删除键)实现监听,就可以了哈.好了那就来看看代码怎么实现的吧. 首先和之前一样 自定义View,初始化ViewDragHelper: package com.example.removesidepull; import android.content.Context; import android.support.v4.wi

JS仿淘宝实现的简单滑动门效果代码_javascript技巧

本文实例讲述了JS仿淘宝实现的简单滑动门效果代码.分享给大家供大家参考.具体如下: 这是一个简单的仿淘宝滑动门效果代码,个人感觉真的挺不错,以前有过一款和这个差不多.在滑动门里你可以再次布局你的网页,可以做成一个功能超强大的导航,原示例是一个拼音索引程序,改成菜单也是可以的. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-f-taobao-simple-hdm-style-demo/ 具体代码如下: <!DOCTYPE html PUBL

Android开发仿映客送礼物效果_Android

这里写链接内容仿映客送小礼物的特效,顺便复习一下属性动画,话不多说先看效果图. 需求分析 可以看到整个动画有几部分组成,那我们就把每个部分拆分出来各个击破. 1.要显示那些内容以及内容间的位置关系? 可以看到我们要显示用户头像,昵称,礼物图标以及数量.所以这里我选择用FrameLayout来作为根布局. 2.需要哪些动画以及动画的执行顺序? a.首先是整体从左到右飞入并有一个回弹(translationX + OvershootInterpolator) b.然后是礼物从左到右飞入而且是一个带减

jquery实现仿Flash的横向滑动菜单效果代码_jquery

本文实例讲述了jquery实现仿Flash的横向滑动菜单效果代码.分享给大家供大家参考.具体如下: 这是一个仿Flash的jquery滑动菜单,横向,延时效果明显,如果觉得延时太长的话,自己可以修改参数,通过这个菜单主要是想向大家掌握一些jQuery生成动画的技巧,同时这也是jquery强大功能的体现. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-f-flash-style-move-menu-codes/ 具体代码如下: <!

Android实现仿gallery垂直滚动的效果

Android实现仿gallery垂直滚动的效果  效果图:  附件里是整个工程,如果喜欢可以下载看下.我感觉挺复杂的,如果需要的时候可以研究下,哈哈 实现垂直滚动的gallery.rar

Android仿微信页面底部导航效果代码实现_Android

大家在参考本地代码的时候要根据需要适当的修改,里面有冗余代码小编没有删除.好了,废话不多说了,一切让代码说话吧! 关键代码如下所示: .java里面的主要代码 public class MainActivity extends BaseActivity implements TabChangeListener { private Fragment[] fragments; private FragZaiXianYuYue fragZaiXianYuYue; private FragDaoLuJi

JS实现仿新浪黄色经典滑动门效果代码_javascript技巧

本文实例讲述了JS实现仿新浪黄色经典滑动门效果代码.分享给大家供大家参考.具体如下: 这是一款仿新浪网的滑动门,黄色经典,操作舒适度确实很舒服,不亏是门户哦,长度和宽度这个就要自己修改啦,布局紧凑合理,本人喜欢的风格. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-f-sina-jd-move-style-demo/ 具体代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Trans