Android 侧栏A-Z的快速滑动搜索(一)

本文介绍如何在Android应用中实现A-Z侧边栏的快速滑动搜索功能。通过自定义控件和监听事件,详细讲解了如何分配内容高度、宽度,以及搜索框的实现,包括删除按钮和输入长度监听。提供源码下载链接。
摘要由CSDN通过智能技术生成

Android侧栏A-Z的快速滑动搜索想必大家并不陌生,很多应用里面都有这样的功能出现。最常见的如电话联系人列表、好友列表、城市列表等等。快速搜索就是方便我们快速定位到我们要找的信息。比如我们想找姓氏为刘的,那么我们只需要点击一下L就能搜索到好友里面的姓氏拼音首字母以L开头的,当然姓氏刘也就搜出来的,有可能以L开头的姓氏比较多,比如李、郎、鲁、柳、雷、刘、林、蓝、吕等,而我们想找到刘这个姓我们可以让含有L的这些姓氏全都显示出来供我们来选择。
要想实现这些快速搜索首先我们要用侧边要有A-Z的选项供我们选择。
这里写图片描述
那么我们就先来说一说侧边栏#和A-Z的实现。实现这个功能其实也很简单,我们需要自己自定义一个控件,点击查看自定义控件。自定义控件离不了onDraw。我们这次自定义控件不需要onMeasure和onLayout这两个。但是我们需要实onSizeChanged,它是在布局发生变化时的回调函数,由于我们的侧栏是滑动搜索onTouchEvent也是离不了的。
那么我们来实现一下侧栏的功能吧。先来一个最简单的也是必不可少的决定侧边栏要显示的内容的一步

private String[] mSideLetter = { "#","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",};

我们要显示的这些内容既然已经确定了,那么我们就要为这些内容分配相应的高度和宽度。每个字母的高度是有屏幕的高度来决定的。我们根据获取到的屏幕的高度/字母的数量 = 每个字母显示的高度。宽度怎么办呢?因为我们的这些内容是不可能自己去每一个字母一换行的,而我们又想要的是每个字母是一行。我们可以根据字母的数量来决定显示的行数,那么我们就可以根据行数来决定每行要显示的字母是什么。比如#在第一行那么当i为0 的时候我们就可以设置这行显示的为#

private int getTextHeight(String text) {
        //获取文本的高度
        Rect bounds = new Rect();
        paint.getTextBounds(text,0,text.length(), bounds);
        return bounds.height();
    }
@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (int i = 0; i < mSideLetter .length; i++) {
            float x = letterWidth/2;
            float y = letterHeight/2 + getTextHeight(mSideLetter [i])/2 + i*letterHeight;

            paint.setColor(lastIndex==i?Color.BLACK:Color.WHITE);

            canvas.drawText(mSideLetter [i], x, y, paint);
        }
    }

至于为什么float x = letterWidth/2。首先要清楚drawText不是以文字的左上角开始绘制,而是以baseLine为基线绘制。如果我们要想让字母居中,那么我们就需要X的坐标点在字母的中间位置,也就是字母宽度的一半了。高度float y = letterHeight/2 + getTextHeight(mSideLetter [i])/2 + i*letterHeight; letterHeight/2 + getTextHeight(mSideLetter [i])/2所起的作用就是文字居中显示, i*letterHeight则是显示的高度。怎么理解呢?比如说X的显示位置,X的高度已经获取到了,那么X的显示位置高度就是在前面所有的字母的高度之上再加上自己的高度就是显示的位置y了。

package lyx.robert.quicksearch.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Paint.Align;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import lyx.robert.quicksearch.utils.DisplayUtil;

public class SideLetterBar extends View{
   
