iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android怎么实现字母导航控件
  • 940
分享到

Android怎么实现字母导航控件

2023-06-26 09:06:57 940人浏览 八月长安
摘要

这篇文章主要介绍“Android怎么实现字母导航控件”,在日常操作中,相信很多人在Android怎么实现字母导航控件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”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怎么实现字母导航控件”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Android怎么实现字母导航控件

本文链接: https://www.lsjlt.com/news/308781.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Android怎么实现字母导航控件
    这篇文章主要介绍“Android怎么实现字母导航控件”,在日常操作中,相信很多人在Android怎么实现字母导航控件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android怎么实现字母导航控件”的疑惑有所...
    99+
    2023-06-26
  • Android实现字母导航控件的示例代码
    目录自定义属性Measure测量坐标计算绘制Touch事件处理数据组装显示效果今天分享一个以前实现的通讯录字母导航控件,下面自定义一个类似通讯录的字母导航 View,可以知道需要自定...
    99+
    2024-04-02
  • Android中导航组件Navigation的实现原理
            对于导航组件的使用方式不是本文的重点,具体使用可以参考官方文档,导航组件框架是通过fragment来实现的,其核心类主要可以分...
    99+
    2024-04-02
  • vue怎么实现导航
    本文小编为大家详细介绍“vue怎么实现导航”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现导航”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。使用$route.path设置默认选中的导航,但是设置之后...
    99+
    2023-07-04
  • Android实现底部导航栏效果
    目前网上主流的文章都是用底部的 RadioGroup + 页面部分的 Fragment 实现导航栏切换页面效果的。 然而底部的 RadioGroup 是如此麻烦,每个按钮的图片和文字...
    99+
    2024-04-02
  • Android开发怎么快速实现底部导航栏
    这篇文章主要介绍“Android开发怎么快速实现底部导航栏”,在日常操作中,相信很多人在Android开发怎么快速实现底部导航栏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android开发怎么快速实现底部...
    99+
    2023-06-30
  • oracle大写字母转小写字母怎么实现
    在Oracle数据库中,您可以使用LOWER()函数来将大写字母转换为小写字母。以下是一个更详细的示例: 假设您有一个名为emplo...
    99+
    2024-03-13
    oracle
  • Android底部导航组件BottomNavigationView怎么使用
    本篇内容介绍了“Android底部导航组件BottomNavigationView怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Bo...
    99+
    2023-07-05
  • android实现简单底部导航栏
    本文实例为大家分享了android实现底部导航栏的具体代码,供大家参考,具体内容如下 常见的底部导航栏 动态效果 实现步骤 1.底部导航栏样式 我们应该在项目的res文件夹下新建...
    99+
    2024-04-02
  • css怎么实现横向导航和竖向导航栏
    小编给大家分享一下css怎么实现横向导航和竖向导航栏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   一、竖向导航   &...
    99+
    2024-04-02
  • Android仿微信联系人列表字母侧滑控件
    仿微信联系人列表字母侧滑控件, 侧滑控件参考了以下博客:Android实现ListView的A-Z字母排序和过滤搜索功能首先分析一下字母侧滑控件应该如何实现,根据侧滑控件的高度和字母的数量来平均计算每个字母应该占据的高度。在View的onD...
    99+
    2023-05-31
    android 侧滑控件
  • Android Fragment实现顶部、底部导航栏
    前言 无论是顶部还是底部导航栏,都是大多数APP的标配,网络上的相关实现教程也非常之多。最近回忆起以前写的小项目,发现对这块内容有些遗忘,不妨就再整理一遍代码逻辑,记录下来,方便日后...
    99+
    2024-04-02
  • Android使用RadioGroup实现底部导航栏
    RadioGroup实现底部导航栏效果,如图:: 实现可最基本的导航栏功能,不能左右滑动,只能点击内嵌的fragment的布局:<?xml version="1.0" encoding="utf-8"?>...
    99+
    2023-05-30
    radiogroup 导航栏 gr
  • css3怎么实现动画导航
    这篇文章主要介绍“css3怎么实现动画导航”,在日常操作中,相信很多人在css3怎么实现动画导航问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css3怎么实现动画导航”的疑惑...
    99+
    2024-04-02
  • Android 中ActionBar+fragment实现页面导航的实例
    Android 中ActionBar+fragment实现页面导航的实例为保证android2.0以上均能运行,使用support.v7库下的actionbar及fragment继承自AppCompatActivity(ActionBarA...
    99+
    2023-05-30
    android actionbar fragment
  • Android实现底部导航栏方法(Navigation篇)
    Navigation实现底部导航栏 前言导入和基本使用导入基础使用创建nav文件编辑Nav文件添加页面(代码版)添加页面(图解版) 创建导航动作 action创建action(代码版)...
    99+
    2023-10-10
    android
  • android进度条控件怎么实现
    Android进度条可以通过ProgressBar控件进行实现。以下是一种常用的实现方法:1. 在布局文件中添加ProgressBa...
    99+
    2023-08-30
    android
  • ANDROID BottomNavigationBar底部导航栏的实现示例
    第一种介绍的就是使用开源库,因为使用开源库最简单,也更加的符合我们的审美标准,同时BottomNavigationBar还是符合当前的Material Design标准的。效果展示依赖compile'com.ashokvarma.andro...
    99+
    2023-05-30
    android bottomnavigationbar ott
  • Android实现recyclerview城市字母索引列表
    转拼音的依赖 implementation 'com.github.SilenceDut:jpinyin:v1.0' FastIndexView实现列表右侧字母索引列表 publi...
    99+
    2024-04-02
  • css怎么实现动态导航栏
    本篇内容介绍了“css怎么实现动态导航栏 ”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!方案:使用chec...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作