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

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. 腾讯云从零搭建PHP运行环境

    一.首先我们得注册腾讯云,租用一台服务器,我选择的是CentOS 7.2 64位,这时候会给你这台主机的公网IP和内网IP,以及这台主机的用户名及密码. 二.我们可以使用腾讯云网页上自带的登录按钮进行 ...

  2. [LeetCode] 140. 单词拆分 II

    题目链接 : https://leetcode-cn.com/problems/word-break-ii/ 题目描述: 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符 ...

  3. 数塔 Medium

    Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the ...

  4. php配置伪静态如何将.htaccess文件转换 nginx伪静态文件

    php通常设置伪静态三种情况,.htaccess文件,nginx伪静态文件,Web.Config文件得形式,如何将三种伪静态应用到项目中呢, 1,.htaccess文件 实例 <IfModule ...

  5. Cocos2d-x-javaScript 的webSocket的代码

    var WebSocket = WebSocket || window.WebSocket || window.MozWebSocket; var WebSocketManager = cc.Clas ...

  6. Vue组件化和路由

    组件化 组件化是vue的核心思想,它能提高开发效率,方便重复使用,简化调试步骤,提升整个项目的可维护性,便于多人协同开发 组件通信 父组件 => 子组件: 属性props 特性$attrs 引用 ...

  7. 关于javaweb 项目 ssm框架 启动tomcat服务器同时启动一个socket服务

    1.创建监听类 import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax. ...

  8. python函数带不带括号的问题

    Python带括号返回的是该函数的返回值 不带括号返回的是该函数的位置信息等

  9. C++ GUI Qt4学习笔记09

    C++ GUI Qt4学习笔记09   qtc++ 本章介绍Qt中的拖放 拖放是一个应用程序内或者多个应用程序之间传递信息的一种直观的现代操作方式.除了剪贴板提供支持外,通常它还提供数据移动和复制的功 ...

  10. vue+elementUI 做的递归组件

    废话少说,直接上最新鲜的干货 当然,你得提前安装好bootstrap,router,element-ui,vue-axios 1.上递归组件,此处参考了某位大神的代码,具体不知道是谁,因为到处都有人用 ...