带颜色渐变效果的的矩形进度条

先看一下效果:

有没有亮瞎你的眼?

嗯...我说结尾的颜色。

先分析下实现的逻辑:我们用一个Drawable对象设置为button的背景;→Drawable对象我们取它的子类BitmapDrawable的一个实例,BitmapDrawAble需要一个Bitmap对象;→绘制这个bitmap:有一个外边的框框我们画一个矩形,进度那条线我们使用绘制一个Path来表现;→当前的进度值乘以矩形的周长是path的长度,根据这个长度和矩形周长的关系,使用path的lineTo,moveTo等函数对其进行设置,然后绘制这个path。→颜色根据进度值改变得到一个变化的颜色。

实现细节:

1,得到矩形宽高:在onclick事件中

        w = v.getMeasuredWidth();
        h = v.getMeasuredHeight();

2,根据进度得到Path,这里我是以顶部的中点为起点顺时针计算进度的,这里可以随意发挥,周长乘以这个进度得到path的长度,在按照你设计好的起点和方向画线,遇到顶点时判断path需不需要拐弯。

 /**
     * 根据百分比得到路径
     *
     * @param pro 0~1之间的一个浮点数
     * @return
     */
    public Path getPath(float pro) {
        pro = pro * (w * 2 + h * 2);
        Path p = new Path();
        p.moveTo(w / 2, 0);
        if (pro < w / 2) {
            p.lineTo(w / 2 + pro, 0);
            return p;
        } else {
            p.lineTo(w, 0);
        }
        if (pro < w / 2 + h) {
            p.lineTo(w, (pro - w / 2));
            return p;
        } else {
            p.lineTo(w, h);
        }
        if (pro < w / 2 + h + w) {
            p.lineTo((w - (pro - h - w / 2)), h);
            return p;
        } else {
            p.lineTo(0, h);
        }
        if (pro < w / 2 + h + h + w) {
            p.lineTo(0, h - (pro - w - h - w / 2));
            return p;
        } else {
            p.lineTo(0, 0);
        }
        p.lineTo(pro - w - h * 2 - w / 2, 0);
        return p;
    }

3,根据进度得到一个渐变色,渐变色的原理没有搜到,这里模拟了一下,RGB颜色让其中一个或几个通道的颜色值在一定范围内渐变。

   /**
     * 得到颜色梯度中间值 这里可以自己定义
     *
     * @param pro 0~1之间的一个浮点数
     * @return
     */
    public int getColor(float pro) {
        int c = Color.argb(255, 100+(int) ((1 - pro) * 130), (int) (pro * 255), 155);
        return c;
    }

4,得到背景Drawable对象,这里没什么好说的,画笔设置之前根据进度值得到的颜色,设置不同宽度分别画path和矩形。

 /**
     * 得到DrawAble对象
     *
     * @param path
     * @param color
     * @return
     */
    public Drawable getBgDrawAble(Path path, int color) {
        Bitmap b = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(b);
        Paint paint = new Paint();
        paint.setColor(color);
        paint.setStrokeWidth(30);
        paint.setStyle(Paint.Style.STROKE);
        c.drawPath(path, paint);
        paint.setStrokeWidth(3);
        c.drawRect(0,0,w,h,paint);
        BitmapDrawable bd = new BitmapDrawable(b);
        return bd;
    }

5,这里模拟一个下载的使用场景:

在onclick事件中开启一个异步任务:

 public void download(View v) {
        w = v.getMeasuredWidth();
        h = v.getMeasuredHeight();
        new DownloadTask(v).execute();
    }
 class DownloadTask extends AsyncTask<Void, Float, Boolean> {
        View v;

        public DownloadTask(View v) {
            this.v = v;
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            for (int i = 0; i <= 200; i++) {
                publishProgress(i * 1.0f / 200);
                try {
                    Thread.sleep(30);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return true;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            ((Button)v).setClickable(false);// 设置按钮不可点击
        }

        @Override
        protected void onPostExecute(Boolean integer) {
            super.onPostExecute(integer);
            ((Button)v).setText("下载完成");
            ((Button)v).setClickable(true);
        }

        @Override
        protected void onProgressUpdate(Float... values) {
            float rate = values[0];
            int col = getColor(rate);
            ((Button)v).setTextColor(col);
            v.setBackground(getBgDrawAble(getPath(rate), col));
            ((Button)v).setText("已下载" + (rate < 0.1 ? "0" : "") + (int)(rate*100) + "%");//计算下载进度并设置文字
            super.onProgressUpdate(values);
        }
    }

这个估计是最土的实现方法了,效率神马的待我脑补相关知识再考虑吧。

时间: 2024-07-28 23:05:33

带颜色渐变效果的的矩形进度条的相关文章

Android自定义圆角矩形进度条2

效果图: 或 方法讲解: (1)invalidate()方法 invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时, 调用invalidate()才能看到重新绘制的界面.invalidate()的调用是把之前的旧的view从主UI线程队列中pop掉.一般在自定义控件中会用到这个方法. (2)RectF方法的应用 RectF是用来绘画矩形的方法. RectF(left,top,right,bottom),四个参数的含义分别是父控件距离矩形左上右下

android圆角矩形进度条

最近做项目,有个一个需求,就是圆角进度条.效果图如下. 当时项目时间很紧,没多去想怎么实现最佳,就直接把美工给的圆角进度条裁剪成了四份.来做 Canvas 剪切绘制.这样虽然也能达到效果,但是服用性很差.最近网上搜索了很长时间,发现Paint画笔,有遮挡层的功能.android.graphics.Paint.setXfermode(Xfermode xfermode) .其中一个参数就是 Mode.DST_OUT 显示底图与上层图非交集的底图图像.于是就有个思路,先绘制圆角矩形进度条,然后设置画

Android自定义控件实现一个带文本与数字的圆形进度条

实现的效果图如下所示: 第一步:绘制下方有缺口的空心圆,称为外围大弧吧 anvas.clipRect(0, 0, mWidth, mHeight / 2 + radius - textHeight * 3 / 4); 第二步:计算绘制圆弧进度条时的起始角度,设置为外围大弧的左端点为进度值得起点,扫过的角度所占外围大弧的百分比就是进度值 第三步:绘制数字.文字.百分号 第四步:使用Handler Runnable 和DecelerateInterpolator是进度条和数字动起来 测试代码: fi

圆角进度条,带数字居中显示的圆角进度条

自己实现一个圆角进度条,待文字显示居中的圆角进度条,这在很多实际项目当中都会用到的 github地址:https://github.com/yongfengnice/CircleProgress 效果图如下所示:

我的Android进阶之旅------&gt;Android自定义View实现带数字的进度条(NumberProgressBar)

今天在Github上面看到一个来自于 daimajia所写的关于Android自定义View实现带数字的进度条(NumberProgressBar)的精彩案例,在这里分享给大家一起来学习学习!同时感谢daimajia的开源奉献! 第一步.效果展示 图1.蓝色的进度条 图2.红色的进度条 图3.多条颜色不同的进度条 图4.多条颜色不同的进度条 版权声明:本文为[欧阳鹏]原创文章,欢迎转载,转载请注明出处! [http://blog.csdn.net/ouyang_peng/article/deta

自定义带有渐变颜色的进度条

在项目中用到了渐变颜色的进度条 样式如下: 1.设置背景色颜色 2.设置边框圆角大小 3.设置渐变的颜色个数 4.设置渐变颜色 5.设置显示,隐藏进度条动画条纹 Demo地址:https://github.com/xqG/gradual-ProgressBar

libgdx学习记录13——矩形CD进度条绘制

利用ShapeRenderer可进行矩形进度条的绘制,多变形的填充等操作. 这是根据角度获取矩形坐标的函数. 1 public Vector2 GetPoint( float x, float y, float w, float h, float angle ){ 2 Vector2 point = new Vector2(); 3 while( angle >= 360 ){ 4 angle -= 360; 5 } 6 while( angle < 0 ){ 7 angle += 360;

Android自定义文本的进度条

工作中要求实现如下图中进度条(进度条上面是带比例数的文本,进度条颜色与比例数对应),写下自己的实现过程. 整体思路:Android中ProgressBar控件不支持自定义文本,所以需要写自定义progressBar. 1.progressBar上要自定义文本,需要重写onDraw()方法: 2.为实现进度是红色,底色是灰色效果,需要自定义progressBar样式 代码实现: 1.自定义的ProgressBar实现代码: 1 package com.example.myprogressbar;

WPF 实现圆形进度条

项目中用到圆形进度条,首先就想到使用 ProgressBar 扩展一个,在园子里找到 迷途的小榔头 给出的思路和部分代码,自己加以实现.在此感谢 迷途的小榔头! 进度小于60显示红色,大于60则显示绿色.效果如下: 基本思路: 本质上是一个进度条,只是外观有别于矩形进度条,所以需要修改ProgressBar的ControlTemplate. 进度条部分实际是一个扇形,用WPF动态绘出(原理参考迷途的小榔头讲解). 要将进度条的值(Value依赖属性)转换为进度条,需要一个Converter. 根