可设置 线性渐变-背景色-进度条颜色-进度条高度

效果图

普通效果

渐变效果

改变高度效果

步骤一:新建自定义控件BarPercentView继承View(代码可直接复制使用)

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Canvas;

import android.graphics.LinearGradient;

import android.graphics.Paint;

import android.graphics.RectF;

import android.graphics.Shader;

import android.support.annotation.Keep;

import android.support.annotation.Nullable;

import android.util.AttributeSet;

import android.view.View;

/**

* 条形进度条(可设置 线性渐变-背景色-进度条颜色-进度条高度)

* Created by ZWQ on 2018/6/29.

*/

public class BarPercentView extends View {

public static final float MAX = 100f;

public static final int RADIUS = 15; // 圆角矩形半径

private RectF rectFBg;

private RectF rectFProgress;

private Paint mPaint;

private int mWidth;

private float progressPercent;

private int bgColor, progressColor;

private int mHeight;

private int radius;

private int startColor, endColor;

private LinearGradient gradient;

private boolean isGradient;

public BarPercentView(Context context) {

super(context);

init();

}

public BarPercentView(Context context, @Nullable AttributeSet attrs) {

super(context, attrs);

//获取自定义属性

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BarPercentView);

bgColor = typedArray.getColor(R.styleable.BarPercentView_barBgColor, getResources().getColor(R.color.gray_cfcfcf));

progressColor = typedArray.getColor(R.styleable.BarPercentView_barProgressColor, getResources().getColor(R.color.orange_ffc032));

mHeight = typedArray.getDimensionPixelSize(R.styleable.BarPercentView_barHeight, context.getResources().getDimensionPixelSize(R.dimen._10dp));

isGradient = typedArray.getBoolean(R.styleable.BarPercentView_barIsGradient, false);

startColor = typedArray.getColor(R.styleable.BarPercentView_barStartColor, getResources().getColor(R.color.black_3A3D4E));

endColor = typedArray.getColor(R.styleable.BarPercentView_barEndColor, getResources().getColor(R.color.black_475B80));

radius = typedArray.getInt(R.styleable.BarPercentView_barRadius, RADIUS);

init();

}

public BarPercentView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);

int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);

int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);

int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);

if (widthSpecMode == MeasureSpec.EXACTLY || widthSpecMode == MeasureSpec.AT_MOST) {

mWidth = widthSpecSize;

} else {

mWidth = 0;

}

if (heightSpecMode == MeasureSpec.AT_MOST || heightSpecMode == MeasureSpec.UNSPECIFIED) {

mHeight = heightSpecSize;

} else {

mHeight = getContext().getResources().getDimensionPixelSize(R.dimen._10dp);

}

setMeasuredDimension(mWidth, mHeight);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

gradient = new LinearGradient(0, 0, getWidth(), mHeight, startColor, endColor, Shader.TileMode.CLAMP);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

//1、背景

mPaint.setShader(null);

mPaint.setColor(bgColor);

rectFBg.right = mWidth; //宽度

rectFBg.bottom = mHeight; //高度

canvas.drawRoundRect(rectFBg, radius, radius, mPaint);

//2、进度条

rectFProgress.right = mWidth * progressPercent;

rectFProgress.bottom = mHeight;

//3、是否绘制渐变色

if (isGradient) {

mPaint.setShader(gradient);//设置线性渐变

} else {

mPaint.setColor(progressColor);

}

if (progressPercent > 0 && rectFProgress.right < radius)//进度值小于半径时,设置大于半径的最小值,防止绘制不出圆弧矩形

rectFProgress.right = radius + 10;

canvas.drawRoundRect(rectFProgress, radius, radius, mPaint);//进度}

}

@Keep

public void setPercentage(float percentage) {

if (percentage / MAX >= 1) {

this.progressPercent = 1;

} else {

this.progressPercent = percentage / MAX;

}

invalidate();

}

private void init() {

rectFBg = new RectF(0, 0, 0, mHeight);

rectFProgress = new RectF(0, 0, 0, mHeight);

mPaint = new Paint();

//设置抗锯齿

mPaint.setAntiAlias(true);

}

public void setHeight(int mHeight) {

this.mHeight = mHeight;

invalidate();

}

public void setBgColor(int bgColor) {

this.bgColor = bgColor;

}

public void setProgressColor(int progressColor) {

this.progressColor = progressColor;

}

public void setStartColor(int startColor) {

this.startColor = startColor;

}

public void setEndColor(int endColor) {

this.endColor = endColor;

}

public void setGradient(boolean gradient) {

isGradient = gradient;

}

}

步骤二:自定义属性

在styles.xml添加自定义属性

步骤三:使用

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="wrap_content">

android:id="@id/bar_percent_progress"

android:layout_width="match_parent"

android:layout_height="10dp"

android:layout_margin="@dimen/_20dp"

app:barIsGradient="true"

app:barProgressColor="@color/black_3A3D4E"

app:circleBgColor="@color/gray_color2" />

1)动画效果

public static final int ANIMATOR_DURATION = 1000;

private BarPercentView progressView;

/**

* 设置百分比

* @param max 最大值

* @param current 占比

*/