    private String[] mSideLetter  = { "#","A", "B", "C", 
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Qt的QSidebar是一个侧栏控件,用于显示各种导航选项或工具。如果想要实现侧栏滑动效果,可以通过以下步骤进行操作。 首先,在创建QSidebar对象之后,可以对其进行一些基本的设置,如设置大小、位置等。可以使用setFixedWidth或setSizePolicy等方法来设置侧栏的宽度。 接下来,为了实现滑动效果,可以将QSidebar放置在一个QScrollArea中。QScrollArea是一个用于显示滚动内容的控件,通过将QSidebar作为其子部件来实现。可以使用setWidget方法将QSidebar设置为QScrollArea的子部件。 接着,可以使用QScrollArea的滚动条来控制侧栏滑动。通过QScrollArea的verticalScrollBar方法获取垂直滚动条,然后可以使用setValue方法来设置滚动条的当前值,从而实现侧栏滑动效果。可以根据需要,在相应的交互事件或信号槽中调用这些方法来控制滚动条的值。 最后,将QScrollArea放置在主窗口中的合适位置,调整布局以适应其他部件或界面的需要。 通过以上步骤,可以实现Qt中QSidebar的侧栏滑动效果。注意要在需要的情况下使用滚动条来控制侧栏滑动,以提供更好的用户体验。 ### 回答2: Qt 的 QSidebar 组件是一个侧栏控件,可以用于实现侧边导航、菜单、选项卡等功能。通过 QSidebar,我们可以实现侧栏滑动效果。 要实现 QSidebar 的滑动,可以使用 QPropertyAnimation 类来控制 QSidebar 的位置动画。首先,我们需要给 QSidebar 添加一个动画属性,通常可以使用 setGeometry 或者 setFixedSize 方法设置 QSidebar 的初始位置和大小。 然后,我们可以创建一个 QPropertyAnimation 对象,指定要进行动画的目标对象和属性。在这里,我们可以指定 QSidebar 对象的 geometry 属性为动画的目标属性。 接下来,设置 QPropertyAnimation 的持续时间和动画的起始值和结束值。可以使用 QPoint 类来表示 QSidebar 的位置。我们可以设置动画起始值为 QSidebar 的当前位置,结束值可以根据需要进行设置。 最后,我们调用 QPropertyAnimation 的 start 方法来启动动画。这样,当我们调用 start 方法时,QSidebar 将会按照动画的设定,平滑地从起始位置滑动到结束位置。 在动画结束后,可以通过连接 QPropertyAnimation 的 finished 信号来执行特定的操作,例如更新窗口内容或者继续处理其他逻辑。 总结起来,通过使用 QPropertyAnimation 类,我们可以轻松实现 QSidebar 的滑动效果。首先,设置 QSidebar 的初始位置和大小。然后,创建一个 QPropertyAnimation 对象,指定 QSidebar 为动画目标对象。设置动画的起始值和结束值。最后,启动动画并处理动画结束后的操作。这样,就可以实现侧栏滑动效果。 ### 回答3: Qt QSideBar 是 Qt 框架提供的一个边栏控件,常用于创建有滑动功能的侧边菜单。可以在界面的一侧以侧边栏的形式展示一些菜单项或者其他的交互界面。 要实现侧栏滑动的功能,需要一些代码和逻辑操作。首先,在 Qt 中创建一个 QSideBar 的实例,并设置其位置和大小。可以使用 QVBoxLayout 或 QHBoxLayout 将 QSideBar 放置在主窗口或者父窗口的一侧。然后,通过添加 QToolButton 或者其他的交互控件作为菜单项,给用户提供可点击的选项。 为了实现滑动效果,可以使用 QPropertyAnimation (属性动画)来操纵 QSideBar 控件的位置或大小属性。在用户点击菜单项时,先判断当前 QSideBar 的状态(是否展开或者收起),然后根据状态选择执行展开或收起动画,动画会移动侧边栏的位置或者改变宽度,以达到滑动的效果。 代码示例如下: ```cpp // 创建 QSideBar 实例 QSideBar* sideBar = new QSideBar(); sideBar->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); // 设置侧边栏的位置和大小 QVBoxLayout* layout = new QVBoxLayout(parentWidget); layout->addWidget(sideBar); // 创建菜单项并添加到侧边栏 QToolButton* menuItem1 = new QToolButton(sideBar); menuItem1->setText("Menu Item 1"); sideBar->addItem(menuItem1); // 创建属性动画,设置起始值和结束值 QPropertyAnimation* animation = new QPropertyAnimation(sideBar, "geometry"); animation->setDuration(300); animation->setStartValue(QRect(0, 0, 0, parentWidget->height())); animation->setEndValue(QRect(0, 0, 200, parentWidget->height())); // 响应菜单项点击事件 connect(menuItem1, &QToolButton::clicked, [=]() { if (sideBar->isExpanded()) { animation->setStartValue(QRect(0, 0, 200, parentWidget->height())); animation->setEndValue(QRect(0, 0, 0, parentWidget->height())); } else { animation->setStartValue(QRect(0, 0, 0, parentWidget->height())); animation->setEndValue(QRect(0, 0, 200, parentWidget->height())); } // 执行动画 animation->start(); }); ``` 上述代码仅作为示例,具体实现还需要根据实际需求进行调整和完善。通过使用 QSideBar 和属性动画,可以很方便地实现侧栏滑动的效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值