服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android自定义View实现抽奖转盘

Android自定义View实现抽奖转盘

2022-08-30 13:36flying_fish_wj Android

这篇文章主要为大家详细介绍了Android自定义View实现抽奖转盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android自定义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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
public class LuckCircle extends SurfaceView implements SurfaceHolder.Callback,Runnable {
 
 private SurfaceHolder mHolder;
 private Canvas mCanvas;
 //用于绘制的线程
 private Thread mThread;
 //线程开关的控制
 private boolean isRunning;
 private String[] mStr = new String[]{"优惠券","十元话费","恭喜发财","恭喜发财","英雄皮肤","50M流量"};
 
 //物品的图片
 private int[] mImgs = new int[]{R.mipmap.ic_launcher,
 R.mipmap.ic_launcher,R.mipmap.ic_launcher,
 R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher};
 
 private int mItemCount = 6;
 
 //盘快的颜色
 private int[] mColor = new int[]{0xffffc300,0xFFD9B114,0xFFDC0B2E,0xFF5510A4,0xFF447C42,0xFFEC3636};
 
 //与图片对应的bitmap数组
 private Bitmap[] mImgBitmap;
 
 //整个盘块的范围
 private RectF mRange = new RectF();
 
 //整个盘块的直径
 private int mRadius;
 
 //绘制盘块的画笔
 private Paint mArcPaint;
 
 
 //绘制文本的画笔
 private Paint mTextPaint;
 
 //滚动速度
 private double mSpeed = 10;
 
 
 //绘制的角度
 private volatile int mStartAngle = 0;
 
 
 //判断是否点击了停止按钮
 private boolean isShouldEnd;
 
 
 //转盘的中心位置
 private int mCenter;
 
 //padding取四个padding中的最小值
 private int mPadding;
 
 //背景图
 //private Bitmap mBgBitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
 
 private float mTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,20,getResources().getDisplayMetrics());
 public LuckCircle(Context context) {
 this(context,null);
 }
 
 public LuckCircle(Context context, AttributeSet attrs) {
 super(context, attrs);
 mHolder = getHolder();
 mHolder.addCallback(this);
 // 可获得焦点
 setFocusable(true);
 setFocusableInTouchMode(true);
 // 设置常亮
 setKeepScreenOn(true);
 }
 
 
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 int width = Math.min(getMeasuredWidth(),getMeasuredHeight());
 
 mPadding = getPaddingLeft();
 
 mRadius = width - mPadding *2;
 
 mCenter = width / 2;
 setMeasuredDimension(width,width);
 }
 
 @Override
 public void surfaceCreated(SurfaceHolder holder) {
 // 初始化绘制盘块的画笔
 mArcPaint = new Paint();
 mArcPaint.setAntiAlias(true);
 mArcPaint.setDither(true);
 
 // 初始化绘制盘块的画笔
 mTextPaint = new Paint();
 mTextPaint.setColor(0XFF0B25CF);
 mTextPaint.setTextSize(mTextSize);
 
 // 初始化盘块绘制的范围
 mRange = new RectF(mPadding,mPadding,mPadding+mRadius,mPadding+mRadius);
 
 // 初始化图片
 mImgBitmap = new Bitmap[mItemCount];
 for (int i = 0; i < mImgBitmap.length; i++) {
 mImgBitmap[i] = BitmapFactory.decodeResource(getResources(),mImgs[i]);
 }
 isRunning = true;
 mThread = new Thread(this);
 mThread.start();
 }
 
 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
 
 }
 
 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
 isRunning = false;
 
 }
 
 @Override
 public void run() {
 while(isRunning){
 long start = System.currentTimeMillis();
 draw();
 long end = System.currentTimeMillis();
 if (end - start < 50) {
 try {
 Thread.sleep(50 - (end - start));
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 }
 }
 }
 private void draw(){
 try {
 mCanvas = mHolder.lockCanvas();
 if (mCanvas != null) {
 // 绘制背景
 drawBackground();
 // 绘制盘块
 float tmpAngle = mStartAngle;
 float sweepAngle = 360 /mItemCount;
 for (int i = 0; i < mItemCount; i++) {
 mArcPaint.setColor(mColor[i]);
 // 绘制盘块
 mCanvas.drawArc(mRange,tmpAngle,sweepAngle,true,mArcPaint);
 
 // 绘制文本
 drawText(tmpAngle,sweepAngle,mStr[i]);
 // 绘制Icon
 drawIcon(tmpAngle,mImgBitmap[i]);
 tmpAngle += sweepAngle;
 }
 mStartAngle += mSpeed;
 // 如果点击了停止按钮
 if (isShouldEnd) {
 mSpeed -= 1;
 }
 if (mSpeed <= 0) {
 mSpeed = 0;
 isShouldEnd = false;
 }
 }
 }catch (Exception e){
 
 }finally {
 if (mCanvas != null) {
 // 释放Canvas
 mHolder.unlockCanvasAndPost(mCanvas);
 }
 }
 }
 
 
 //点击启动旋转
 
 public void luckyStart(){
 mSpeed = 50;
 isShouldEnd = false;
 }
 public void luckEnd(){
 isShouldEnd = true;
 }
 public boolean isStart(){
 return mSpeed != 0;
 }
 public boolean isShouldEnd(){
 return isShouldEnd;
 }
 
 //绘制Icon
 
 private void drawIcon(float tmpAngle, Bitmap bitmap) {
 // 设置图片的宽度为直径的1/8;
 int imgWidth = mRadius / 8;
 
 float angle = (float) ((tmpAngle + 360 / mItemCount / 2)* Math.PI/180);
 
 int x = (int) (mCenter + mRadius/2/2 * Math.cos(angle));
 int y = (int) (mCenter + mRadius/2/2 * Math.sin(angle));
 // 确定图片的位置
 Rect rect = new Rect(x - imgWidth/2, y - imgWidth/2, x + imgWidth/2, y + imgWidth/2);
 mCanvas.drawBitmap(bitmap,null,rect,null);
 
 }
 
 
 //绘制每个盘块的文本
 
 private void drawText(float tmpAngle, float sweepAngle, String s) {
 Path path = new Path();
 path.addArc(mRange,tmpAngle,sweepAngle);
 // 利用水平偏移量让文字居中
 float measureText = mTextPaint.measureText(s);
 int hOffset = (int) (mRadius * Math.PI/mItemCount/2 - measureText/2);
 int vOffset = mRadius /2/6;
 mCanvas.drawTextOnPath(s,path,hOffset,vOffset,mTextPaint);
 }
 
 private void drawBackground() {
 mCanvas.drawColor(0xFF696565);
 Paint paint = new Paint();
 paint.setColor(0xFFF94905);
 mCanvas.drawCircle(getWidth()/2,getHeight()/2,getWidth()/2,paint);
 
 }
}

效果图:

Android自定义View实现抽奖转盘

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/flying_fish_wj/article/details/54845676

延伸 · 阅读

精彩推荐