没有合适的资源?快使用搜索试试~ 我知道了~
Android自定义View仿腾讯TIM下拉刷新View
2 下载量 165 浏览量
2021-01-05
06:36:30
上传
评论
收藏 180KB PDF 举报
温馨提示
一 概述 自定义 View 是 Android 开发里面的一个大学问。偶然间看到 TIM 邮箱界面的刷新 View 还挺好玩的,于是就自己动手实现了一个,先看看 TIM 里边的效果图: 二 需求分析 看到上面的动图,大概也知道我们需要实现的功能: 根据拖动的进度来移动小球的位置 小球移动过程的动画 三 功能实现 新建一个 RefreshView 类继承自 View ,然后我们再在 RefreshView 里面新建一个内部实体类: Circle 来看一下 Circle类的代码 #Cirlce.java class Circle { int x; int y; in
资源推荐
资源详情
资源评论
Android自定义自定义View仿腾讯仿腾讯TIM下拉刷新下拉刷新View
一一 概述概述
自定义 View 是 Android 开发里面的一个大学问。偶然间看到 TIM 邮箱界面的刷新 View 还挺好玩的,于是就自己动手实现了一
个,先看看 TIM 里边的效果图:
二二 需求分析需求分析
看到上面的动图,大概也知道我们需要实现的功能:
根据拖动的进度来移动小球的位置
小球移动过程的动画
三三 功能实现功能实现
新建一个 RefreshView 类继承自 View ,然后我们再在 RefreshView 里面新建一个内部实体类: Circle
来看一下 Circle类的代码
#Cirlce.java
class Circle {
int x;
int y;
int r;
int color;
public Circle(int x, int y, int r, int color) {
this.x = x;
this.y = y;
this.r = r;
this.color = color;
}
}
这是一个实体类,里面提供了 x , y , r , color 属性分别代表圆心坐标的 x值,y值,圆的半径 r 跟颜色。
借助此类来存储小圆球的相关属性。
接下来就是我们平时自定义 View 经常要重写的三大方法了,先看 onMeasure()
#RefreshView.java
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
if (widthMode == MeasureSpec.AT_MOST && heightMode == MeasureSpec.EXACTLY) {
setMeasuredDimension(mWidth, heightSize);
} else if (widthMeasureSpec == MeasureSpec.EXACTLY && heightMeasureSpec == MeasureSpec.AT_MOST) {
setMeasuredDimension(widthSize, mHeight);
} else if (widthMode == MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY) {
setMeasuredDimension(widthSize, heightSize);
} else {
setMeasuredDimension(mWidth, mHeight);
}
}
为了适配布局文件中的 wrap_content 参数,我们需要重写此方法(此方法不是本文的研究重点,不明白的可以百度或者google
一下,或者参考《Android开发艺术探索》里面的相关章节)。
接着看 onLayout() 方法:
#RefreshView.java
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
initContentAttr(getMeasuredWidth(), getMeasuredHeight());
resetCircles();
}
在此方法中调用了 initContentAttr() 方法来初始化内容大小与 resetCircles() 来初始化(重置)三个小球的属性。分别看下这两
个方法:
#RefreshView.java
private void initContentAttr(int width, int height) {
mContentWidth = width - getPaddingLeft() - getPaddingRight();
mContentHeight = height - getPaddingTop() - getPaddingBottom();
}
这方法很简单,就是进行了 padding 的处理,得出真正的布局大小。如果不处理 padding 的话那么用户设置了 padding 将失
效。再看 resetCircles():
#RefreshView.java
public static final int STATE_ORIGIN = 0;
public static final int STATE_PREPARED = 1;
private int mOriginState = STATE_ORIGIN;
private void resetCircles() {
if (mCircles.isEmpty()) {
int x = mContentWidth / 2;
int y = mContentHeight / 2;
mGap = x - mMinRadius; //初始化相邻圆心间的最大间距
Circle circleLeft = new Circle(x, y, mMinRadius, 0xffff7f0a);
Circle circleCenter = new Circle(x, y, mMaxRadius, Color.RED);
Circle circleRight = new Circle(x, y, mMinRadius, Color.GREEN);
mCircles.add(LEFT, circleLeft);
mCircles.add(RIGHT, circleRight);
mCircles.add(CENTER, circleCenter);
}
if (mOriginState == STATE_ORIGIN) {
int x = mContentWidth / 2;
int y = mContentHeight / 2;
for (int i = 0; i < mCircles.size(); i++) {
Circle circle = mCircles.get(i);
circle.x = x;
circle.y = y;
剩余7页未读,继续阅读
资源评论
weixin_38653694
- 粉丝: 9
- 资源: 920
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 这是尝试在 SDL 上运行 DirectX 12.zip
- 这是关于 DirectX 11 的测试投影 .zip
- 企业信息系统规划法-实例
- 这是为 UCLA 的 CS188 课程构建的适用于 Windows 8.1 的简单易用的 direct2d 游戏引擎.zip
- springboot基于springboot的大创管理系统(代码+数据库+LW)
- Python神经网络.zip
- 这是一个简单的 DIY 工具,它使用 Windows 桌面 API 每秒或每隔几秒捕获一次显示输出,作为 DirectX 纹理并在 GPU 上直接将其压缩为 h265 .zip
- 这是一个具有一些基本游戏引擎功能的 DirectX 应用程序 .zip
- 这是 DirectX 中的一款基本客户端,服务器游戏,最多可同时支持 16 名玩家在平坦的草地上移动,就像带有皮肤,动画的 .X 网格(来自 Microsoft 演示的 Tiny 模型)一样,.zip
- 这个基础可以非常轻松地修改基于 IL2CPP 的 Unity 游戏 .zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功