




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android如何实现带字母索引的侧边栏功能
这篇文章主要介绍了Android如何实现带字母索引的侧边栏功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让在下带着大家一起了解一下。之前已经用自定义View做出如下这样一个效果了这两天需要重新拿来使用,发现效果虽然做出来了,不过思路不太对,就重新参考写了一个,用法也更为简单了首要的自然是需要继承View绘制出侧边栏,并向外提供一个监听字母索引变化的方法/**
*
作者:叶应是叶
*
时间:2017/8/20
11:38
*
描述:
*/
public
class
LetterIndexView
extends
View
{
public
interface
OnTouchingLetterChangedListener
{
void
onHit(String
letter);
void
onCancel();
}
private
OnTouchingLetterChangedListener
touchingLetterChangedListener;
private
Paint
paint;
private
boolean
hit;
private
final
String[]
letters
=
{"↑",
"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
final
int
DEFAULT_WIDTH;
public
LetterIndexView(Context
context)
{
this(context,
null);
}
public
LetterIndexView(Context
context,
@Nullable
AttributeSet
attrs)
{
this(context,
attrs,
0);
}
public
LetterIndexView(Context
context,
@Nullable
AttributeSet
attrs,
int
defStyleAttr)
{
super(context,
attrs,
defStyleAttr);
paint
=
new
Paint();
paint.setAntiAlias(true);
paint.setTextAlign(Paint.Align.CENTER);
paint.setColor(Color.parseColor("#565656"));
DEFAULT_WIDTH
=
dpToPx(context,
24);
}
@Override
protected
void
onMeasure(int
widthMeasureSpec,
int
heightMeasureSpec)
{
setMeasuredDimension(getWidthSize(widthMeasureSpec),
getDefaultSize(getSuggestedMinimumHeight(),
heightMeasureSpec));
}
private
int
getWidthSize(int
widthMeasureSpec)
{
int
widthMode
=
MeasureSpec.getMode(widthMeasureSpec);
int
widthSize
=
MeasureSpec.getSize(widthMeasureSpec);
switch
(widthMode)
{
case
MeasureSpec.AT_MOST:
{
if
(widthSize
>=
DEFAULT_WIDTH)
{
return
DEFAULT_WIDTH;
}
else
{
return
widthSize;
}
}
case
MeasureSpec.EXACTLY:
{
return
widthSize;
}
case
MeasureSpec.UNSPECIFIED:
default:
return
DEFAULT_WIDTH;
}
}
@Override
public
boolean
dispatchTouchEvent(MotionEvent
event)
{
switch
(event.getAction())
{
case
MotionEvent.ACTION_DOWN:
hit
=
true;
onHit(event.getY());
break;
case
MotionEvent.ACTION_MOVE:
onHit(event.getY());
break;
case
MotionEvent.ACTION_UP:
case
MotionEvent.ACTION_CANCEL:
hit
=
false;
if
(touchingLetterChangedListener
!=
null)
{
touchingLetterChangedListener.onCancel();
}
break;
}
invalidate();
return
true;
}
@Override
protected
void
onDraw(Canvas
canvas)
{
if
(hit)
{
//字母索引条背景色
canvas.drawColor(Color.parseColor("#bababa"));
}
float
letterHeight
=
((float)
getHeight())
/
letters.length;
float
width
=
getWidth();
float
textSize
=
letterHeight
*
5
/
7;
paint.setTextSize(textSize);
for
(int
i
=
0;
i
<
letters.length;
i++)
{
canvas.drawText(letters[i],
width
/
2,
letterHeight
*
i
+
textSize,
paint);
}
}
private
void
onHit(float
offset)
{
if
(hit
&&
touchingLetterChangedListener
!=
null)
{
int
index
=
(int)
(offset
/
getHeight()
*
letters.length);
index
=
Math.max(index,
0);
index
=
Math.min(index,
letters.length
-
1);
touchingLetterChangedListener.onHit(letters[index]);
}
}
public
void
setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener
onTouchingLetterChangedListener)
{
this.touchingLetterChangedListener
=
onTouchingLetterChangedListener;
}
private
int
dpToPx(Context
context,
float
dpValue)
{
float
scale
=
context.getResources().getDisplayMetrics().density;
return
(int)
(dpValue
*
scale
+
0.5f);
}
}在侧边栏时,中间会显示当前滑动指向的字母,这其实是一个TextView,在主布局文件中添加,通过IndexControl来控制TextView的可见性,并指示ListView滑动到指定项/**
*
作者:叶应是叶
*
时间:2017/8/20
11:39
*
描述:
*/
public
class
IndexControl
{
private
final
ListView
listView;
private
final
TextView
tv_hint;
private
final
Map<String,
Integer>
letterMap;
public
IndexControl(ListView
contactsListView,
LetterIndexView
letterIndexView,
TextView
tv_hint,
Map<String,
Integer>
letterMap)
{
this.listView
=
contactsListView;
this.tv_hint
=
tv_hint;
this.letterMap
=
letterMap;
letterIndexView.setOnTouchingLetterChangedListener(new
LetterChangedListener());
}
private
class
LetterChangedListener
implements
LetterIndexView.OnTouchingLetterChangedListener
{
@Override
public
void
onHit(String
letter)
{
tv_hint.setVisibility(View.VISIBLE);
tv_hint.setText(letter);
int
index
=
-1;
if
("↑".equals(letter))
{
index
=
0;
}
else
if
(letterMap.containsKey(letter))
{
index
=
letterMap.get(letter);
}
if
(index
<
0)
{
return;
}
index
+=
listView.getHeaderViewsCount();
if
(index
>=
0
&&
index
<
listV
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 金融产品经理岗位面试问题及答案
- 阀门技术员岗位面试问题及答案
- 2025届江西省宜春市宜丰县二中物理高二下期末考试试题含解析
- 2025届四川省眉山一中高二物理第二学期期末联考试题含解析
- 公司平安夜活动礼物方案
- 恶意软件自动化检测-洞察及研究
- 光盘行动节约粮食发言稿
- 混合动力经济性分析-洞察及研究
- 作息时间调整通知范文
- 核废料处置合作-洞察及研究
- 严重药物不良反应诊断与处理
- 直流屏原理-课件
- 加药设备安装 检验批施工质量验收表
- 岗位技能评定机考考场规则
- 尽职调查所用相关表格(全)
- 三基-学校儿童少年卫生学(200题)练习
- 老年康养服务中心项目可行性研究报告写作参考范文
- 生物质中纤维素、半纤维素和木质素含量的测定
- 枸杞采摘合同
- 涡流探伤仪设计方案
- 张家界船舶工业项目建议书【模板范本】
评论
0/150
提交评论