ZoomBar 设计
package com.example.canvasdemo; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.EmbossMaskFilter;
import android.graphics.Paint;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.view.View;
/**
*
* @author liemng QQ:859686819
*
*/
public class ZoomPinch extends View{ private Paint mLinePaint;
private Paint mPointPaint;
private int mLineWitdh = 18;
private int mPointPaintWitdh = 12; private String mForeground = "#FFFFFF";
private String mBackground = "#ff0000"; // 梯度渐变的填充颜色
private int[] arcColors = new int[] { 0xFF48cbdc, 0xFF4c9fda, 0xFFeac83d,
0xFFc7427e, 0xFF48cbdc, 0xFF48cbdc }; public ZoomPinch(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initData();
} public ZoomPinch(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public ZoomPinch(Context context) {
this(context, null);
} public void initData(){
//--绘制线段画笔
mLinePaint = new Paint();
//--抗锯齿
mLinePaint.setAntiAlias(true);
//--防抖
mLinePaint.setDither(true);
//--线段两端的形状
mLinePaint.setStrokeCap(Paint.Cap.ROUND);
// 线段的宽度
mLinePaint.setStrokeWidth(mLineWitdh);
//--画笔颜色
mLinePaint.setColor(Color.parseColor("#000000")); //--设置光源的方向
float[] direction = new float[]{ 1, 1, 1 };
//--设置环境光亮度
float light = 0.4f;
//--选择要应用的反射等级
float specular = 6;
//--向mask应用一定级别的模糊
float blur = 3.5f;
EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);
mLinePaint.setMaskFilter(emboss); //--绘制圆环的画笔
mPointPaint = new Paint();
//--抗锯齿
mPointPaint.setAntiAlias(true);
//--防抖
mPointPaint.setDither(true);
//--线段两端的形状
mPointPaint.setStrokeCap(Paint.Cap.ROUND);
//--线段的宽度
mPointPaint.setStrokeWidth(mPointPaintWitdh);
//--画笔颜色
SweepGradient mSweepGradient = new SweepGradient(mH/2, mW/2, arcColors, null);
mPointPaint.setShader(mSweepGradient);
} private int mH ;
private int mW ;
private int mMaxHight = 500;
private int topsurplus = mLineWitdh/2 + 10; private int mProgres = 0;
private float mTotalProgress = mMaxHight; private int inCircleR = 6;
private int outCircleR = 14; private int currentLineProgress = 0; @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// TODO Auto-generated method stub
super.onSizeChanged(w, h, oldw, oldh); mH = w;
mW = h;
} @Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
//--平移画布
canvas.translate(0, topsurplus);
//--绘制背景色
mLinePaint.setColor(Color.parseColor(mBackground));
canvas.drawLine(mW/2, mMaxHight, mW/2, 0, mLinePaint); //--绘制前景色
mLinePaint.setColor(Color.parseColor(mForeground));
canvas.drawLine(mW/2, mMaxHight, mW/2, mMaxHight - currentLineProgress, mLinePaint); //--绘制圆环
mPointPaint.setStyle(Paint.Style.STROKE);
canvas.drawCircle(mW/2, mMaxHight - currentLineProgress , outCircleR, mPointPaint);
mPointPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(mW/2, mMaxHight - currentLineProgress , inCircleR, mPointPaint);
} public void setBackgroup(String mBackgroup){
this.mBackground = mBackgroup;
} public void setForeground(String mForeground){
this.mForeground = mForeground;
} public void setProgress(float mProgress){
if(this.mProgres >= mTotalProgress && mProgress > 0)
return;
this.mProgres += mProgress; float percent = mProgres/mTotalProgress; if(percent <0){
this.mProgres = 0;
return;
}
this.currentLineProgress = (int) (percent*mMaxHight);
invalidate();
} public void setMax(float mTotalProgress){
if(mTotalProgress < 0)
new IllegalArgumentException("invalid args && doubi");
this.mTotalProgress = mTotalProgress;
}
}
效果图如下:

