相信大家都对自定义view有所了解,今天给大家展示一下我自己写的小Demo,一个自定义环形进度条,进度在不断加载的过程中颜色呈现渐变效果,并且中间的Textview展示进度值,有两个button控制暂停和自动循环播放,话不多说,直接上效果
先写自定义view类
package test.bwie.com.liugang20170612; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Shader; import android.util.AttributeSet; import android.util.TypedValue; import android.view.MotionEvent; import android.view.View; /** * @ Description: * @ Date:2017/6/12 * @ Author:刘刚 */ public class GradientProgressBar extends View { /*圆弧线宽*/ private float circleBorderWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics()); /*内边距*/ private float circlePadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics()); /*字体大小*/ private float textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 50, getResources().getDisplayMetrics()); /*绘制圆周的画笔*/ private Paint backCirclePaint; /*绘制圆周白色分割线的画笔*/ private Paint linePaint; /*绘制文字的画笔*/ private Paint textPaint; /*百分比*/ private int percent = 0; /*渐变圆周颜色数组*/ private int[] gradientColorArray = new int[]{Color.GREEN, Color.parseColor("#fe751a"), Color.parseColor("#13be23"), Color.GREEN}; private Paint gradientCirclePaint; public GradientProgressBar(Context context) { super(context); init(); } public GradientProgressBar(Context context, AttributeSet attrs) { super(context, attrs); init(); } public GradientProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { backCirclePaint = new Paint(); backCirclePaint.setStyle(Paint.Style.STROKE); backCirclePaint.setAntiAlias(true); backCirclePaint.setColor(Color.LTGRAY); backCirclePaint.setStrokeWidth(circleBorderWidth); // backCirclePaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.OUTER)); gradientCirclePaint = new Paint(); gradientCirclePaint.setStyle(Paint.Style.STROKE); gradientCirclePaint.setAntiAlias(true); gradientCirclePaint.setColor(Color.LTGRAY); gradientCirclePaint.setStrokeWidth(circleBorderWidth); linePaint = new Paint(); linePaint.setColor(Color.WHITE); linePaint.setStrokeWidth(5); textPaint = new Paint(); textPaint.setAntiAlias(true); textPaint.setTextSize(textSize); textPaint.setColor(Color.BLACK); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int measureWidth = MeasureSpec.getSize(widthMeasureSpec); int measureHeight = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(Math.min(measureWidth, measureHeight), Math.min(measureWidth, measureHeight)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //1.绘制灰色背景圆环 canvas.drawArc( new RectF(circlePadding * 2, circlePadding * 2, getMeasuredWidth() - circlePadding * 2, getMeasuredHeight() - circlePadding * 2), -90, 360, false, backCirclePaint); //2.绘制颜色渐变圆环 LinearGradient linearGradient = new LinearGradient(circlePadding, circlePadding, getMeasuredWidth() - circlePadding, getMeasuredHeight() - circlePadding, gradientColorArray, null, Shader.TileMode.MIRROR); gradientCirclePaint.setShader(linearGradient); gradientCirclePaint.setShadowLayer(10, 10, 10, Color.RED); canvas.drawArc( new RectF(circlePadding * 2, circlePadding * 2, getMeasuredWidth() - circlePadding * 2, getMeasuredHeight() - circlePadding * 2), -90, (float) (percent / 100.0) * 360, false, gradientCirclePaint); //半径 float radius = (getMeasuredWidth() - circlePadding * 3) / 2; //X轴中点坐标 int centerX = getMeasuredWidth() / 2; //3.绘制100份线段,切分空心圆弧 for (float i = 0; i < 360; i += 3.6) { double rad = i * Math.PI / 180; float startX = (float) (centerX + (radius - circleBorderWidth) * Math.sin(rad)); float startY = (float) (centerX + (radius - circleBorderWidth) * Math.cos(rad)); float stopX = (float) (centerX + radius * Math.sin(rad) + 1); float stopY = (float) (centerX + radius * Math.cos(rad) + 1); canvas.drawLine(startX, startY, stopX, stopY, linePaint); } //4.绘制文字 float textWidth = textPaint.measureText(percent + "%"); int textHeight = (int) (Math.ceil(textPaint.getFontMetrics().descent - textPaint.getFontMetrics().ascent) + 2); canvas.drawText(percent + "%", centerX - textWidth / 2, centerX + textHeight / 4, textPaint); } /** * 设置百分比 * * @param percent */ public void setPercent(int percent) { if (percent < 0) { percent = 0; } else if (percent > 100) { percent = 100; } this.percent = percent; invalidate(); } public int getPercent() { return percent; } //view完成绘制之后可以随意拖动图片可拖动 private int lastX = 0; private int lastY = 0; @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE: int dx = (int) event.getRawX() - lastX; int dy = (int) event.getRawY() - lastY; int left = getLeft() + dx; int top = getTop() + dy; int right = getRight() + dx; int bottom = getBottom() + dy; layout(left, top, right, bottom); lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_UP: break; default: break; } return true; } }
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main3" android:layout_width="match_parent" android:layout_height="match_parent" > <test.bwie.com.liugang20170612.GradientProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/gp" android:layout_centerInParent="true" /> <Button android:text="循环" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:layout_marginStart="51dp" android:layout_marginTop="48dp" android:id="@+id/btn1"/> <Button android:text="暂停" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/btn1" android:layout_alignParentEnd="true" android:layout_marginEnd="52dp" android:id="@+id/btn2"/> </RelativeLayout>最后在MainActivity中写具体的逻辑代码
package test.bwie.com.liugang20170612; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; public class Main3Activity extends AppCompatActivity implements View.OnClickListener { private GradientProgressBar gp; private Button btn1; private Button btn2; boolean flag=false; Handler handler=new Handler(){ private int mPercent; @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 0: mPercent = gp.getPercent(); gp.setPercent(++mPercent); if (mPercent >=100){ gp.setPercent(100); if (flag){ handler.removeMessages(0); handler.sendEmptyMessageDelayed(1,100); } }else { handler.sendEmptyMessageDelayed(0,100); } break; case 1: //逆时针旋转 gp.setPercent(mPercent--); if (mPercent<=0){ handler.removeMessages(1); gp.setPercent(0); handler.sendEmptyMessageDelayed(0,100); }else { handler.sendEmptyMessageDelayed(1,100); } break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); initView(); } private void initView() { gp = (GradientProgressBar) findViewById(R.id.gp); btn1 = (Button) findViewById(R.id.btn1); btn2 = (Button) findViewById(R.id.btn2); btn1.setOnClickListener(this); btn2.setOnClickListener(this); handler.sendEmptyMessageDelayed(0,100); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn1: flag=true; handler.sendEmptyMessageDelayed(0,100); break; case R.id.btn2: handler.removeMessages(0); //暂停我急 handler.removeMessages(1); break; } } }最后附上我的github地址 点击打开链接