实现字母列表,滑动列表显示当前选中字母,回调接口。

1.实现字母列表。初始化相关属性。计算每个字母所占宽高。绘制字母A-Z,#。

    private int itemWidth;//每个字母所占宽度
private int itemHeight;//每个字母所占高度
private Paint mPaint;//画笔
private int selectIndex = -1;//选中索引
private String[] letters = new String[]{"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 int letterColor;//字母颜色
private int selectLetterColor;//选中字母颜色
private int selectBgColor;//选中背景颜色 private OnLetterChangedListener mLetterChangedListener;// 触摸字母改变事件 public LetterIndexView(Context context) {
this(context, null);
} public LetterIndexView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} //初始化文字颜色属性,画笔
public LetterIndexView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.LetterIndexView, 0, 0);
letterColor = typedArray.getColor(R.styleable.LetterIndexView_letterColor, 0);
selectLetterColor = typedArray.getColor(R.styleable.LetterIndexView_selectLetterColor, 0);
selectBgColor = typedArray.getColor(R.styleable.LetterIndexView_selectBackgroundColor, 0);
typedArray.recycle();
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setTextSize(30);
mPaint.setAntiAlias(true);
} //获取item宽高
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
itemWidth = getMeasuredWidth();
itemHeight = getMeasuredHeight() / letters.length;
} //绘制字母列表
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//字母坐标从文字左下角开始
for (int i = 0; i < letters.length; i++) {
if (i == selectIndex) {
mPaint.setColor(selectLetterColor);
} else {
mPaint.setColor(letterColor);
}
//获取x坐标 (行宽-字母宽度)除以 2
float x = (itemWidth - mPaint.measureText(letters[i])) / 2;
Rect rect = new Rect();
mPaint.getTextBounds(letters[i], 0, letters[i].length(), rect);
int textHeight = rect.height();
//获取y坐标 (行高+字母高度)除以 2 + 行高*i
float y = (itemHeight + textHeight) / 2 + itemHeight * i;
canvas.drawText(letters[i], x, y, mPaint);
}
if (selectIndex == -1) {
setBackgroundColor(0);
} else {
setBackgroundColor(selectBgColor);
}
}

2 滑动列表,处理ontouchevent事件,改变选中字母颜色。

