Android 自定义View-字母索引表(一)
在有些Android应用中,为了方便快速定位,经常会看到屏幕右侧有一个字母索引表,今天尝试使用自定义View的方式实现了索引表的基本布局。
字母索引表的样式如下面的示意图所示,

此时我们至少需要知道以下几个参数值:1.字母大小;2.单个字母所在区域的宽度;3.单个字母所在区域的高度。现在看如何实现:
/**
* 26个英文字母以及一个#字符,#字符是为了索引非英文字母的内容,比如电话号码。
*/
private String[] mAlphabetTable = {
"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 mAlphabetSize = 0;
/**
* 字母表的宽度
*/
private int mWidth = 0;
/**
* 字母表的高度
*/
private int mHeight = 0;
/**
* 窗口高度
*/
private int mDisplayHeight;
/**
* 单个字母所在区域的高度
*/
private int mStepPixel; private int mFastScrollViewHeight = 0;
private Rect[] mAlphabetRect = new Rect[27];
private Rect mPointRectAll = new Rect();
private static int mAlphabetLeftPadding = 0;
private boolean[] mPoint = new boolean[27]; public AlphabetFastScorll(Context context) {
this(context, null);
} public AlphabetFastScorll(Context context, AttributeSet attrs) {
super(context, attrs);
this.setAlpha(1.0f);//设置透明度1
DisplayMetrics metric = new DisplayMetrics();
((WindowManager) getContext().getSystemService(getContext().WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metric);
mDisplayHeight = metric.heightPixels;//获取窗口高度
}
在构造函数里,只设置了索引表的透明度和初始化mDisplayHeight参数。索引表的绘制工作大部分是在onDraw()里完成。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mStepPixel = getContext().getResources().getDimensionPixelOffset(R.dimen.fast_scroll_size);
mFastScrollViewHeight = mStepPixel * 27;
//初始化27个字母每个字母对应所在区域的大小范围
InitAlphabetRect(); //初始化字母索引表的背景大小
initPointRect(mFastScrollViewHeight, mStepPixel); //设置背景颜色
Paint paintB = new Paint();
paintB.setColor(ContextCompat.getColor(getContext(), R.color.colorAccent));
//paintB.setAlpha(0);
canvas.drawRect(mPointRectAll, paintB);
//设置字母中大小,颜色,位置等
Paint paint = new Paint();
float textSize = getContext().getResources().getDimensionPixelOffset(R.dimen.asus_index_size);
paint.setColor(ContextCompat.getColor(getContext(), R.color.fast_scroll_text_color));
paint.setTextAlign(Align.CENTER);
paint.setTextSize(textSize);
paint.setAntiAlias(true); for (int i = 0; i < mAlphabetRect.length; i++) {
int x = (mAlphabetRect[i].left + mAlphabetRect[i].right) / 2;
int y = mAlphabetRect[i].bottom; y = y - (int) (0.5 * (mStepPixel - textSize));
//字母绘制在mAlphabetRect[i]区域中间
canvas.drawText(mAlphabetTable[i], x, y, paint);
}
} private void InitAlphabetRect() {
for (int i = 0; i < mAlphabetRect.length; i++) {
mAlphabetRect[i] = new Rect();
mAlphabetRect[i].left = mAlphabetLeftPadding;
mAlphabetRect[i].right = mAlphabetLeftPadding + this.getWidth();
//Log.d(TAG,"InitAlphabetRect right = " + mAlphabetRect[i].right);
if (i == 0) {
mAlphabetRect[i].top = 0;
mAlphabetRect[i].bottom = mStepPixel;
} else {
mAlphabetRect[i].top = mAlphabetRect[i-1].top + mStepPixel;
mAlphabetRect[i].bottom = mAlphabetRect[i].top + mStepPixel;
}
}
} private void initPointRect(int fastScrollViewHeight, int stepPixel) {
int canvasWidth = getContext().getResources().getDimensionPixelOffset(R.dimen.asus_index_canvas_width); mPointRectAll = new Rect();
mPointRectAll.left = 0;
mPointRectAll.right = canvasWidth;
mPointRectAll.top = 0;
mPointRectAll.bottom = this.getHeight();
}
在onDraw()里做了以下几件事情:
1,初始化索引表字母所在区域的范围:新建一个Rect对象,设置其左右和上下大小。宽度大小由布局文件中提供,高度为mStepPixel。
2,初始化索引表背景范围:宽 = asus_index_canvas_width,高 = this.getHeight();
3,已经知道每个字母所在区域范围以及索引背景范围,新建两个Paint在Canves上进行绘制;
通过以上几步就可以简单实现索引表控件,光光显示一个索引表肯定没啥意义。一般都是将索引表与ListView组合,实现快速定位功能。下篇准备模仿联系人应用,实现通过索引表快速定位到联系人。
Android 自定义View-字母索引表(一)的更多相关文章
- 转载:android自定义view实战(温度控制表)!
效果图 package cn.ljuns.temperature.view; import com.example.mvp.R; import android.content.Context;impo ...
- Android为TV端助力 转载:android自定义view实战(温度控制表)!
效果图 package cn.ljuns.temperature.view; import com.example.mvp.R; import android.content.Context;impo ...
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
我们的手机通讯录一般都有这样的效果,如下图: OK,这种效果大家都见得多了,基本上所有的android手机通讯录都有这样的效果.那我们今天就来看看这个效果该怎么实现. 一.概述 1.页面功能分析 整体 ...
- Android自定义View之ProgressBar出场记
关于自定义View,我们前面已经有三篇文章在介绍了,如果筒子们还没阅读,建议先看一下,分别是android自定义View之钟表诞生记.android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检 ...
- android自定义View之NotePad出鞘记
现在我们的手机上基本都会有一个记事本,用起来倒也还算方便,记事本这种东东,如果我想要自己实现,该怎么做呢?今天我们就通过自定义View的方式来自定义一个记事本.OK,废话不多说,先来看看效果图. 整个 ...
- Android自定义View(CustomCalendar-定制日历控件)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/54020386 本文出自:[openXu的博客] 目录: 1分析 2自定义属性 3onMeas ...
- Android自定义View(三、深入解析控件测量onMeasure)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51490283 本文出自:[openXu的博客] 目录: onMeasure什么时候会被调用 ...
- Android自定义View(二、深入解析自定义属性)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51468648 本文出自:[openXu的博客] 目录: 为什么要自定义属性 怎样自定义属性 ...
- 简单说说Android自定义view学习推荐的方式
这几天比较受关注,挺开心的,嘿嘿. 这里给大家总结一下学习自定义view的一些技巧. 以后写自定义view可能不会写博客了,但是可以开源的我会把源码丢到github上我的地址:https://git ...
随机推荐
- org.apache.ibatis.builder.IncompleteElementException: Could not find parameter map com.hyzn.historicalRecord.dao.ITB_HISTORYLOGDAO.TB_HISTORYLOGResultMap
用了很久的myBatis,忽然出现这个错误,感觉配置什么的都是正确的,错误如下: org.apache.ibatis.builder.IncompleteElementException: Could ...
- ios UIButton得 几种触发方式
在控件事件中,简单解释下下面几个事件.说明:由于是在“iOS 模拟器”中测试的,所以不能用手指,只能用鼠标.1)UIControlEventTouchDown指鼠标左键按下(注:只是“按下”)的动作2 ...
- cocos2dx游戏--欢欢英雄传说--为敌人添加移动和攻击动作
这里主要为敌人添加了一个移动动作和攻击动作.移动动作是很简略的我动他也动的方式.攻击动作是很简单的我打他也打的方式.效果:代码: #ifndef __Progress__ #define __Prog ...
- Android 监听按钮的点击事件
onClick事件1.Button和ImageButton都拥有一个onClick事件 通过自身的.setOnClickListener(OnClickListener)方法添加点击事件2.所有的控件 ...
- 如何打开或关闭windows的测试模式
百度经验:jingyan.baidu.com windows的测试模式就如同字面意思一样,是一个测试用的模式.这个模式的标志主要在有非官方驱动或系统关键文件运行时显示.例如安装了大内存补丁(32位系统 ...
- 原生JS,实现图片可拖拽,并且移动四个角和四条变能够自由变换图片大小
网上搜的资料,源码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- MUI ajax数据请求(list)
服务器返回格式 { "code": "1001", "message": "查询成功", "data" ...
- bzoj 3307 雨天的尾巴
题目链接:传送门 题目大意:中文题,略 题目思路:网上有题解说是合并线段树的,但是太难蒟蒻不会,只能用树剖求解 如果不是树而是一维数组我们会怎么解? 当然是利用前缀和思想标记 (L) v+1,(R+1 ...
- WEB安全第七篇--终结篇考验逻辑思维:逻辑漏洞大汇总(越权、会话逻辑、业务逻辑、暴力破解)
零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...
- TDD中的单元测试写多少才够?
测试驱动开发(TDD)已经是耳熟能详的名词,既然是测试驱动,那么测试用例代码就要写在开发代码的前面.但是如何写测试用例?写多少测试用例才够?我想大家在实际的操作过程都会产生这样的疑问. 3月15日,我 ...