返回顶部
首页 > 资讯 > 精选 >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://lsjlt.com/news/308781.html(转载时请注明来源链接)

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

猜你喜欢
  • Android怎么实现字母导航控件
    这篇文章主要介绍“Android怎么实现字母导航控件”,在日常操作中,相信很多人在Android怎么实现字母导航控件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android怎么实现字母导航控件”的疑惑有所...
    99+
    2023-06-26
  • Android实现字母导航控件的示例代码
    目录自定义属性Measure测量坐标计算绘制Touch事件处理数据组装显示效果今天分享一个以前实现的通讯录字母导航控件,下面自定义一个类似通讯录的字母导航 View,可以知道需要自定...
    99+
    2024-04-02
  • Android仿微信实现首字母导航条
    本文介绍Android实现首字母导航条,先看张效果图,具体怎么实现看代码吧 具体的步骤 1.整体布局的显示 2. 实现A-Z的分组 3. 自定义A-Z的导航条 4. 中...
    99+
    2022-06-06
    导航条 字母 Android
  • Android自定义View实现字母导航栏
    很多的Android入门程序猿来说对于Android自定义View,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义View上面花一些功夫,多写一些文章。 ...
    99+
    2022-06-06
    view 字母 Android
  • Android自定义字母导航栏
    本文实例为大家分享了Android字母导航栏的具体代码,供大家参考,具体内容如下 效果 实现逻辑 明确需求 字母导航栏在实际开发中还是比较多见的,城市选择、名称选择等等可能...
    99+
    2022-06-06
    字母 Android
  • Android自定义View实现字母导航栏的代码
    思路分析: 1、自定义View实现字母导航栏 2、ListView实现联系人列表 3、字母导航栏滑动事件处理 4、字母导航栏与中间字母的联动 5、字母导航栏与ListView的...
    99+
    2022-06-06
    view 字母 Android
  • Android 底部导航控件实例代码
    一、先给大家展示下最终效果 通过以上可以看到,图一是简单的使用,图二、图三中为结合ViewPager共同使用,而且都可以随ViewPager的滑动渐变色,不同点是图二为...
    99+
    2022-06-06
    Android
  • Android自定义控件实现可左右滑动的导航条
    先上效果图: 这个控件其实算是比较轻量级的,相信不少小伙伴都能做出来。因为项目中遇到了一些特殊的定制要求,所以就自己写了一个,这里放出来。  首先来分析下这个控件的...
    99+
    2022-06-06
    导航条 Android
  • Android使用ViewPager实现导航
    首先先了解ViewPager实现的出效果是能够使视图左右滑动。 ViewPager在XML文件中的声明和其他一些控件的声明有点儿不一样 而android.support.v4....
    99+
    2022-06-06
    viewpager Android
  • vue怎么实现导航
    本文小编为大家详细介绍“vue怎么实现导航”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现导航”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。使用$route.path设置默认选中的导航,但是设置之后...
    99+
    2023-07-04
  • Android中导航组件Navigation的实现原理
            对于导航组件的使用方式不是本文的重点,具体使用可以参考官方文档,导航组件框架是通过fragment来实现的,其核心类主要可以分...
    99+
    2024-04-02
  • oracle大写字母转小写字母怎么实现
    在Oracle数据库中,您可以使用LOWER()函数来将大写字母转换为小写字母。以下是一个更详细的示例: 假设您有一个名为emplo...
    99+
    2024-03-13
    oracle
  • Android实现字母雨的效果
    首先来看效果: 一、实现原理 在实现过程中,主要考虑整个界面由若干个字母组成的子母线条组成,这样的话把固定数量的字母封装成一个字母线条,而每个字母又封装成一个对象,这样的...
    99+
    2022-06-06
    字母 Android
  • css怎么实现横向导航和竖向导航栏
    小编给大家分享一下css怎么实现横向导航和竖向导航栏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   一、竖向导航   &...
    99+
    2024-04-02
  • Android开发怎么快速实现底部导航栏
    这篇文章主要介绍“Android开发怎么快速实现底部导航栏”,在日常操作中,相信很多人在Android开发怎么快速实现底部导航栏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android开发怎么快速实现底部...
    99+
    2023-06-30
  • Android实现底部导航栏效果
    目前网上主流的文章都是用底部的 RadioGroup + 页面部分的 Fragment 实现导航栏切换页面效果的。 然而底部的 RadioGroup 是如此麻烦,每个按钮的图片和文字...
    99+
    2024-04-02
  • android实现简单底部导航栏
    本文实例为大家分享了android实现底部导航栏的具体代码,供大家参考,具体内容如下 常见的底部导航栏 动态效果 实现步骤 1.底部导航栏样式 我们应该在项目的res文件夹下新建...
    99+
    2024-04-02
  • Android底部导航组件BottomNavigationView怎么使用
    本篇内容介绍了“Android底部导航组件BottomNavigationView怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Bo...
    99+
    2023-07-05
  • css3怎么实现动画导航
    这篇文章主要介绍“css3怎么实现动画导航”,在日常操作中,相信很多人在css3怎么实现动画导航问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css3怎么实现动画导航”的疑惑...
    99+
    2024-04-02
  • Android仿微信联系人列表字母侧滑控件
    仿微信联系人列表字母侧滑控件, 侧滑控件参考了以下博客:Android实现ListView的A-Z字母排序和过滤搜索功能首先分析一下字母侧滑控件应该如何实现,根据侧滑控件的高度和字母的数量来平均计算每个字母应该占据的高度。在View的onD...
    99+
    2023-05-31
    android 侧滑控件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作