自定义view实现圆形加载

来源:互联网 发布:mac大脚插件是什么 编辑:程序博客网 时间:2024/05/22 04:25
[java] view plain copy
 print?
  1. import android.content.Context;  
  2. import android.graphics.Canvas;  
  3. import android.graphics.Color;  
  4. import android.graphics.LinearGradient;  
  5. import android.graphics.Paint;  
  6. import android.graphics.RectF;  
  7. import android.graphics.Shader;  
  8. import android.util.AttributeSet;  
  9. import android.util.TypedValue;  
  10. import android.view.View;  
  11.   
  12. /** 
  13.  * Created by Administrator on 2017/9/3 0003. 
  14.  */  
  15.   
  16. public class MyView extends View{  
  17.   
  18.   
  19.     /*圆弧线宽*/  
  20.     private float circleBorderWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics());  
  21.     /*内边距*/  
  22.     private float circlePadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics());  
  23.     /*字体大小*/  
  24.     private float textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 50, getResources().getDisplayMetrics());  
  25.     /*绘制圆周的画笔*/  
  26.     private Paint backCirclePaint;  
  27.     /*绘制圆周白色分割线的画笔*/  
  28.     private Paint linePaint;  
  29.     /*绘制文字的画笔*/  
  30.     private Paint textPaint;  
  31.     /*百分比*/  
  32.     private int percent = 0;  
  33.     /*渐变圆周颜色数组*/  
  34.     private int[] gradientColorArray = new int[]{Color.GREEN, Color.parseColor("#fe751a"), Color.parseColor("#13be23"), Color.GREEN};  
  35.     private Paint gradientCirclePaint;  
  36.     private boolean flag = true;  
  37.     private boolean flag1 = true;  
  38.     private boolean flag3 = true;  
  39.   
  40.     public MyView(Context context) {  
  41.         super(context);  
  42.         init();  
  43.   
  44.     }  
  45.   
  46.     public MyView(Context context, AttributeSet attrs) {  
  47.         super(context, attrs);  
  48.         init();  
  49.     }  
  50.   
  51.     public MyView(Context context, AttributeSet attrs, int defStyleAttr) {  
  52.         super(context, attrs, defStyleAttr);  
  53.         init();  
  54.     }  
  55.   
  56.     private void init() {  
  57.         backCirclePaint = new Paint();  
  58.         backCirclePaint.setStyle(Paint.Style.STROKE);  
  59.         backCirclePaint.setAntiAlias(true);  
  60.         backCirclePaint.setColor(Color.LTGRAY);  
  61.         backCirclePaint.setStrokeWidth(circleBorderWidth);  
  62. //        backCirclePaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.OUTER));  
  63.   
  64.         gradientCirclePaint = new Paint();  
  65.         gradientCirclePaint.setStyle(Paint.Style.STROKE);  
  66.         gradientCirclePaint.setAntiAlias(true);  
  67.         gradientCirclePaint.setColor(Color.LTGRAY);  
  68.         gradientCirclePaint.setStrokeWidth(circleBorderWidth);  
  69.   
  70.         linePaint = new Paint();  
  71.         linePaint.setColor(Color.WHITE);  
  72.         linePaint.setStrokeWidth(5);  
  73.   
  74.         textPaint = new Paint();  
  75.         textPaint.setAntiAlias(true);  
  76.         textPaint.setTextSize(textSize);  
  77.         textPaint.setColor(Color.BLACK);  
  78.     }  
  79.   
  80.   
  81.     @Override  
  82.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  83.         int measureWidth = MeasureSpec.getSize(widthMeasureSpec);  
  84.         int measureHeight = MeasureSpec.getSize(heightMeasureSpec);  
  85.         setMeasuredDimension(Math.min(measureWidth, measureHeight), Math.min(measureWidth, measureHeight));  
  86.     }  
  87.   
  88.     @Override  
  89.     protected void onDraw(Canvas canvas) {  
  90.         super.onDraw(canvas);  
  91.         //1.绘制灰色背景圆环  
  92.         canvas.drawArc(  
  93.                 new RectF(circlePadding * 2, circlePadding * 2,  
  94.                         getMeasuredWidth() - circlePadding * 2, getMeasuredHeight() - circlePadding * 2), -90360false, backCirclePaint);  
  95.         //2.绘制颜色渐变圆环  
  96.         LinearGradient linearGradient = new LinearGradient(circlePadding, circlePadding,  
  97.                 getMeasuredWidth() - circlePadding,  
  98.                 getMeasuredHeight() - circlePadding,  
  99.                 gradientColorArray, null, Shader.TileMode.MIRROR);  
  100.         gradientCirclePaint.setShader(linearGradient);  
  101.         gradientCirclePaint.setShadowLayer(101010, Color.RED);  
  102.         canvas.drawArc(  
  103.                 new RectF(circlePadding * 2, circlePadding * 2,  
  104.                         getMeasuredWidth() - circlePadding * 2, getMeasuredHeight() - circlePadding * 2), -90, (float) (percent / 100.0) * 360false, gradientCirclePaint);  
  105.   
  106.         //半径  
  107.         float radius = (getMeasuredWidth() - circlePadding * 3) / 2;  
  108.         //X轴中点坐标  
  109.         int centerX = getMeasuredWidth() / 2;  
  110.   
  111.         //3.绘制100份线段,切分空心圆弧  
  112.         for (float i = 0; i < 360; i += 3.6) {  
  113.             double rad = i * Math.PI / 180;  
  114.             float startX = (float) (centerX + (radius - circleBorderWidth) * Math.sin(rad));  
  115.             float startY = (float) (centerX + (radius - circleBorderWidth) * Math.cos(rad));  
  116.   
  117.             float stopX = (float) (centerX + radius * Math.sin(rad) + 1);  
  118.             float stopY = (float) (centerX + radius * Math.cos(rad) + 1);  
  119.   
  120.             canvas.drawLine(startX, startY, stopX, stopY, linePaint);  
  121.         }  
  122.   
  123.         //4.绘制文字  
  124.         float textWidth = textPaint.measureText(percent + "%");  
  125.         int textHeight = (int) (Math.ceil(textPaint.getFontMetrics().descent - textPaint.getFontMetrics().ascent) + 2);  
  126.         canvas.drawText(percent + "%", centerX - textWidth / 2, centerX + textHeight / 4, textPaint);  
  127.         if (flag3) {  
  128.             if (flag1) {  
  129.                 setPercent(percent);  
  130.   
  131.             } else {  
  132.                 if (percent == 100) {  
  133.                     flag = false;  
  134.                 } else if (percent == 0) {  
  135.                     flag = true;  
  136.                 }  
  137.                 if (flag == false) {  
  138.                     setPercents(percent);  
  139.                 } else {  
  140.                     setPercent(percent);  
  141.                 }  
  142.             }  
  143.         } else {  
  144.             setPercentss(percent);  
  145.         }  
  146.   
  147.     }  
  148.   
  149.     public void setPercentss(int percent) {  
  150.         this.percent = percent;  
  151.         invalidate();  
  152.     }  
  153.   
  154.     public void setData(boolean flag3) {  
  155.         this.flag3 = flag3;  
  156.     }  
  157.   
  158.     /** 
  159.      * 设置百分比 
  160.      * 
  161.      * @param percent 
  162.      */  
  163.     public void setPercent(int percent) {  
  164.   
  165.         percent++;  
  166.         if (percent < 0) {  
  167.             percent = 0;  
  168.   
  169.         } else if (percent > 100) {  
  170.             percent = 100;  
  171.         }  
  172.   
  173.         this.percent = percent;  
  174.         invalidate();  
  175.   
  176.     }  
  177.   
  178.     public void setPercents(int percent) {  
  179.   
  180.         percent--;  
  181.         if (percent < 0) {  
  182.             percent = 0;  
  183.         } else if (percent > 100) {  
  184.             percent = 100;  
  185.         }  
  186.   
  187.         this.percent = percent;  
  188.         invalidate();  
  189.   
  190.     }  
  191.   
  192.     public void setRtate(boolean flag2) {  
  193.         this.flag1 = flag2;  
  194.     }  

