Android实现仿通讯录侧边栏滑动SiderBar效果代码
作者:freesonhp 发布时间:2021-08-03 21:07:45
标签: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程序设计有所帮助。
0
投稿
猜你喜欢
- 一 介绍本节给知识追寻者给大家带来的是springSecurity入门篇,主要是简述下springSecrurity的启动原理和简单的入门搭
- 简介机器学习在全球范围内越来越受欢迎和使用。 它已经彻底改变了某些应用程序的构建方式,并且可能会继续成为我们日常生活中一个巨大的(并且正在增
- pom.xml配置<dependency> <groupId>org.springframework.
- Java io简介Java io系统的设计初衷,就是为了实现“文件、控制台、网络设备”这些io设置的通信。例如,对于一个文件,我们可以打开文
- spring 容器的创建对应 SpringApplication 中 run 中调用的 createApplicationContext 方
- 在本文中,笔者向大家介绍下Java中一个非常重要也非常有趣的特性,就是自动装箱与拆箱,并从源码中解读自动装箱与拆箱的原理,同时这种特性也留有
- 本文实例为大家分享了java实现递归菜单树的具体代码,供大家参考,具体内容如下1.表结构SET FOREIGN_KEY_CHECKS=0;-
- java实现读取、删除文件夹下的文件package test.com;import java.io.File;import java.io.
- 本文主要是用到java中的swing技术,以及JMFjar中的API,为大家分享了java音乐播放器的具体实现代码,供大家参考,具体内容如下
- 在早期的Java版本中,如果需要对指定目录下的文件进行遍历,则需要用递归的方法来实现,这种方法有点复杂,而且灵活性也不高。而使用Java7中
- 一、什么是 javabean ?在jsp页面中,包含html代码、css代码、java代码、以及业务逻辑处理代码等。javabean的作用就
- 本文实例为大家分享了Java swing 仿QQ账号密码输入框,供大家参考,具体内容如下主要思路是自己定义 AccountPanel 和 P
- 确保这个修改是正确的(否则将会出现乱码)创建i18n文件夹(就是国际化的意思),然后在此文件加下创login.properties logi
- 1、结合字节码指令理解Java虚拟机栈和栈帧栈帧:每个栈帧对应一个被调用的方法,可以理解为一个方法的运行空间。每个栈帧中包括局部变量表(Lo
- mybatis-plus-generator + clickhouse 自动生成代码依赖<!--> mybatis-plus &
- 一般的接口实现多态定义接口 interface Ipeople { void say(); }定义实现的类 public cla
- 前言前段时间看到一道面试题:“main函数可以被重载么?”,当时就蒙圈了,怎么还会有这种面试题,现在
- 一,准备沙箱环境1,登录支付宝,进入 应用列表界面 https://openhome.alipay.com/dev/workspace2,如
- 插入排序插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入
- HttpResponse 讲解HttpServletResponse概述:在创建Servlet时会覆盖service()方法,或doGet(