我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android怎么实现字母导航控件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android怎么实现字母导航控件

这篇文章主要介绍“Android怎么实现字母导航控件”,在日常操作中,相信很多人在Android怎么实现字母导航控件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android怎么实现字母导航控件”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

自定义完成之后能够达到的功能如下:

  • 完成列表数据与字母之间的相互联动;

  • 支持布局文件属性配置;

  • 在布局文件中能够配置相关属性,如字母颜色、字母字体大小、字母指示器颜色等属性。

自定义属性

在 value 下面创建 attr.xml ,在里面配置需要自定义的属性,具体如下:

<?xml version="1.0" encoding="utf-8"?><resources>    <declare-styleable name="LetterView">        <!--字母颜色-->        <attr name="letterTextColor" format="color" />        <!--字母字体大小-->        <attr name="letterTextSize" format="dimension" />        <!--整体背景-->        <attr name="letterTextBackgroundColor" format="color" />        <!--是否启用指示器-->        <attr name="letterEnableIndicator" format="boolean" />        <!--指示器颜色-->        <attr name="letterIndicatorColor" format="color" />    </declare-styleable></resources>

然后在相应的构造方法中获取这些属性并进行相关属性的设置,具体如下:

public LetterView(Context context, @Nullable AttributeSet attrs) {    super(context, attrs);    //获取属性    TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.LetterView);    int letterTextColor = array.getColor(R.styleable.LetterView_letterTextColor, Color.RED);    int letterTextBackgroundColor = array.getColor(R.styleable.LetterView_letterTextBackgroundColor, Color.WHITE);    int letterIndicatorColor = array.getColor(R.styleable.LetterView_letterIndicatorColor, Color.parseColor("#333333"));    float letterTextSize = array.getDimension(R.styleable.LetterView_letterTextSize, 12);    enableIndicator = array.getBoolean(R.styleable.LetterView_letterEnableIndicator, true);    //默认设置    mContext = context;    mLetterPaint = new Paint();    mLetterPaint.setTextSize(letterTextSize);    mLetterPaint.setColor(letterTextColor);    mLetterPaint.setAntiAlias(true);    mLetterIndicatorPaint = new Paint();    mLetterIndicatorPaint.setStyle(Paint.Style.FILL);    mLetterIndicatorPaint.setColor(letterIndicatorColor);    mLetterIndicatorPaint.setAntiAlias(true);    setBackgroundColor(letterTextBackgroundColor);    array.recycle();}

Measure测量

要想精确的控制自定义的尺寸以及坐标,必须要测量出当前自定义 View 的宽高,然后才可以通过测量到的尺寸计算相关坐标,具体测量过程就是继承 View 重写 omMeasure() 方法完成测量,关键代码如下:

@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    super.onMeasure(widthMeasureSpec, heightMeasureSpec);    //获取宽高的尺寸大小    int widthSize = MeasureSpec.getSize(widthMeasureSpec);    int heightSize = MeasureSpec.getSize(heightMeasureSpec);    //wrap_content默认宽高    @SuppressLint("DrawAllocation") Rect mRect = new Rect();    mLetterPaint.getTextBounds("A", 0, 1, mRect);    mWidth = mRect.width() + dpToPx(mContext, 12);    int mHeight = (mRect.height() + dpToPx(mContext, 5)) * letters.length;    if (getLayoutParams().width == ViewGroup.LayoutParams.WRAP_CONTENT &&            getLayoutParams().height == ViewGroup.LayoutParams.WRAP_CONTENT) {        setMeasuredDimension(mWidth, mHeight);    } else if (getLayoutParams().width == ViewGroup.LayoutParams.WRAP_CONTENT) {        setMeasuredDimension(mWidth, heightSize);    } else if (getLayoutParams().height == ViewGroup.LayoutParams.WRAP_CONTENT) {        setMeasuredDimension(widthSize, mHeight);    }    mWidth = getMeasuredWidth();    int averageItemHeight = getMeasuredHeight() / 28;    int mOffset = averageItemHeight / 30; //界面调整    mItemHeight = averageItemHeight + mOffset;}

坐标计算

自定义 View 实际上就是在 View 上找到合适的位置,将自定义的元素有序的绘制出来即可,绘制过程最困难的就是如何根据具体需求计算合适的左边,至于绘制都是 API 的调用,只要坐标位置计算好了,自定义 View 绘制这一块应该就没有问题了,下面的图示主要是标注了字母指示器绘制的中心位置坐标的计算以及文字绘制的起点位置计算,绘制过程中要保证文字在指示器中心位置,参考如下:

Android怎么实现字母导航控件

绘制

自定义 View 的绘制操作都是在 onDraw() 方法中进行的,这里主要使用到圆的绘制以及文字的绘制,具体就是 drawCircle() 和 drawText() 方法的使用,为避免文字被遮挡,需绘制字母指示器,然后再绘制字母,代码参考如下:

@Overrideprotected void onDraw(Canvas canvas) {    //获取字母宽高    @SuppressLint("DrawAllocation") Rect rect = new Rect();    mLetterPaint.getTextBounds("A", 0, 1, rect);    int letterWidth = rect.width();    int letterHeight = rect.height();    //绘制指示器    if (enableIndicator){        for (int i = 1; i < letters.length + 1; i++) {            if (mTouchIndex == i) {                canvas.drawCircle(0.5f * mWidth, i * mItemHeight - 0.5f * mItemHeight, 0.5f * mItemHeight, mLetterIndicatorPaint);            }        }    }    //绘制字母    for (int i = 1; i < letters.length + 1; i++) {        canvas.drawText(letters[i - 1], (mWidth - letterWidth) / 2, mItemHeight * i - 0.5f * mItemHeight + letterHeight / 2, mLetterPaint);    }}

到此为止,可以说 View 的基本绘制结束了,现在使用自定义的 View 界面能够显示出来了,只是还没有添加相关的事件操作,下面将在 View 的触摸事件里实现相关逻辑。

Touch事件处理

为了判断手指当前所在位置对应的是哪一个字母,需要获取当前触摸的坐标位置来计算字母索引,重新 onTouchEvent() 方法,监听 MotionEvent.ACTION_DOWN、MotionEvent.ACTION_MOVE 来计算索引位置,监听 MotionEvent.ACTION_UP 将获得结果回调出去,具体参考如下:

@Overridepublic boolean onTouchEvent(MotionEvent event) {    switch (event.getAction()) {        case MotionEvent.ACTION_DOWN:        case MotionEvent.ACTION_MOVE:            isTouch = true;            int y = (int) event.getY();            Log.i("onTouchEvent","--y->" + y + "-y-dp-->" + DensityUtil.px2dp(getContext(), y));            int index = y / mItemHeight;            if (index != mTouchIndex && index < 28 && index > 0) {                mTouchIndex = index;                Log.i("onTouchEvent","--mTouchIndex->" + mTouchIndex + "--position->" + mTouchIndex);            }            if (mOnLetterChangeListener != null && mTouchIndex > 0) {                mOnLetterChangeListener.onLetterListener(letters[mTouchIndex - 1]);            }            invalidate();            break;        case MotionEvent.ACTION_UP:            isTouch = false;            if (mOnLetterChangeListener != null && mTouchIndex > 0) {                mOnLetterChangeListener.onLetterDismissListener();            }            break;    }    return true;}

到此为止,View 的自定义关键部分基本完成。

数据组装

字母导航的基本思路是将某个需要与字母匹配的字段转换为对应的字母,然后按照该字段对数据进行排序,最终使得通过某个数据字段的首字母就可以批匹配到相同首字母的数据了,这里将汉字转化为拼音使用的是 pinyin4j-2.5.0.jar ,然后对数据项按照首字母进行排序将数据展示到出来即可,汉字装换为拼音如下:

//汉字转换为拼音public static String getChineseToPinyin(String chinese) {    StringBuilder builder = new StringBuilder();    HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();    format.setCaseType(HanyuPinyinCaseType.UPPERCASE);    format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);    char[] charArray = chinese.toCharArray();    for (char aCharArray : charArray) {        if (Character.isSpaceChar(aCharArray)) {            continue;        }        try {            String[] pinyinArr = PinyinHelper.toHanyuPinyinStringArray(aCharArray, format);            if (pinyinArr != null) {                builder.append(pinyinArr[0]);            } else {                builder.append(aCharArray);            }        } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {            badHanyuPinyinOutputFormatCombination.printStackTrace();            builder.append(aCharArray);        }    }    return builder.toString();}

至于数据排序使用 Comparator 接口即可

显示效果

显示效果如下:

Android怎么实现字母导航控件

到此,关于“Android怎么实现字母导航控件”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android怎么实现字母导航控件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android怎么实现字母导航控件

这篇文章主要介绍“Android怎么实现字母导航控件”,在日常操作中,相信很多人在Android怎么实现字母导航控件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android怎么实现字母导航控件”的疑惑有所
2023-06-26

Android自定义View实现字母导航栏

很多的Android入门程序猿来说对于Android自定义View,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义View上面花一些功夫,多写一些文章。思路分析:1、自定义View实现字母导航栏2、ListView实现联
2022-06-06

Android仿微信实现首字母导航条

本文介绍Android实现首字母导航条,先看张效果图,具体怎么实现看代码吧具体的步骤 1.整体布局的显示 2. 实现A-Z的分组 3. 自定义A-Z的导航条 4. 中间显示/隐藏触摸到导航条具体的字母 activity_main.xm
2022-06-06

Android自定义View实现字母导航栏的代码

思路分析: 1、自定义View实现字母导航栏 2、ListView实现联系人列表 3、字母导航栏滑动事件处理 4、字母导航栏与中间字母的联动 5、字母导航栏与ListView的联动 效果图:首先,我们先甩出主布局文件,方便后面代码的说明
2022-06-06

Android 底部导航控件实例代码

一、先给大家展示下最终效果通过以上可以看到,图一是简单的使用,图二、图三中为结合ViewPager共同使用,而且都可以随ViewPager的滑动渐变色,不同点是图二为选中非选中两张图片,图三的选中非选中是一张图片只是做了颜色变化。二、 需求
2022-06-06

Android自定义控件实现可左右滑动的导航条

先上效果图:这个控件其实算是比较轻量级的,相信不少小伙伴都能做出来。因为项目中遇到了一些特殊的定制要求,所以就自己写了一个,这里放出来。 首先来分析下这个控件的功能: 能够响应左右滑动,并且能响应快速滑动 选择项和未选择项有不同的样式表
2022-06-06

vue怎么实现导航

本文小编为大家详细介绍“vue怎么实现导航”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现导航”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。使用$route.path设置默认选中的导航,但是设置之后
2023-07-04

oracle大写字母转小写字母怎么实现

在Oracle数据库中,您可以使用LOWER()函数来将大写字母转换为小写字母。以下是一个更详细的示例:假设您有一个名为employees的表,其中包含一个名为first_name的列存储员工的名字。如果您想将first_name列中的所
oracle大写字母转小写字母怎么实现
2024-03-13

Android开发怎么快速实现底部导航栏

这篇文章主要介绍“Android开发怎么快速实现底部导航栏”,在日常操作中,相信很多人在Android开发怎么快速实现底部导航栏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android开发怎么快速实现底部
2023-06-30

Android底部导航组件BottomNavigationView怎么使用

本篇内容介绍了“Android底部导航组件BottomNavigationView怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Bo
2023-07-05

css怎么实现导航栏居中

这篇“css怎么实现导航栏居中”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“css怎么实现导航栏居中”文章吧。1.首先,在页
2023-07-04

php怎么实现数值转字母

php实现数值转字母的方法:1、创建一个php示例文件;2、定义一个numToExcelLetter方法;3、在方法体内通过“while ($num > 0 ) {$mod = (int)($num % $base);$num = (int)($num / $base);if($mod == 0){...}}”方式实现根据数字转换成excel的字母即可。
2023-05-14

php怎么实现面包屑导航

php实现面包屑导航的方法:【public function mbx($cat_id){$goods_info = D('goods')->find( I ('get.goods_id') );$row = D('cat')->f...】。
2020-02-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录