Android 自定义View(四)实现股票自选列表滑动效果

一、前言

Android 开发过程中自定义 View 真的是无处不在,随随便便一个 UI 效果,都会用到自定义 View。前面三篇文章已经讲过自定义 View 的一些案例效果,相关类和 API,还有事件分发理论知识请自行充电。作者不喜欢讲一些原理性的东西,直接上效果和源码。

Android 自定义 View(一)实现时钟表盘效果
Android 自定义 View(二)实现环形进度条
Android 自定义 View(三)实现体育赛事积分表效果

本篇文章原本和自定义 View 关系不大,作者强行自定义绘制了一个小控件,以符合最近的文章主题。本文是实现股票、证券列表联动效果,

二、开发准备工作

1、先上效果图

在这里插入图片描述

2、案例源码下载

下载源码

3、案例应用知识点

  1. 自定义 View 基础知识(测量、Canvas、Paint、Path)

  2. HorizontalScrollView 滚动事件

  3. RecyclerView 嵌套 HorizontalScrollView 冲突处理

  4. 接口回调知识

  5. 自定义 layer-list 和 shape

4、案例思路分析

根据效果图,我们可以将布局拆解,分为以下独立模块:

  1. 效果图整体布局是一个 Tab 栏 + RecyclerView 列表组成

  2. RecyclerView 列表 item 布局和 Tab 栏一致

  3. Tab 栏水平滑动时,RecyclerView 列表同步滑动

  4. RecyclerView 列表 item 滑动时,整个列表跟滚动,并且 Tab 栏也同步滚动更新

三、代码实现

1、自定义 TextView

自定义 View 的基础知识这里不做回顾,如果对自定义 View 还不是很了解的朋友,可以查看之前的文章。

自定义 TextView,将效果图左上角的文本和小三角符号完成绘制工作,并设置一个背景效果。这里将属性直接在 Java 代码里设置了,建议使用自定义属性,方便在 XML 中设置。

1. 测量 TextView 尺寸

根据文本的尺寸和 Padding 值计算文本的宽度和高度,因为本案例中自定义 View 尺寸在 XML 中设置 wrap_content,所以主要看 switch 语句中 MeasureSpec.AT_MOST 节点,关于 MeasureSpec.EXACTLY、MeasureSpec.AT_MOST、MeasureSpec.UNSPECIFIED 区别,请查看作者之前自定义 View 的系列文章。

测量成功后重新设置 View 尺寸:setMeasuredDimension(width, height);

/**
 * View尺寸测量
 * @param widthMeasureSpec
 * @param heightMeasureSpec
 */
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
   
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    // 宽度测量
    width = setMeasureSize(widthMeasureSpec, 1);
    // 高度测量
    height = setMeasureSize(heightMeasureSpec, 2);
    // 设置测量后的尺寸
    setMeasuredDimension(width, height);
}

int setMeasureSize(int measureSpec, int type) {
   
    int specSize = 0;
    int measurementSize = 0;
    int mode = MeasureSpec.getMode(measureSpec);
    int size = MeasureSpec.getSize(measureSpec);
    switch (mode) {
   
        case MeasureSpec.EXACTLY:// 精确尺寸或者最大值
            specSize = size;
            break;
        case MeasureSpec.AT_MOST:
        case MeasureSpec.UNSPECIFIED:
            if (type == 1) {
   
                measurementSize = rect.width() + getPaddingLeft() + getPaddingRight() + specSize + triangleSize;
            } else if (type == 2
  • 10
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值