private void setData(int max, float current) {

float percentage = (100f * current) / max;

ObjectAnimator animator = ObjectAnimator.ofFloat(progressView, "percentage", 0, percentage);

animator.setDuration(ANIMATOR_DURATION);

animator.start();

}

调用setData()方法,传入最大值和占比值即可

2)无动画效果

private BarPercentViewprogressView;

progressView.setPercentage(50);//传入百分比的值

android 自定义长条进度条_Android 条形进度条相关推荐

  1. 精通Android自定义View(十二)绘制圆形进度条

    1 绘图基础简析 1 精通Android自定义View(一)View的绘制流程简述 2 精通Android自定义View(二)View绘制三部曲 3 精通Android自定义View(三)View绘制 ...

  2. Android 自定义View实现环形带刻度的进度条

    本篇文章讲的是自定义View实现环形带刻度的进度条.和往常一样,主要还是想总结一下自定义View实现环形带刻度的进度条的开发过程以及一些需要注意的地方. 按照惯例,我们先来看看效果图 一.我们如何来实 ...

  3. Android——自定义带刻度的SeekBar单向拖动条

    时间过得真快,才发现好久没来逛逛了.没写博客的这段时间一直在做项目,连续完成了两个大型app,这个过程很享受,这是独立开发的,所以中途有很多很多的问题需要自己一个一个的去解决,现在接近尾声了,发现自己 ...

  4. android+属性动画+高度,android 自定义view+属性动画实现充电进度条

    近期项目中需要使用到一种类似手机电池充电进度的动画效果,以前没学属性动画的时候,是用图片+定时器的方式来完成的,最近一直在学习动画这一块,再加上复习一下自定义view的相关知识点,所以打算用属性动画和 ...

  5. android 自定义音乐圆形进度条,Android自定义View实现音频播放圆形进度条

    本篇文章介绍自定义View配合属性动画来实现如下的效果 实现思路如下: 根据播放按钮的图片大小计算出圆形进度条的大小 根据音频的时间长度计算出圆形进度条绘制的弧度 通过Handler刷新界面来更新圆形 ...

  6. Android自定义没有资源文件的圆形进度条ProgressBar

    最近公司开发的SDK中需要使用圆形加载进度条,而且说要那种动态的转圈圈的那种进度条.当然这种进度条想实现很简单,用几个资源图片,以动画循环播放就行.但考虑到是SDK,有资源文件不好打包,想打包就要用到 ...

  7. Android -- 自定义StepView实现个人信息验证进度条

    1,项目中要用到个人信息验证的在网上找了一下,好像有封装好了的StepView,首先感谢一下作者,这是作者的地址,效果图如下: 2,正准备撸起袖子就是一顿复制粘贴的时候,发现效果图成这个样子了(其实这 ...

  8. android 标题栏进度圈使用方法,Android 自定义标题栏 显示网页加载进度的方法实例...

    这阵子在做Lephone的适配,测试组提交一个bug:标题栏的文字较长时没有显示完全,其实这并不能算个bug,并且这个问题在以前其他机器也没有出现,只是说在Lephone的这个平台上显示得不怎么美观, ...

  9. Flutter进度条Flutter圆形进度条Flutter条形进度条Flutter Progress进度条LinearProgressIndicator

    更多文章请查看 flutter从入门 到精通 Flutter Progress 1 条形无固定值进度条 //LinearProgressIndicator不具备设置高度的选项,可以使用SizedBox ...

最新文章

  1. PHP设计模式——抽象工厂模式
  2. sqlserver转oracle后nvchar2(char),Oracle(二)老师
  3. HTML(三):表单元素
  4. 贪婪匹配和非贪婪匹配的区别
  5. keytool 错误:java.to.FileNotFoundException:
  6. java idea 模块_idea 多模块项目依赖父工程class找不到问题的方法
  7. 外设驱动库开发笔记26:nRF24L01无线通讯驱动
  8. Centos系统服务FAQ汇总(下)
  9. Spring : Spring自定义FactoryBean
  10. Exchange 2010分层通讯薄(HAB)配置指南
  11. 十大排序算法——C语言实现
  12. 高清免费壁纸网站推荐
  13. VXE-TABLE V4 表格表尾合并
  14. postgresql 高可用 repmgr 的使用之四 1 Primary + 1 Standby 的 switchover
  15. 计算机社团教学活动总结感悟,社团活动收获与感悟【四篇】
  16. Daily English - ... is driving me up a wall.
  17. Q1营收净利双双超预期 为何转型中的陆金所驱动力不足?
  18. linux常用命令英文全称及其中文注释【史上最全】
  19. html中按钮的形状,css button 样式
  20. vxworks串口的初始化和读写

热门文章

  1. 去除winrar的弹窗广告方法
  2. English words page one
  3. 制作公司组织结构图的案例
  4. python中rjust用法_python中rjust的用法
  5. 哈工大信息安全概论2021年期末考点
  6. Kudu范围分区、Hash分区、多级分区
  7. Html+Css面试题及答案
  8. 获取应用包名、获取应用名称、获取MetaData值、获取应用所有Permission、获取permission对应描述信息
  9. docker安装apollo
  10. Kafka Broker 基本架构二