package com.llf.basemodel.commonwidget; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; import android.support.v4.content.ContextCompat; import android.util.AttributeSet; import android.util.TypedValue; import android.widget.RelativeLayout; import com.llf.basemodel.R; /** * Created by llf on 2017/2/23. * 加载的view */ public class ProgressBarCircularIndeterminate extends RelativeLayout { final static String ANDROIDXML = "http://schemas.android.com/apk/res/android"; final int disabledBackgroundColor = ContextCompat.getColor(this.getContext(),R.color.main_color); int beforeBackground; float radius1 = 0; float radius2 = 0; int cont = 0; boolean firstAnimationOver = false; int backgroundColor = ContextCompat.getColor(this.getContext(),R.color.main_color); public ProgressBarCircularIndeterminate(Context context) { this(context, null); } public ProgressBarCircularIndeterminate(Context context, AttributeSet attrs) { super(context, attrs); setAttributes(attrs); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); if (enabled) setBackgroundColor(beforeBackground); else setBackgroundColor(disabledBackgroundColor); invalidate(); } boolean animation = false; @Override protected void onAnimationStart() { super.onAnimationStart(); animation = true; } @Override public void onAnimationEnd() { super.onAnimationEnd(); animation = false; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (animation) invalidate(); if (firstAnimationOver == false) drawFirstAnimation(canvas); if (cont > 0) drawSecondAnimation(canvas); invalidate(); } protected void setAttributes(AttributeSet attrs) { setMinimumHeight(dpToPx(32, getResources())); setMinimumWidth(dpToPx(32, getResources())); int bacgroundColor = attrs.getAttributeResourceValue(ANDROIDXML, "background", -1); if (bacgroundColor != -1) { setBackgroundColor(getResources().getColor(bacgroundColor)); } else { int background = attrs.getAttributeIntValue(ANDROIDXML, "background", -1); if (background != -1) setBackgroundColor(background); else setBackgroundColor(ContextCompat.getColor(this.getContext(),R.color.main_color)); } setMinimumHeight(dpToPx(3, getResources())); } protected int makePressColor() { int r = (this.backgroundColor >> 16) & 0xFF; int g = (this.backgroundColor >> 8) & 0xFF; int b = (this.backgroundColor >> 0) & 0xFF; return Color.argb(128, r, g, b); } /** * Draw first animation of view * * @param canvas */ private void drawFirstAnimation(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 - dpToPx(4, getResources())) ? (float) getWidth() / 2 - dpToPx(4, getResources()) : radius2 + 1; } temp.drawCircle(getWidth() / 2, getHeight() / 2, radius2, transparentPaint); canvas.drawBitmap(bitmap, 0, 0, new Paint()); if (radius2 >= getWidth() / 2 - dpToPx(4, getResources())) cont++; if (radius2 >= getWidth() / 2) firstAnimationOver = true; } } int arcD = 1; int arcO = 0; float rotateAngle = 0; int limite = 0; /** * Draw second animation of view * * @param canvas */ private void drawSecondAnimation(Canvas canvas) { if (arcO == limite) arcD += 6; if (arcD >= 290 || arcO > limite) { arcO += 6; arcD -= 6; } if (arcO > limite + 290) { limite = arcO; arcO = limite; arcD = 1; } rotateAngle += 4; canvas.rotate(rotateAngle, getWidth() / 2, getHeight() / 2); 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(backgroundColor); temp.drawArc(new RectF(0, 0, getWidth(), getHeight()), arcO, arcD, true, paint); Paint transparentPaint = new Paint(); transparentPaint.setAntiAlias(true); transparentPaint.setColor(getResources().getColor(android.R.color.transparent)); transparentPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); temp.drawCircle(getWidth() / 2, getHeight() / 2, (getWidth() / 2) - dpToPx(4, getResources()), transparentPaint); canvas.drawBitmap(bitmap, 0, 0, new Paint()); } public void setBackgroundColor(int color) { super.setBackgroundColor(getResources().getColor(android.R.color.transparent)); if (isEnabled()) beforeBackground = backgroundColor; this.backgroundColor = color; } public static int dpToPx(float dp, Resources resources) { float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, resources.getDisplayMetrics()); return (int) px; } }