转载奇怪注明出处:王亟亟的大牛之路
继续我们Material Design的内容,这一篇讲的是进度条,上一篇是Switch地址如下:
进度和动态
在用户可以查看并与内容进行交互之前,尽可能地减少视觉上的变化,尽量使应用加载过程令人愉快。每次操作只能由一个活动指示器呈现,例如,对于刷新操作,你不能即用刷新条,又用动态圆圈来指示。
指示器类型
在操作中,对于完成部分可以确定的情况下,使用确定的指示器,他们能让用户对某个操作所需要的时间有个快速的了解。
在操作中,对于完成部分不确定的情况下,用户需要等待一定的时间,无需告知后用户台的情况以及所需时间,这时可以使用不确定的指示器。
指示器的类型有两种:线形进度指示器和圆形进度指示器。你可以使用其中任何一项来指示确定性和不确定性的操作。
线形进度指示器
线形进度指示器应始终从 0% 到 100% 显示,绝不能从高到低反着来。如果一个队列里有多个正在进行的操作,使用一个进度指示器来指示整体的所需要等待的时间。这样,当指示器达到 100% 时,它不会返回到0%再重新开始。
线形进度条应该放置在页眉或某块区域的边缘。
贴2个官方的演示:
条状的
环状的
例子的实现
高防高仿,包结构:
OK,我们来看下代码(解释就解释 环状的,条状的比较简单)!
final static String ANDROIDXML = "http://schemas.android.com/apk/res/android"; int backgroundColor = Color.parseColor("#1E88E5"); public ProgressBarCircularIndeterminate(Context context, AttributeSet attrs) { super(context, attrs); setAttributes(attrs); }21-30,构造函数以及调用初始化的方法
(AttributeSet attrs){ setMinimumHeight(Utils.dpToPx(32, getResources())); setMinimumWidth(Utils.dpToPx(32, getResources())); bacgroundColor = attrs.getAttributeResourceValue(ANDROIDXML,"background",-1); if(bacgroundColor != -1){ setBackgroundColor(getResources().getColor(bacgroundColor)); }else{ // Color by hexadecimal int background = attrs.getAttributeIntValue(ANDROIDXML, "background", -1); if (background != -1) setBackgroundColor(background); else setBackgroundColor(Color.parseColor("#1E88E5")); } setMinimumHeight(Utils.dpToPx(3, getResources())); }33-55行,获取xml的参数设置颜色,设置大小的最小值。
(){ int r = (this.backgroundColor >> 16) & 0xFF; int g = (this.backgroundColor >> 8) & 0xFF; int b = (this.backgroundColor >> 0) & 0xFF; Color.argb(128,r, g, b); }61-79行,颜色渐变的实现,第一次出现时调用。
(Canvas canvas) { super.onDraw(canvas); if(firstAnimationOver == false) drawFirstAnimation(canvas); if(cont > 0) drawSecondAnimation(canvas); invalidate(); }72-81行,具体绘制的操作,因为要判断是否第一次,所以调用了2种不同的方法,我们一个个看。
float radius1 = 0; float radius2 = 0; int cont = 0; boolean firstAnimationOver = false; /** * Draw first animation of view * @param canvas */ (Canvas canvas){ if(radius1 < getWidth()/2){ Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(makePressColor()); radius1 = (radius1 >= getWidth()/2)? (float)getWidth()/2 : radius1+1; canvas.drawCircle(getWidth()/2, getHeight()/2, radius1, paint); }else{ Bitmap bitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888); Canvas temp = new Canvas(bitmap); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setColor(makePressColor()); temp.drawCircle(getWidth()/2, getHeight()/2, getHeight()/2, paint); Paint transparentPaint = new Paint(); transparentPaint.setAntiAlias(true); transparentPaint.setColor(getResources().getColor(android.R.color.transparent)); transparentPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); if(cont >= 50){ radius2 = (radius2 >= getWidth()/2)? (float)getWidth()/2 : radius2+1; }else{ radius2 = (radius2 >= getWidth()/2-Utils.dpToPx(4, getResources()))? (float)getWidth()/2-Utils.dpToPx(4, getResources()) : radius2+1; } temp.drawCircle(getWidth()/2, getHeight()/2, radius2, transparentPaint); canvas.drawBitmap(bitmap, 0, 0, new Paint()); if(radius2 >= getWidth()/2-Utils.dpToPx(4, getResources())) cont++; if(radius2 >= getWidth()/2) firstAnimationOver = true; } }83-121,第一次绘制会调用的方法。