Android自定义带水滴的进度条样式(带渐变色效果)
作者:Susan8888 发布时间:2023-03-02 06:45:02
一、直接看效果
二、直接上代码
1.自定义控件部分
package com.susan.project.myapplication;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
/**
* @author dahai
* @ClassName: ${type_name}
* @Description: ${todo}
* @date ${date} ${time}
* @email 202491024@qq.com
* @since $
android
渐变
进度条
*/
public class ProgressSeek extends View {
/**
* 进度条的宽度
*/
private int view_width;
/**
* 画布的宽度
*/
private int view_base_width;
/**
* 控件的宽度
*/
private int view_edge_width;
/**
* 进度
*/
private int progress;
private Canvas cacheCanvas;
/**
* 背景颜色的画笔
*/
private Paint backgroundPaint;
/**
* 进度条的画笔
*/
private Paint progressPaint;
/**
* 进度末端的图
*/
private Bitmap bitmap;
private int bitmapWidth;
private int bitmapHeight;
private Context context;
//渐变色开始
private static final int DEFAULT_START_COLOR = Color.parseColor("#34DAB5");
//渐变色结束
private static final int DEFAULT_END_COLOR = Color.parseColor("#27A5FE");
/**
* 缓存图片
*/
private Bitmap cacheBitmap;
public ProgressSeek(Context context) {
super(context);
initView(context);
}
public ProgressSeek(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public ProgressSeek(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
private void initView(Context context) {
this.context = context;
bitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.thumb);
bitmapWidth = bitmap.getWidth();
bitmapHeight = bitmap.getHeight();
backgroundPaint = new Paint();
backgroundPaint.setStrokeWidth(bitmapWidth);
backgroundPaint.setColor(Color.parseColor("#cccccc"));
backgroundPaint.setDither(true);
backgroundPaint.setAntiAlias(true);
progressPaint = new Paint();
progressPaint.setStrokeWidth(bitmapWidth);
progressPaint.setDither(true);
progressPaint.setAntiAlias(true);
DisplayMetrics d = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(d);
view_base_width = d.widthPixels;
}
public void init(int progress) {
this.progress = progress;
if (view_width == 0) {//第一上来
/* DisplayMetrics d = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(d);
view_width = d.widthPixels*progress/100;*/
view_width = view_base_width * progress / 100;
} else {
view_width = view_edge_width * progress / 100;
}
if (cacheBitmap != null) {
if (!cacheBitmap.isRecycled()) {
cacheBitmap.recycle();
cacheBitmap = null;
}
cacheCanvas = null;
}
cacheBitmap = Bitmap.createBitmap(view_base_width, bitmapHeight * 2, Bitmap.Config.ARGB_8888);
if (cacheCanvas == null) {
cacheCanvas = new Canvas();
cacheCanvas.setBitmap(cacheBitmap);
}
/**
* 画背景
*/
RectF r = new RectF();
r.left = 0;
r.top = bitmapHeight;
r.right = view_base_width;
r.bottom = bitmapWidth + 10;
cacheCanvas.drawRoundRect(r, 5f, 5f, backgroundPaint);
if (progress > 0) {
LinearGradient lg = new LinearGradient(0, 0, view_width, bitmapWidth, DEFAULT_START_COLOR, DEFAULT_END_COLOR, Shader.TileMode.CLAMP);
progressPaint.setShader(lg);
RectF r1 = new RectF();
r.left = 0;
r.top = bitmapHeight;
r.right = view_width;
r.bottom = bitmapWidth + 10;
cacheCanvas.drawRoundRect(r, 5f, 5f, progressPaint);
cacheCanvas.drawBitmap(bitmap, view_width - bitmapWidth+8, bitmapHeight / 2 + 6, new Paint());
}
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint bmpPaint = new Paint();
//将cacheBitmap绘制到该View组件
if (cacheBitmap != null) {
canvas.drawBitmap(cacheBitmap, 0, 0, bmpPaint);
}
view_edge_width = this.getWidth();
Log.e("打出来看看控件的宽度:", view_edge_width + "");
init(progress);
}
}
3. 布局文件部分
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.susan.project.myapplication.ProgressSeek
android:id="@+id/progress"
android:layout_width="match_parent"
android:layout_height="80dp">
</com.susan.project.myapplication.ProgressSeek>
<com.susan.project.myapplication.ProgressSeek
android:id="@+id/progress1"
android:layout_width="match_parent"
android:layout_height="80dp">
</com.susan.project.myapplication.ProgressSeek>
<com.susan.project.myapplication.ProgressSeek
android:id="@+id/progress2"
android:layout_width="match_parent"
android:layout_height="80dp">
</com.susan.project.myapplication.ProgressSeek>
<com.susan.project.myapplication.ProgressSeek
android:id="@+id/progress3"
android:layout_width="match_parent"
android:layout_height="80dp">
</com.susan.project.myapplication.ProgressSeek>
</LinearLayout>
4.Activity部分
package com.susan.project.myapplication;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
private ProgressSeek progress;
private ProgressSeek progress1;
private ProgressSeek progress2;
private ProgressSeek progress3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progress = (ProgressSeek) findViewById(R.id.progress);
progress.init(0);
progress1 = (ProgressSeek) findViewById(R.id.progress1);
progress1.init(2);
progress2 = (ProgressSeek) findViewById(R.id.progress2);
progress2.init(50);
progress3 = (ProgressSeek) findViewById(R.id.progress3);
progress3.init(100);
}
}
以上所述是小编给大家介绍的Android自定义带水滴的进度条样式(带渐变色效果)网站的支持!
来源:http://blog.csdn.net/susan8888/article/details/53506736


