android 字母索引三方,Android字母索引列表

1. 概述

画笔Paint基本熟悉了之后,我们循序渐进介绍一个新的方面onTouch(),用于处理手指触摸交互的,这是很早期的一个效果,但是用来学习真的很不错:

4913c2e35b39

Android字母列表索引效果

我们的重点是实现右边的字母索引效果,至于读取本地数据库的城市数据,做一些拼音排序什么的,这个就不写了当然源码我已经写好了。

2. 效果实现分析

右边的 [ A - Z ] 用 ListView 去实现可以吗?应该是可以的,我好像在网上有看到这么实现过,我这里打算采用自定义 View,因为我认为这样处理起来方便简单很多。

这个效果我们在绝大部分项目中肯定都遇到过,就是手指在右边触摸的时候,触摸的位置字母会高亮,中间会显示你触摸的字母,列表会根据你触摸的字母自动滚动到对应位置。实现这么个效果分为三个步骤就好:

2.1: 字母 [ A - # ] 用 Paint 画笔画出来

2.2: onTouch() 高亮用户触摸的字母

2.3: 设置回调监听,显示触摸的字母和滚动列表位置

至于什么 onMeasure , onDraw , 自定义属性等等我这里就不去介绍了,具体请看这里:自定义View简介 - onMeasure , onDraw , 自定义属性

2.1. 字母 [ A - # ] 用 Paint 画笔画出来

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

// 每个字母所占用的高度

float singleHeight = (float) mViewHeight / mLetters.length;

// 不断循环把绘制字母

for (int i = 0; i < mLetters.length; i++) {

String letter = mLetters[i];

// 获取字体的宽度

float measureTextWidth = mDefaultPaint.measureText(letter);

// 获取内容的宽度

int contentWidth = getWidth() - getPaddingLeft() - getPaddingRight();

float x = getPaddingLeft() + (contentWidth - measureTextWidth) / 2;

// 计算基线位置

Paint.FontMetrics fontMetrics = mDefaultPaint.getFontMetrics();

float baseLine = singleHeight / 2 + (singleHeight * i) + (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;

// 画字母,后面onTouch的时候需要处理高亮

canvas.drawText(letter, x, baseLine, mDefaultPaint);

}

}

2.2:onTouch() 高亮用户触摸的字母

@Override

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

case MotionEvent.ACTION_MOVE:

// 获取当前手指触摸的Y位置

float fingerY = event.getY();

float singleHeight = (float) mViewHeight / mLetters.length;

// 根据当前触摸的位置计算出,当前字母的位置

int position = (int) (fingerY / singleHeight);

// 如果和上个位置一样可以不处理

if (mLetters[position].equals(mCurrentTouchLetter)) {

return true;

}

// 记录当前触摸的位置

mCurrentTouchLetter = mLetters[position];

break;

}

// 重新绘制调用onDraw()方法

invalidate();

// 后面再去看事件分发的源码,先不要关注

return true;

}

onTouchEvent()方法我返回的是return true,那么返回return super.onTouchEvent(event)就没有效果了,这是为什么?

2.3:设置回调监听,显示触摸的字母和滚动列表位置

@Override

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

case MotionEvent.ACTION_MOVE:

// 省略上面的一些代码...

// 处理回调监听

mCurrentIsTouch = true;

if (mTouchListener != null) {

mTouchListener.onTouch(mCurrentTouchLetter, mCurrentIsTouch);

}

// 记录当前触摸的位置

mCurrentTouchLetter = mLetters[position];

break;

case MotionEvent.ACTION_UP:

// 处理回调监听

mCurrentIsTouch = false;

if (mTouchListener != null) {

mTouchListener.onTouch(mCurrentTouchLetter, mCurrentIsTouch);

}

break;

}

// 重新绘制调用onDraw()方法

invalidate();

// 后面再去看事件分发的源码,先不要关注

return true;

}

// 设置触摸监听

private SideBarTouchListener mTouchListener;

public void setOnSideBarTouchListener(SideBarTouchListener touchListener) {

this.mTouchListener = touchListener;

}

public interface SideBarTouchListener {

void onTouch(String letter, boolean isTouch);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值