自定义控件 - 字母索引 : LetterIndexView
实现字母列表,滑动列表显示当前选中字母,回调接口。
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的更多相关文章
- 做个简单的Android列表字母索引控件
相信大家在许多App中都见到过带字母索引的界面,比如我最近看到的这个开源控件: WaveSideBar 很酷是不是?!!!如果加在例如联系人列表界面上,大大提升了用户体验. 那么这个索引控件要怎么做呢 ...
- HBuilder+eclipse开发:使用ajax异步传值生成首字母索引
使用ajax异步传值生成首字母索引大致有以下几个步骤: 1.服务器端使用servlet提取出数据库里的数据; 2.使用首字母工具类对数据进处理得到首字母; 3.再将首字母和数据一一对应存入json数组 ...
- 简单实现UITableView索引功能(中英文首字母索引) (二) By HL
简单实现UITableView索引功能(中英文首字母索引)(一) ByH罗 相关类: NSString+PinYing(获取中英文首字母) 参考上面链接 #import "ViewCon ...
- android字母索引实现ListView定位
最近闲的很,没什么事干 ,在玩手机的时间看到android系统自带的那个通讯录软件对联系人的快速定位功能. 感觉这个功能也比较实用自己就试着自己去实现. 虽然网络上还是有大牛封闭好了的框架,但是如果 ...
- 分享一份550多个Linux命令的文档,按照命令首字母索引排序
输入一个命令,让我给你一个关于它的完美解释! 众所周知,Linux命令是IT人必须掌握的一个技能,有了它,我们可以部署和维护各种各样的服务和应用.但是,大部分的Linux命令我们不一定记得住,而别是各 ...
- 简单实现UITableView索引功能(中英文首字母索引)(一) ByH罗
UITableView索引功能是常见的,主要是获取中英文的首字母并排序,系统自带获取首字母 //系统获取首字母 - (NSString *) pinyinFirstLetter:(NSString*) ...
- 联系人的侧边字母索引ListView 将手机通讯录姓名通过首字母排序。
package com.lixu.letterlistview; import java.util.ArrayList; import java.util.List; import org.apa ...
- 微信小程序通讯录首字母索引效果,车辆品牌选择列表
效果图: wxml代码: <block wx:for="{{list}}"> <view class='letter' id="letter{{inde ...
- sqlserver 汉字转拼音 首写字母 索引 函数
create function fun_getPY(@str nvarchar(4000)) returns nvarchar(4000) as begin declare @word nchar(1 ...
随机推荐
- P-残缺的棋盘
Input 输入包含不超过10000 组数据.每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, ...
- O-超大型LED显示屏
Input 输入包含不超过100组数据.每组数据第一行为”START hh:mm:ss”,表示比赛开始时刻为hh:mm:ss.最后一行为”END hh:mm:ss”,即比赛结束时刻.二者之间至少会有一 ...
- 计算机系统结构总结_Branch prediction
Textbook:<计算机组成与设计——硬件/软件接口> HI<计算机体系结构——量化研究方法> QR Branch Prediction 对于下面的指令: ...
- 【论文解读】[目标检测]retinanet
作为单阶段网络,retinanet兼具速度和精度(精度是没问题,速度我持疑问),是非常耐用的一个检测器,现在很多单阶段检测器也是以retinanet为baseline,进行各种改进,足见retinan ...
- 第7天:Django模板使用与表单
模板的配置 作为web框架,Django提供了模板,用于编写html代码,模板的设计实现了业务逻辑view与现实内容template的解耦.模板包含两部分: 静态部分: 包含html.css.js 动 ...
- 卷积神经网络基础(CNN)【转载】
作者: Sanjay Chan [ http://blog.csdn.net/chenzomi ] 背景 之前在网上搜索了好多好多关于CNN的文章,由于网络上的文章很多断章取义或者描述不清晰,看了很多 ...
- 写了一个简单可用的IOC
根据<架构探险从零开始写javaweb框架>内容写的一个简单的 IOC 学习记录 只说明了主要的类,从上到下执行的流程,需要分清主次,无法每个类都说明,只是把整个主线流程说清楚,避免 ...
- python set 集合操作
转自:https://www.cnblogs.com/alex3714/articles/5740985.html s = set([3,5,9,10]) #创建一个数值集合 t = set(&quo ...
- C#基础知识之事件和委托
本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.委托的调用方式.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码 ...
- 【NOIP2013模拟】导弹防御塔
题目 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵...刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~" "可是入侵者 ...