左侧增加文字属性:
package com.example.canvasdemo; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.EmbossMaskFilter;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.view.View;
/**
*
* @author liemng QQ:859686819
*
*/
public class ZoomPinch extends View{ private Paint mLinePaint;
private Paint mPointPaint;
private int mLineWitdh = 18;
private int mPointPaintWitdh = 12; private String mForeground = "#FFFFFF";
private String mBackground = "#ff0000"; private String[] mTips = new String[]{"1.0X", "2.0X", "3.0X", "4.0X"}; // 梯度渐变的填充颜色
private int[] arcColors = new int[] { 0xFF48cbdc, 0xFF4c9fda, 0xFFeac83d,
0xFFc7427e, 0xFF48cbdc, 0xFF48cbdc }; public ZoomPinch(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initData();
} public ZoomPinch(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public ZoomPinch(Context context) {
this(context, null);
} public void initData(){
//--绘制线段画笔
mLinePaint = new Paint();
//--抗锯齿
mLinePaint.setAntiAlias(true);
//--防抖
mLinePaint.setDither(true);
//--线段两端的形状
mLinePaint.setStrokeCap(Paint.Cap.ROUND);
// 线段的宽度
mLinePaint.setStrokeWidth(mLineWitdh);
//--画笔颜色
mLinePaint.setColor(Color.parseColor("#000000")); //--设置光源的方向
float[] direction = new float[]{ 1, 1, 1 };
//--设置环境光亮度
float light = 0.4f;
//--选择要应用的反射等级
float specular = 6;
//--向mask应用一定级别的模糊
float blur = 3.5f;
EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);
mLinePaint.setMaskFilter(emboss); //--绘制圆环的画笔
mPointPaint = new Paint();
//--抗锯齿
mPointPaint.setAntiAlias(true);
//--防抖
mPointPaint.setDither(true);
//--线段两端的形状
mPointPaint.setStrokeCap(Paint.Cap.ROUND);
//--线段的宽度
mPointPaint.setStrokeWidth(mPointPaintWitdh);
//--画笔颜色
SweepGradient mSweepGradient = new SweepGradient(mH/2, mW/2, arcColors, null);
mPointPaint.setShader(mSweepGradient); mTextPaint = new Paint();
mTextPaint.setTextSize(32);
mTextPaint.setColor(Color.parseColor("#FFFFFF"));
} private int averH; private int mH ;
private int mW ;
private int mMaxHight = 500;
private int topsurplus = mLineWitdh/2 + 10; private int mProgres = 0;
private float mTotalProgress = mMaxHight; private int inCircleR = 6;
private int outCircleR = 14; private int currentLineProgress = 0;
private Paint mTextPaint; @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh); mH = w;
mW = h;
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//--平移画布
canvas.translate(0, topsurplus);
//--绘制背景色
mLinePaint.setColor(Color.parseColor(mBackground));
canvas.drawLine(mW/2, mMaxHight, mW/2, 0, mLinePaint); //--绘制前景色
mLinePaint.setColor(Color.parseColor(mForeground));
canvas.drawLine(mW/2, mMaxHight, mW/2, mMaxHight - currentLineProgress, mLinePaint); //--绘制圆环
mPointPaint.setStyle(Paint.Style.STROKE);
canvas.drawCircle(mW/2, mMaxHight - currentLineProgress , outCircleR, mPointPaint);
mPointPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(mW/2, mMaxHight - currentLineProgress , inCircleR, mPointPaint);
//--绘制左侧文字
for (int i = 0; i < mTips.length; i++) {
float textW = mTextPaint.measureText(mTips[i]);
FontMetrics fontMetrics = mTextPaint.getFontMetrics();
int textH = (int) (fontMetrics.descent - fontMetrics.ascent);
if(i == 0){
canvas.drawText(mTips[i], mW/2 - textW*3/2, mMaxHight, mTextPaint);
continue;
}
if(i == (mTips.length -1)){
canvas.drawText(mTips[i], mW/2 - textW*3/2, topsurplus, mTextPaint);
continue;
}
averH = mMaxHight/(mTips.length -1); canvas.drawText(mTips[i], mW/2 - textW*3/2, mMaxHight - topsurplus - (averH*i - textH/2) , mTextPaint);
} } public void setBackgroup(String mBackgroup){
this.mBackground = mBackgroup;
} public void setForeground(String mForeground){
this.mForeground = mForeground;
} public void setProgress(float mProgress){
if(this.mProgres >= mTotalProgress && mProgress > 0)
return;
this.mProgres += mProgress; float percent = mProgres/mTotalProgress; if(percent <0){
this.mProgres = 0;
return;
}
this.currentLineProgress = (int) (percent*mMaxHight);
invalidate();
} public void setMax(float mTotalProgress){
if(mTotalProgress < 0)
new IllegalArgumentException("invalid args && doubi");
this.mTotalProgress = mTotalProgress;
}
}
效果图如下:

ZoomBar 设计的更多相关文章
- 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑
阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...
- 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成
阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...
- 设计爬虫Hawk背后的故事
本文写于圣诞节北京下午慵懒的午后.本文偏技术向,不过应该大部分人能看懂. 五年之痒 2016年,能记入个人年终总结的事情没几件,其中一个便是开源了Hawk.我花不少时间优化和推广它,得到的评价还算比较 ...
- 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车
阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...
- 如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念
一.前言 DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了.自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平 ...
- 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文
阅读目录 前言 明确业务细节 建模 实现 结语 一.前言 上一篇我们已经确立的购买上下文和销售上下文的交互方式,传送门在此:http://www.cnblogs.com/Zachary-Fan/p/D ...
- 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文
阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...
- 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发
阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...
- 如何一步一步用DDD设计一个电商网站(四)—— 把商品卖给用户
阅读目录 前言 怎么卖 领域服务的使用 回到现实 结语 一.前言 上篇中我们讲述了“把商品卖给用户”中的商品和用户的初步设计.现在把剩余的“卖”这个动作给做了.这里提醒一下,正常情况下,我们的每一步业 ...
随机推荐
- 51nod百度之星2016练习赛
今天看了看51nod发现有这样一个练习赛,就做了做.因为实力太弱想不出E题,各位神犇勿D. (5.26UPD:E题想粗来了) A 区间交 不难发现若干线段[li,ri]的交就是[max(li),min ...
- C#中如何在字符串中设置上标
一.HTML中:如字符串"21st" 想要把st 设置为上标,在html标签中是21<sup>st</sup> 二.C#编辑器中你可以使用 unicode ...
- Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
What it is saying is, it found the DLL, but it couldn't find a type named "namespace.User" ...
- Curl参数一览
* 目录 1. 介绍 2. curl扩展的安装 3. curl_init 4. curl_setopt 5. curl_exec 6. curl_close 7. curl_version * 介绍 ...
- 【LeetCode】16. 4Sum
题目:Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...
- Linux_磁盘管理
一.linux磁盘管理 命令:fdisk -l brwx-rw--- 其中b(占位符)代表block,块设备文件 sda,sdb... --> 硬盘 其中sda1,sda2..sdb1,sdb2 ...
- php+curl上传文件
因为公司项目用java做的,需要我这边用php上传文件.只给了个接口,参数都不明确,然后这边不提交表单,在生成pdf之后就立马上传.用了php+curl,总是没上传成功,这里看到了篇文章http:// ...
- shell bash ksh
shell 是一个交互性命令解释器.shell独立于操作系统,这种设计让用户可以灵活选择适合自己的shell.shell让你在命令行键入命令,经过shell解释后传送给操作系统(内核)执行. ...
- 代理模式 & Java原生动态代理技术 & CGLib动态代理技术
第一部分.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常 ...
- JSTL标签使用说明
使用jstl需进行以下操作 a.下载jstl. b.解压jar文件将jstl.jar和standard.jar文件放到项目lib文件夹. c.在需要使用jstl地方引用标签库,比如在jsp页面引用以下 ...