/**
* 当手指触摸按下的时候改变字母背景颜色
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
float downY = event.getY();
int index = (int) (downY / itemHeight);//获取按下点的索引
if (index != selectIndex)
selectIndex = index;
//防止数组越界
if (mLetterChangedListener != null && selectIndex > -1 && selectIndex < letters.length)
mLetterChangedListener.onChanged(letters[selectIndex], selectIndex);
break;
case MotionEvent.ACTION_UP:
selectIndex = -1;
break;
}
invalidate();
return true;
}

3 触摸回调接口

    //触摸选中字母回调接口
public interface OnLetterChangedListener {
void onChanged(String s, int position);
} public void setOnLetterChangedListener(OnLetterChangedListener letterChangedListener) {
mLetterChangedListener = letterChangedListener;
}

几个关键的API:

typearray:获取属性

paint:画笔

canvas:画布,canvas.drawText(“text”,x,y,paint);

获取文本宽度:paint.measureText()

获取文本高度:Rect rect;paint.getTextBounds(rect);rect.height();

获取按下点的字母索引 int index =  (int) event.getY() / itemHeight  ;

重绘:invalidate();

自定义控件 - 字母索引 : LetterIndexView的更多相关文章

  1. 做个简单的Android列表字母索引控件

    相信大家在许多App中都见到过带字母索引的界面,比如我最近看到的这个开源控件: WaveSideBar 很酷是不是?!!!如果加在例如联系人列表界面上,大大提升了用户体验. 那么这个索引控件要怎么做呢 ...

  2. HBuilder+eclipse开发:使用ajax异步传值生成首字母索引

    使用ajax异步传值生成首字母索引大致有以下几个步骤: 1.服务器端使用servlet提取出数据库里的数据; 2.使用首字母工具类对数据进处理得到首字母; 3.再将首字母和数据一一对应存入json数组 ...

  3. 简单实现UITableView索引功能(中英文首字母索引) (二) By HL

    简单实现UITableView索引功能(中英文首字母索引)(一) ByH罗 相关类: NSString+PinYing(获取中英文首字母)   参考上面链接 #import "ViewCon ...

  4. android字母索引实现ListView定位

    最近闲的很,没什么事干 ,在玩手机的时间看到android系统自带的那个通讯录软件对联系人的快速定位功能.  感觉这个功能也比较实用自己就试着自己去实现. 虽然网络上还是有大牛封闭好了的框架,但是如果 ...

  5. 分享一份550多个Linux命令的文档,按照命令首字母索引排序

    输入一个命令,让我给你一个关于它的完美解释! 众所周知,Linux命令是IT人必须掌握的一个技能,有了它,我们可以部署和维护各种各样的服务和应用.但是,大部分的Linux命令我们不一定记得住,而别是各 ...

  6. 简单实现UITableView索引功能(中英文首字母索引)(一) ByH罗

    UITableView索引功能是常见的,主要是获取中英文的首字母并排序,系统自带获取首字母 //系统获取首字母 - (NSString *) pinyinFirstLetter:(NSString*) ...

  7. 联系人的侧边字母索引ListView 将手机通讯录姓名通过首字母排序。

      package com.lixu.letterlistview; import java.util.ArrayList; import java.util.List; import org.apa ...

  8. 微信小程序通讯录首字母索引效果,车辆品牌选择列表

    效果图: wxml代码: <block wx:for="{{list}}"> <view class='letter' id="letter{{inde ...

  9. sqlserver 汉字转拼音 首写字母 索引 函数

    create function fun_getPY(@str nvarchar(4000)) returns nvarchar(4000) as begin declare @word nchar(1 ...

随机推荐

  1. Kotlin学习(4)Lambda

    Lanbda基础 /* *Lambda允许把代码块当作参数传递给函数 */ fun a(plus:(Int,Int)->Unit){ plus(,) //声明函数的地方,调用代码块,在这里传参 ...

  2. linux:shell脚本格式

    shell脚本格式:     #!/bin/bash //第一行指定bash     命令群.....          例子:     #!/bin/bash     DESCDIR='/tmp/t ...

  3. 【学习总结】快速上手Linux玩转典型应用-第6章-linux常用命令讲解

    课程目录链接 快速上手Linux玩转典型应用-目录 目录 1. 软件操作命令 2. 服务器硬件资源信息 3. 文件操作命令 4. Linux文本编辑神器vim与其他常用命令 5. 系统用户操作命令 6 ...

  4. /etc/nscd.conf - 域名服务缓存守护进程配置文件

    描述 DESCRIPTION 该文件 /etc/nscd.conf 在启动 nscd(8) 时读入.每一行或者指定一个属性和值,或者指定一个属性.服务和一个值.域之间通过空格或者TAB分开.‘#’表示 ...

  5. fastadmin 搭建到云虚拟主机

    1.把public下的index.php.router.php.install.php.admin_*******.php..htaccess(伪静态文件),移到  文件夹:/htdocs   根目录 ...

  6. PAT Advanced 1011 World Cup Betting (20 分)

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  7. PAT Basic 1010 一元多项式求导 (25 分)(活用stringstream,昨天学习的)

    设计函数求一元多项式的导数.(注:x​n​​(n为整数)的一阶导数为nx​n−1​​.) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数).数字间以空格分隔. ...

  8. 完整的node脚手架搭建服务

    使用脚手架来搭建node服务,使用到了express架构,不熟悉的可以看下express官方文档:http://www.expressjs.com.cn/ 使用express直接生成服务的文档结构目录 ...

  9. JS比较两个时间的时间差

    /** * 比较两个时间的时间差 * @param startTime 开始时间 * @param endTime 结束时间 * @demo compareTime(new Date('2019-12 ...

  10. Insomni'hack teaser 2019 - Reverse - beginner_reverse

    参考链接 https://ctftime.org/task/7455 题目描述 A babyrust to become a hardcore reverser 点我下载 解题过程 一道用rust写的 ...