本文实例为大家分享了Android实现自动转圈效果展示的具体代码,供大家参考,具体内容如下
在values文件夹下创建attrs.xml
1
2
3
4
5
6
7
8
9
|
<? xml version = "1.0" encoding = "utf-8" ?> < resources > < declare-styleable name = "MyPb" > < attr name = "circle_color" format = "color" /> < attr name = "circle_radius" format = "dimension" /> <!-- 尺寸 --> < attr name = "circle_x" format = "dimension" /> < attr name = "circle_y" format = "dimension" /> </ declare-styleable > </ resources > |
写一个类继承view
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
package widget; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; import com.bwie.zdycircle.R; import java.util.Timer; import java.util.TimerTask; /** * Created by Administrator on 2017/12/7. */ public class MyPb extends View { private float radius, cx, cy; private Paint paint; private float sweepAngle; // 旋转角度 public MyPb(Context context) { super (context, null ); } public MyPb(Context context, @Nullable AttributeSet attrs) { super (context, attrs); // 获取自定义的属性 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyPb); // 获取颜色 int color = a.getColor(R.styleable.MyPb_circle_color, Color.BLACK); // 获取不到给默认值 radius = a.getDimension(R.styleable.MyPb_circle_radius, 20 ); cx = a.getDimension(R.styleable.MyPb_circle_x, 100 ); cy = a.getDimension(R.styleable.MyPb_circle_y, 100 ); // 需要回收 a.recycle(); paint = new Paint(); paint.setAntiAlias( true ); // 抗锯齿 paint.setColor(color); paint.setStyle(Paint.Style.STROKE); // 空心 Timer timer = new Timer(); timer.schedule( new TimerTask() { @Override public void run() { if (sweepAngle > 360 ) { return ; } sweepAngle += 1 ; postInvalidate(); } }, 1000 , 20 ); // 每隔20毫秒执行一次 } @Override protected void onDraw(Canvas canvas) { paint.setColor(Color.BLUE); paint.setStrokeWidth( 10 ); canvas.drawCircle(cx, cy, radius, paint); // 画圆 paint.setStrokeWidth( 20 ); // 粗细 // 画运动的轨迹 paint.setColor(Color.RED); // 上下左右与圆重合,左边为圆心的横坐标减去半径,上边为纵坐标减去半径,以此类推 RectF rectF = new RectF(cx - radius, cy - radius, cx + radius, cy + radius); // 起始角度,旋转角度,第三个属性为是否填充,画笔 canvas.drawArc(rectF, - 90 , sweepAngle, false , paint); // 绘制文字 int progress = ( int ) (sweepAngle / 360f * 100 ); paint.setTextSize( 50 ); paint.setStrokeWidth( 0 ); paint.setColor(Color.BLACK); canvas.drawText(progress + "%" , cx - 20 , cy, paint); } } |
在主页面布局中引入自定义view类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:app = "http://schemas.android.com/apk/res-auto" xmlns:tools = "http://schemas.android.com/tools" android:layout_width = "match_parent" android:layout_height = "match_parent" tools:context = "com.bwie.zdycircle.MainActivity" > < widget.MyPb android:layout_width = "wrap_content" android:layout_height = "wrap_content" app:circle_color = "#0000ff" app:circle_radius = "70dp" app:circle_x = "200dp" app:circle_y = "200dp" /> </ LinearLayout > |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/cyq_0927/article/details/78748111