猜你喜欢
- 前言本文的记录如何用CustomPaint、GestureDetector实现一个进度条控件。首先需要说明的是 flutter Materi
- 1. Action/Service/DAO简介:Action是管理业务(Service)调度和管理跳转的。Service是管理具体的功能的。
- Java Set集合的遍历及实现类的比较Java中Set集合是一个不包含重复元素的Collection,首先我们先看看遍历方法package
- 生产者消费者模式的几种实现方式拿我们生活中的例子来说,工厂生产出来的产品总是要输出到外面使用的,这就是生产与消费的概念。在我们实际的软件开发
- 一、SpringBoot是什么Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以
- 问题描述fastjson通过代码指定全局序列化返回时间格式,导致使用JSONField注解标注属性的特殊日期返回格式失效使用版本应用名称版本
- 刚学习c#的朋友要自己手动编译c#代码加深记忆,现在总结下如果手动编译!1、先找到系统的.net 环境在一般在 C:\Window
- 在App中经常看到这样的tab底部导航栏那么这种效果是如何实现,实现的方式有很多种,最常见的就是使用Fragment+RadioButton
- 前言:上篇总结了下WebApi的接口测试工具的使用,这篇接着来看看WebAPI的另一个常见问题:跨域问题。本篇主要从实例的角度分享下CORS
- 一、啥是Fluent-Mybatis与Mybatis-Plus类似,是对Mybaits进一步的封装,使之语法简洁明了,更重要的是不需要在自主
- 本文实例为大家分享了Android实现简单计时器的具体代码,供大家参考,具体内容如下布局在res/layout 下进行布局<?xml
- 一个Maprduce程序主要包括三部分:Mapper类、Reducer类、执行类。Maven项目下所需依赖<dependencies&
- # 看题目是不是很绕,这个我也不知道怎么才能更简单的表达了# 先看代码:public class Common {public static
- 简介在文章《GraalVM和Spring Native尝鲜,一步步让Springboot启动飞起来,66ms完成启动》中,我们介绍了如何使用
- 前言我们从以下几个方面研究:SpringBoot的启动依赖启动器starter有什么作用启动引导类是怎么运行的内置的tomcat服务器原理p
- JVM的对dll文件的装载过程操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境.1.创建JVM装载环境和
- 转成 Base64 形式的 System.String:string a = "base64字符串与普通字符串互转";
- 发现问题在C#连接SQL Server时,明明添加了引用using System.Data.SqlClient;却出现了下面这种情况:原因:
- 树概念及结构树是一种 非线性 的数据结构,它是由 n ( n>=0 )个有限结点组成一个具有层次关系的集合把它叫做树是因 为它看起来像
- 前言做Android的这两年时间,通过研究Android源码,也会Java并发处理多线程有了自己的一些理解。那么问题来了,如何实现一个串行的