每周一个自定义View(1) -动态ProgressView(1)

本文详细描述了在Android中如何通过分层设计实现动画控制,包括背景图层、进度图层、线段动画图层和遮罩展示图层的绘制方法。同时提供了可编辑参数和代码示例,以及如何在面试中提升技巧和规划学习路径的建议。
摘要由CSDN通过智能技术生成
  • 动画控制, 动画效果可以设置展示速度, 总有一个组合适合你

设计过程

图层

将相关的view分为了四层, 从下至上分别为

  • 背景图层

用于显示整个view的背景

  • 进度图层

相当于进度条的背景颜色

  • 线段动画图层

在这里绘制出现的线段, 并控制器动画的效果

  • 遮罩展示图层

这里使用了遮罩展示的方法, 控制遮罩图层的进度和样式来表现实际的展示效果

实现过程

首先是背景如果绘制的, 简单来说就是两个圆形和一个矩形, 具体的动画效果可以参考下面, https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/edb78216b1f441c88558348ac4c37d24~tplv-k3u1fbpfcp-zoom-1.image

其它的图层基本上也都是比较类似的情况, 除此之外就是线条的实现

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/29fd4f28c8a549a482385ed7a06fb95d~tplv-k3u1fbpfcp-zoom-1.image

其中中心黑色的为展示的区域, 白色的是绘制的区域

代码实现

可编辑参数

//下面为可自定义编辑的参数
//背景颜色
private int viewBackGroundColor;
//线条颜色
private int viewLineColor;
//进度条颜色
private int viewProgressColor;
//线条见间隔
private int offsetLine;
//执行动画需要的时间
private int animatorTime;
//进度变化动画需要的时间
private int animatorProgressTime;
//画笔/线条的宽度
private int paintWidth;

背景图层&绘制图层背景

这两个图形的实现比较类似

/**

  • @description 绘制图层背景
    */
    private void getProgressBackground(Canvas canvas){
    //设置画笔
    Paint paint = new Paint();
    paint.setColor(viewProgressColor);

//确定两个圆形的中心位置及半径
int leftCirclePoint = height / 2;
int rightCirclePoint = width - leftCirclePoint;
int radius = height / 2;

//绘制左侧和右侧的圆形填充
canvas.drawCircle(leftCirclePoint, height >> 1, radius, paint);
canvas.drawCircle(rightCirclePoint, height >> 1, radius, paint);

//绘制中心的矩形填充
Rect rect = new Rect(leftCirclePoint, 0, rightCirclePoint, height);
canvas.drawRect(rect, paint);
}

/**

  • @description 绘制背景图层
    */
    private void drawViewBackground(Canvas canvas) {
    canvas.save();

Paint paint = new Paint();
paint.setColor(viewBackGroundColor);

int leftCirclePoint = height / 2;
int rightCirclePoint = width - leftCirclePoint;
int radius = height / 2;

canvas.drawCircle(leftCirclePoint, height >> 1, radius, paint);
canvas.drawCircle(rightCirclePoint, height >> 1, radius, paint);

Rect rect = new Rect(leftCirclePoint, 0, rightCirclePoint, height);
canvas.drawRect(rect, paint);
}

绘制遮罩图层

/**

  • @description 绘制遮罩图层
    */
    private Bitmap progressBitmapDst(){
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

//如果当前进度为0, 则不展示任何内容
if (progress == 0){
return bitmap;
}
Canvas canvas = new Canvas(bitmap);

Paint paint = new Paint();
paint.setColor(Color.WHITE);

//遮罩图层宽度与当前progress进度有关
int leftCirclePoint = height / 2;
int rightCirclePoint = leftCirclePoint + (int) ((width - height) / 1f * progress / 100f);

int radius = height / 2;

canvas.drawCircle(leftCirclePoint, height >> 1, radius, paint);
canvas.drawCircle(rightCirclePoint, height >> 1, radius, paint);

Rect rect = new Rect(leftCirclePoint, 0, rightCirclePoint, height);
canvas.drawRect(rect, paint);

return bitmap;
}

绘制线条动画

/**

  • @description 绘制线条动画
    */
    private void getProgressLines(Canvas canvas){
    Paint paint = new Paint();
    paint.setColor(viewLineColor);

//设置画笔宽度
paint.setStrokeWidth(paintWidth);

//设置画笔圆形边界
paint.setStrokeCap(Paint.Cap.ROUND);
//todo 动画效果展示优化
canvas.translate(-offsetLine * 2, 0);
//offsetAnimator 为动画展示时使用, 每次移动一定的长度,
//通过连续的移动来实现视觉上的动画效果
canvas.translate(offsetAnimator, 0);
canvas.save();

int indexOffset = 0;

//依次绘制线条
do {
//绘制右上到左下的线条
canvas.drawLine(20, -20, -offsetLine - 20, height + 20, paint);
indexOffset += offsetLine;
//偏移位置
canvas.translate(offsetLine, 0);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结尾

如何才能让我们在面试中对答如流呢?

答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?为此我整理了一份Android学习资料路线:

这里是一份BAT大厂面试资料专题包:

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自定义一个水波进度 View,你需要完成以下几个步骤: 1. 创建一个自定义 View 类,并在构造函数中初始化一些必要的属性,如颜色、线宽等。 2. 重写 onSizeChanged() 方法,在该方法中获取 View 的宽度和高度,并计算出进度条的半径、圆心等相关参数。 3. 重写 onDraw() 方法,在该方法中绘制水波纹效果。 4. 在自定义 View 中添加一个 setProgress() 方法,用于设置进度条的进度。 5. 在布局文件中引入自定义 View,设置 layout_width 和 layout_height 属性,并在代码中调用 setProgress() 方法设置进度条的进度。 下面是一个简单的自定义水波进度 View 的代码示例: ```java public class WaterWaveProgressView extends View { private Paint mPaint; private int mWidth, mHeight; private float mRadius; private float mProgress; public WaterWaveProgressView(Context context) { super(context); init(); } public WaterWaveProgressView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public WaterWaveProgressView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(Color.BLUE); mPaint.setStrokeWidth(5); mPaint.setStyle(Paint.Style.STROKE); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mWidth = w; mHeight = h; mRadius = Math.min(mWidth, mHeight) / 2 * 0.8f; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(mWidth / 2, mHeight / 2, mRadius, mPaint); float angle = mProgress / 100 * 360; canvas.drawArc(mWidth / 2 - mRadius, mHeight / 2 - mRadius, mWidth / 2 + mRadius, mHeight / 2 + mRadius, -90, angle, false, mPaint); } public void setProgress(float progress) { mProgress = progress; invalidate(); } } ``` 通过调用 setProgress() 方法来更新进度条的进度,如下所示: ```java WaterWaveProgressView progressView = findViewById(R.id.progress_view); progressView.setProgress(50); // 设置进度为 50% ``` 在布局文件中引入自定义 View: ```xml <com.example.waterwaveprogressview.WaterWaveProgressView android:id="@+id/progress_view" android:layout_width="150dp" android:layout_height="150dp" /> ``` 这样就能够实现一个简单的水波进度 View 了。如果需要更加复杂的效果,可以在 onDraw() 方法中绘制多个水波纹,或者使用 Path 绘制波形等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值