渐变色仪表盘的实现(带初始化动画和多次改变动画始终点)

首先,需求很突然。本来已经确定了这个view的呈现方式。但是在准备上线的前一天,产品突然说,已经确定好的view显示不怎么好看 需要改。然后就是互相沉默。在UI设计师的加班加点之后,终于新版的view已经确定下来了。那就是我下面要说的渐变色仪表盘了。它是这样的....


渐变色仪表盘


好。需求已经出来了。那么就只能看看这个view要分成几个部分才能够更简单的做。终究胳膊扭不过大腿。

首先是最外面的边框是虚线并且渐变色。里面的实线也是渐变色的。

然后就是中间的虚线长短不一,颜色不一。中间的字体是白色和另外一种颜色,大小不一。

最后的一点就是红色的指针。并且指针也要有动画,指针最后的位置要指向环形进度条的位置。

1.画环形渐变色的虚线

bPaint.setShader(null); PathEffect pathEffect = new DashPathEffect(new float[]{ScreenUtils.dipToPx(1,mContext), ScreenUtils.dipToPx(3,mContext), ScreenUtils.dipToPx(1,mContext), ScreenUtils.dipToPx(3,mContext)}, 0); bPaint.setPathEffect(pathEffect); bPaint.setColor(Color.parseColor("#30FFFFFF")); bPaint.setStrokeWidth(ScreenUtils.dipToPx(8,mContext)); canvas.drawArc(new RectF(ScreenUtils.dipToPx(10,mContext),ScreenUtils.dipToPx(10,mContext),getWidth() - ScreenUtils.dipToPx(10,mContext), getHeight() - ScreenUtils.dipToPx(10,mContext)),150,240,false,bPaint);

2.画内环渐变色实线

bPaint.setPathEffect(null); bPaint.setStrokeWidth(ScreenUtils.dipToPx(6,mContext)); canvas.drawArc(new RectF(ScreenUtils.dipToPx(22,mContext),ScreenUtils.dipToPx(22,mContext),getWidth() - ScreenUtils.dipToPx(22,mContext), getHeight() - ScreenUtils.dipToPx(22,mContext)),150,240,false,bPaint);

3.画中间不同颜色的弧度,这里采用了两种虚线相间的方式。具体实现方式就是距离不一 颜色不一

PathEffect pathEffect1 = new DashPathEffect(new float[]{ScreenUtils.dipToPx(1,mContext), ScreenUtils.dipToPx(15,mContext), ScreenUtils.dipToPx(1,mContext), ScreenUtils.dipToPx(15,mContext)}, 0); bPaint.setPathEffect(pathEffect1); bPaint.setStrokeWidth(ScreenUtils.dipToPx(11,mContext)); canvas.drawArc(new RectF(ScreenUtils.dipToPx(32,mContext),ScreenUtils.dipToPx(32,mContext),getWidth() - ScreenUtils.dipToPx(32,mContext), getHeight() - ScreenUtils.dipToPx(32,mContext)),150,250,false,bPaint); PathEffect pathEffect2 = new DashPathEffect(new float[]{ScreenUtils.dipToPx(1,mContext), ScreenUtils.dipToPx(15,mContext), ScreenUtils.dipToPx(1,mContext), ScreenUtils.dipToPx(15,mContext)}, 0); bPaint.setPathEffect(pathEffect2); bPaint.setColor(Color.WHITE); bPaint.setStrokeWidth(ScreenUtils.dipToPx(6,mContext)); canvas.drawArc(new RectF(ScreenUtils.dipToPx(32,mContext),ScreenUtils.dipToPx(32,mContext),getWidth() - ScreenUtils.dipToPx(32,mContext), getHeight() - ScreenUtils.dipToPx(32,mContext)),160,230,false,bPaint);

4.然后就是指针箭头的绘制。这里因为当时时间很紧,就没有用canvas去画,直接让UI设计师给切了一张指针图。


指针

就是这样的指针图,因为指针要根据环形进度条的位置改变。所以我们要对这张图进行旋转操作。但是bitmap的旋转是按照中心点旋转的。所以我让UI设计师将指针切了上面看上去那么长。一半是指针,另外一半是空白。

首先是先加载指针图片。

BitmapDrawable drawable = (BitmapDrawable) (getResources().getDrawable(R.mipmap.iv_rate_view)); bitmap = drawable.getBitmap(); ByteArrayOutputStream out = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 50, out);

然后根据环形进度条的位置进行旋转,那么我这里就用到了Matrix矩阵对bitmap进行了旋转。

Matrix m = new Matrix(); m.setRotate(240 + mDefaultPercent * 240 * 0.01f, (float) bitmap.getWidth() / 2, bitmap.getHeight()); Bitmap bm1 = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true); canvas.drawBitmap(bm1,getWidth() / 2 - bm1.getWidth() / 2,getHeight() / 2 - bm1.getHeight() / 2 ,mPaint);

现在其实就已经差不多了。但是还有一个很重要的点。因为要有从0到100的动画,还要环形进度条的颜色是渐变色。所以我根据属性动画存储进度条每次增长的位置,然后取两种颜色中的某一点过渡色。具体取过渡色的方法如下。

public int getGradient(float fraction, int startColor, int endColor) { if (fraction > 1) fraction = 1; int alphaStart = Color.alpha(startColor); int redStart = Color.red(startColor); int blueStart = Color.blue(startColor); int greenStart = Color.green(startColor); int alphaEnd = Color.alpha(endColor); int redEnd = Color.red(endColor); int blueEnd = Color.blue(endColor); int greenEnd = Color.green(endColor); int alphaDifference = alphaEnd - alphaStart; int redDifference = redEnd - redStart; int blueDifference = blueEnd - blueStart; int greenDifference = greenEnd - greenStart; int alphaCurrent = (int) (alphaStart + fraction * alphaDifference); int redCurrent = (int) (redStart + fraction * redDifference); int blueCurrent = (int) (blueStart + fraction * blueDifference); int greenCurrent = (int) (greenStart + fraction * greenDifference); return Color.argb(alphaCurrent, redCurrent, greenCurrent, blueCurrent); }

然后view中的两个文字我就不贴出来了。有需要的q我就行。其实到这view已经差不多了。主要是动画的起始。这里就不贴出了。源码供上。有什么写的不好的地方,还请各位大神多多指教!

渐变色仪表盘

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容