下面就是xml的布局:

[java] view plain copy
 print?
  1. <Button  
  2.         android:id="@+id/zanting"  
  3.         android:textSize="25sp"  
  4.         android:text="暂停"  
  5.         android:layout_width="wrap_content"  
  6.         android:layout_height="wrap_content"  
  7.         android:layout_below="@+id/myview"  
  8.         android:layout_alignParentRight="true"  
  9.         android:layout_alignParentEnd="true"  
  10.         android:layout_marginRight="64dp"  
  11.         android:layout_marginEnd="64dp"  
  12.         android:layout_marginTop="74dp" />  
  13.   
  14.     <Button  
  15.         android:id="@+id/zidong"  
  16.         android:textSize="25sp"  
  17.         android:text="开始"  
  18.         android:layout_width="wrap_content"  
  19.         android:layout_height="wrap_content"  
  20.         android:layout_marginLeft="68dp"  
  21.         android:layout_marginStart="68dp"  
  22.         android:layout_alignBaseline="@+id/zanting"  
  23.         android:layout_alignBottom="@+id/zanting"  
  24.         android:layout_alignParentLeft="true"  
  25.         android:layout_alignParentStart="true" />  
  26.   
  27.     <com.example.administrator.xml_demo0903_yuanxingjiazai.MyView  
  28.         android:id="@+id/myview"  
  29.         android:layout_width="250dp"  
  30.         android:layout_height="250dp"  
  31.         android:layout_alignParentTop="true"  
  32.         android:layout_centerHorizontal="true"  
  33.         android:layout_marginTop="31dp" />  

现在就可以在mainactivity中添加控制按钮:

[java] view plain copy
 print?
  1. import android.os.Handler;  
  2. import android.os.Message;  
  3. import android.support.v7.app.AppCompatActivity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.widget.Button;  
  7.   
  8.   
  9.   
  10. public class MainActivity extends AppCompatActivity {  
  11.   
  12.     private Button button;  
  13.     private Button zanting;  
  14.     private MyView myView;  
  15.     private Handler handler=new Handler(){  
  16.         @Override  
  17.         public void handleMessage(Message msg) {  
  18.             super.handleMessage(msg);  
  19.   
  20.             myView.setData(true);  
  21.             myView.setRtate(false);  
  22.   
  23.         }  
  24.     };  
  25.     @Override  
  26.     protected void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.activity_main);  
  29.         myView = (MyView) findViewById(R.id.myview);  
  30.         button = (Button) findViewById(R.id.zidong);  
  31.         button.setOnClickListener(new View.OnClickListener() {  
  32.             @Override  
  33.             public void onClick(View v) {  
  34.   
  35.                 handler.sendEmptyMessage(0);  
  36.   
  37.             }  
  38.         });  
  39.         zanting = (Button) findViewById(R.id.zanting);  
  40.         zanting.setOnClickListener(new View.OnClickListener() {  
  41.             @Override  
  42.             public void onClick(View v) {  
  43.                 myView.setData(false);  
  44.             }  
  45.         });  
  46.     }