先来看右侧滑动条布局

<com.reige.addressbook.IndexBarandroid:layout_alignParentRight="true"android:layout_width="20dp"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:layout_marginBottom="30dp"/>

然后我们创建一个类继承View来绘制右侧字母导航滑动条

//初始化的方法
private void init() {//抗锯齿mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//设置绘制的文字大小mPaint.setTextSize(30);mPaint.setColor(Color.BLUE);//因为默认的文字绘制锚点在文字的左下角,这样会使文字的左边在一条直线上 因为字母的宽度不同会使绘制出的字母看上去比较乱 这个方法可以将锚点设置到文字底部中心 从而避免这个问题mPaint.setTextAlign(Paint.Align.CENTER);}

绘制简单原理

public class IndexBar extends View {private OnSlideListener onSlideListener;private String[] arr = {"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","#"};private Paint mPaint;private int mWidth;private float mBoxHeight;public IndexBar(Context context) {super(context);}public IndexBar(Context context, AttributeSet attrs) {super(context, attrs);init();}public IndexBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}private void init() {mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setTextSize(30);mPaint.setColor(Color.BLUE);//因为默认的文字绘制锚点在文字的左下角,这样会使文字的左边在一条直线上 因为字母的宽度不同会使绘制出的字母看上去比较乱 这个方法可以将锚点设置到文字底部中心 从而避免这个问题mPaint.setTextAlign(Paint.Align.CENTER);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mWidth = getMeasuredWidth();mBoxHeight = getMeasuredHeight() * 1f / arr.length;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);for (int i = 0; i < arr.length; i++) {float textHeight = getTextHeight(arr[i]);float x = mWidth / 2;float y = (1 + i) * mBoxHeight;mPaint.setColor(lastIndex==i?Color.RED:Color.BLUE);canvas.drawText(arr[i], x, y, mPaint);}}private int lastIndex = -1;@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:float y = event.getY();//获取当前点击第几个itemint index = (int) (y / mBoxHeight);if (lastIndex != index) {if (index >= 0 && index < arr.length) {Log.e("index", "index:::" + index);//选择的letter变化 回调if(onSlideListener!=null){onSlideListener.onSlide(arr[index]);}}}lastIndex = index;break;case MotionEvent.ACTION_UP:lastIndex = -1;break;}invalidate();return true;}/*** @param text* @return 返回文字的高*/private float getTextHeight(String text) {Rect rect = new Rect();mPaint.getTextBounds(text, 0, text.length(), rect);return rect.height();}/*** 设置监听的方法*/public interface OnSlideListener{void onSlide(String letter);}/*** 滑动监听* @param osl*/public void setOnSlideListener(OnSlideListener osl){this.onSlideListener = osl;}
}

仿小米通讯录 右侧滑动条与带动画的悬停列表实现(一)相关推荐

  1. Android仿小米时钟嵌套滑动(NestedScroll, 自定义behavior)

    最近无聊刷手机的时候, 发现小米时钟的嵌套滑动很有意思, 就试着做了下 先上对比图: 分析下小米时钟的滑动 闹钟列表 向上滑动时, 时钟面 透明度上升, 快到最大滑动时逐渐显示数字时钟. 在闹钟列表向 ...

  2. 仿支付宝输入支付密码2(带动画)

    由于用对话框做输入支付密码会出现宽度无法充满,这次我用popwindow来做,功能效果更加容易扩展:这次提供源码噢,有兴趣的可以下载去参考下,带动画噢: 先看看效果图把: 主界面只有这么简单,就不多在 ...

  3. html中美化右侧滑动条,美化css滚动条样式,就这么简单

    很多朋友,会觉得默认的css滚动条样式是很丑的吧,稍微改下-webkit-scrollbar(滚动条整体样式).-webkit-scrollbar-thumb(滚动条里面小方块样式).-webkit- ...

  4. Android ScrollView去掉右侧滑动条

    <ScrollView ......android:scrollbars="none"><!--添加代码-->

  5. Unity3D加载火炬之光资源(3Dmax带动画)

    一.目标 上一篇研究了下将火炬之光的资源导入到Blender中,结果找的几个脚本都不支持动画的导入,不知道是不是因为会blender的程序比较少, 于是去找了个3dmax的导入脚本,经过一些复杂的工作 ...

  6. 【Android 仿微信通讯录 导航分组列表-上】使用ItemDecoration为RecyclerView打造带悬停头部的分组列表

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52355199 本文 ...

  7. 仿小米相册列表实现自定义带快速索引功能的RecyclerView

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 篇章目标要点 一.实现效果 二.设计布局原理 三.关键代码实现 1.浮标随手势移动 2.浮标随列表移动 3.列表随浮标移动而 ...

  8. Android 11.0 自定义仿小米全面屏手势导航左右手势滑动返回UI效果

    目录 1.概述 2.自定义仿小米全面屏手势导航返回ui布局的核心代码 3.自定义左右手势返回UI样式的核心代码功能分析 3.1 NavigationBarView手势导航布局左右手势返回的相关代码 3 ...

  9. 小程序自制自带滑动条的表格组件

    小程序自制自带滑动条的表格组件 在编写过程中遇到的难点 1. 表格的编写 2. 表格内容宽度固定 长度自适应 3. 滚动条逻辑及代码编写 4. 滚动条的卡段优化 5. 小程序组件的编写及应用 尾声 先 ...

  10. 纵享丝滑滑动切换的周月日历,可流畅滑动高度定制,仿小米日历,基于 material-calendarview

    monthweekmaterialcalendarview 项目地址:idic779/monthweekmaterialcalendarview  简介:纵享丝滑滑动切换的周月日历,可流畅滑动高度定制 ...

最新文章

  1. html js json数据解析后台数据包_如何将html解析为有关联的json数据?htmlparser2模块使用详解...
  2. 其他团队对本组建议汇总
  3. 编译arm平台的ethtool
  4. js获取datagrid行,但是行改变了肿么办?
  5. c语言选择结构程序设计报告,C语言学习与总结---第四章:选择结构程序设计
  6. 结对编程作业---电梯调度程序
  7. JAVA集合三:几种Set框架
  8. 大约ActionContext.getContext()使用体验
  9. Spring之Bean配置
  10. Ubuntu 上 ibus 拼音输入法(打字法)无法选词 BUG 的解决方案
  11. Linux RedHat 7 配置本地 YUM源
  12. VAssistX 快捷键
  13. 2020年全球激光雷达行业竞争格局分析,技术路线正处于快速发展迭代阶段「图」
  14. 程序员的读书方法和反思方法!!:我们该如何学习知识?反思总结?
  15. 江苏省泰州市谷歌高清卫星地图下载
  16. dubbo整体设计整理
  17. 这11个免费学习的网站,个个堪称神器,不收后悔!
  18. 如何使用Lumberyard制作特效[【1】——Overview
  19. python手机号定位_python手机号前7位归属地爬虫
  20. 我的windows学习心得

热门文章

  1. boost::asio 学习
  2. 转载:稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
  3. 计算机信息管理基础考试试题及答案,计算机信息管理基础复习题A及答案
  4. 操作系统的主要功能(3)
  5. 论文笔记(九):Assessing the Suitability and ... Mixed Reality Interfaces for Accurate Robot Teleoperation
  6. 十年终于读懂你——你从没见过的算法之美
  7. 搜索留痕软件_这款原价905台币的专业软件,请收好
  8. 二值图像连通区域标记
  9. MySQL 操作数据库_复制表
  10. A股哪家上市公司年报更亮眼?