版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专业知识的优化与升级考核试卷
- 焙烤食品制造中的品牌宣传与推广效果评估考核试卷
- 焙烤食品制造的营销策略与市场调节考核试卷
- 低温仓储的冷库节能与环保技术考核试卷
- 南京信息工程大学《微机原理与单片机技术实验》2022-2023学年期末试卷
- 南京信息工程大学《水文学原理》2021-2022学年第一学期期末试卷
- 水产品行业数字化转型与智能化发展考核试卷
- 《对跆拳道后踢技术的运动学分析》
- 《各国农村合作金融体制比较研究》
- 煤炭加工装备的节能与环保技术考核试卷
- 2025版 高考试题分析-数学-部分4
- 医疗器械创新售后服务体系建设与应用示范阅读札记
- 汽油机油低速早燃性能测试方法编制说明
- 2023-2024学年山东省济南市历城区九年级(上)期中英语试卷
- 2024年全国注册消防工程师之消防技术综合能力考试历年考试题(详细参考解析)
- IWAY6.0实施计划完整
- 《慈母情深》教学设计与指导课件(第二课时)
- 法律顾问服务投标方案(完整技术标)
- 人教版八年级上册数学期中考试压轴题专练
- 中国环卫机械行业市场发展态势及发展趋势与投资战略研究报告
- 当代社会政策分析 课件 第九章 妇女社会政策
评论
0/150
提交评论