-
-
android抽奖程序,一个抽奖大转盘代码,里面定义了很多图形方法和动画,SlyderView.java源代码如下:
001
import
android.app.Activity;
002
import
android.content.Context;
003
import
android.graphics.BlurMaskFilter;
004
import
android.graphics.Canvas;
005
import
android.graphics.Color;
006
import
android.graphics.ColorMatrixColorFilter;
007
import
android.graphics.EmbossMaskFilter;
008
import
android.graphics.MaskFilter;
009
import
android.graphics.Paint;
010
import
android.graphics.PorterDuffXfermode;
011
import
android.graphics.Paint.Style;
012
import
android.graphics.PorterDuff.Mode;
013
import
android.graphics.Path;
014
import
android.graphics.RadialGradient;
015
import
android.graphics.RectF;
016
import
android.graphics.Shader.TileMode;
017
import
android.util.AttributeSet;
018
import
android.util.TypedValue;
019
import
android.view.View;
020
public
class
SlyderView
extends
View{
021
public
SlyderView(Context context, AttributeSet attrs,
int
defStyleAttr) {
022
super
(context, attrs, defStyleAttr);
023
init(context);
024
}
025
public
SlyderView(Context context, AttributeSet attrs) {
026
super
(context, attrs);
027
init(context);
028
}
029
public
SlyderView(Context context) {
030
super
(context);
031
init(context);
032
}
033
/**
034
* 屏幕宽度
035
*/
036
private
int
screenW;
037
/**
038
* 屏幕的高度
039
*/
040
private
int
screenH;
041
/**
042
* 分割的度数
043
*/
044
private
int
[] drgrees = {
20
,
50
,
40
,
90
,
70
,
40
,
50
};
045
/***
046
* 分割的文字
047
*/
048
private
String [] strs = {
"level1"
,
"level2"
,
"level3"
,
"level4"
,
"level5"
,
"level6"
,
"level7"
};
049
/**
050
* 分割的颜色
051
*/
052
private
int
[] colos =
new
int
[] {
0xfed9c960
,
0xfe57c8c8
,
0xfe9fe558
,
0xfef6b000
,
0xfef46212
,
0xfecf2911
,
0xfe9d3011
};
053
/**
054
* 画笔
055
*/
056
private
Paint paint;
057
/**
058
* 文字的大小
059
*/
060
private
float
textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
15
, getResources().getDisplayMetrics());
061
/**
062
* 文字的颜色
063
*/
064
private
int
textcolor = Color.WHITE;
065
/**
066
* 园的半径
067
*/
068
private
float
radius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
100
, getResources().getDisplayMetrics());
069
/**
070
* 画文字的距离
071
*/
072
private
float
textdis = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
80
, getResources().getDisplayMetrics());
073
/**
074
* 画箭头的大小
075
*/
076
private
float
roketSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
10
, getResources().getDisplayMetrics());
077
078
private
float
initDegress =
0
;
079
/**
080
* 圆心
081
*/
082
private
float
centerX;
083
/**
084
* 圆心
085
*/
086
private
float
centerY;
087
/**
088
* 立体边缘
089
*/
090
private
MaskFilter filter =
new
EmbossMaskFilter(
new
float
[] {
1
,
1
,
1
},
0
.4f,
6
,
3
.5f);
091
private
MaskFilter outerFilter =
new
BlurMaskFilter(
10
, BlurMaskFilter.Blur.OUTER);
092
private
MaskFilter innerFilter =
new
BlurMaskFilter(
10
, BlurMaskFilter.Blur.INNER);
093
@SuppressWarnings
(
"deprecation"
)
094
private
void
init(Context context){
095
paint =
new
Paint();
096
paint.setAntiAlias(
true
);
097
paint.setStyle(Style.FILL);
098
paint.setColor(Color.WHITE);
099
screenW = ((Activity)context).getWindowManager().getDefaultDisplay().getWidth();
100
screenH = ((Activity)context).getWindowManager().getDefaultDisplay().getHeight();
101
int
[] colores =
new
int
[
3
];
102
colores[
0
] = Color.rgb(
0xfF
,
0x99
,
0x00
);
103
colores[
1
] = Color.rgb(
0xff
,
0xff
,
0x00
);
104
colores[
2
] = Color.rgb(
0xff
,
0x99
,
0x00
);
105
float
[] positions =
new
float
[
3
];
106
positions[
0
] =
0
.0f;
107
positions[
1
] =
0
.5f;
108
positions[
2
] =
1
.0f;
109
gradient =
new
RadialGradient(centerX, centerY, radius/
5
, colores, positions, TileMode.CLAMP);
110
}
111
/**
112
* 绘制三角箭头
113
*/
114
private
Path path =
new
Path();
115
/**
116
* 绘制矩形框
117
*/
118
private
RectF oval;
119
/**
120
* 外圆内阴影矩阵
121
*/
122
private
ColorMatrixColorFilter colorFilter =
new
ColorMatrixColorFilter(
new
float
[]{
123
1
,
0
,
0
,
0
,
0
,
124
0
,
1
,
0
,
0
,
0
,
125
0
,
0
,
1
,
0
,
0
,
126
0
,
0
,
0
,-
1
,
255
127
});
128
@Override
129
protected
void
onDraw(Canvas canvas) {
130
super
.onDraw(canvas);
131
centerX = screenW/
2
;
132
centerY = screenH/
2
;
133
oval =
new
RectF(centerX-radius,centerY-radius,centerX+radius,centerY+radius);
134
float
start =
0
;
135
paint.setColor(Color.rgb(
0xdd
,
0xdd
,
0xdd
));
136
paint.setAlpha(
127
);
137
canvas.drawCircle(centerX, centerY, radius+
10
, paint);
138
paint.setAlpha(
255
);
139
//画扇形
140
paint.setAntiAlias(
true
);
141
for
(
int
i=
0
;i<drgrees.length;i++){
142
float
sweepAngle = drgrees[i];
143
float
startAngle = start;
144
paint.setColor(colos[i%colos.length]);
145
canvas.drawArc(oval, startAngle, sweepAngle,
true
, paint);
146
start += drgrees[i];
147
}
148
//画文字
149
paint.setColor(textcolor);
150
paint.setAntiAlias(
true
);
151
paint.setTextSize(textSize);
152
paint.setTextAlign(Paint.Align.RIGHT);
153
start =
0
;
154
for
(
int
i=
0
;i<drgrees.length;i++){
155
canvas.save();
156
canvas.rotate(start+drgrees[i]/
2
, centerX, centerY);
157
canvas.drawText(strs[i], centerX+textdis, centerY, paint);
158
canvas.restore();
159
start += drgrees[i];
160
}
161
int
saveCount = canvas.save();
162
//画外层立体效果
163
paint.setColorFilter(colorFilter);
164
canvas.saveLayer(oval,paint,Canvas.ALL_SAVE_FLAG);
165
paint.setColorFilter(
null
);
166
canvas.drawARGB(
255
,
0
,
0
,
0
);
167
paint.setXfermode(
new
PorterDuffXfermode(Mode.CLEAR));
168
canvas.drawCircle(centerX, centerY, radius, paint);
169
paint.setXfermode(
null
);
170
paint.setMaskFilter(innerFilter);
171
paint.setColor(Color.argb(
0xff
,
0
,
0
,
0
));
172
canvas.drawCircle(centerX, centerY, radius, paint);
173
paint.setMaskFilter(
null
);
174
canvas.restoreToCount(saveCount);
175
//画内圆和内园效果
176
canvas.save();
177
paint.setColor(Color.argb(
0xff
,
0
,
0
,
0
));
178
paint.setAntiAlias(
true
);
179
paint.setMaskFilter(outerFilter);
180
canvas.rotate(initDegress, centerX, centerY);
181
canvas.drawCircle(centerX, centerY, radius/
3
, paint);
182
paint.setMaskFilter(
null
);
183
paint.setColor(Color.WHITE);
184
canvas.drawCircle(centerX, centerY, radius/
3
, paint);
185
//画三角型叠加当箭头
186
path.moveTo(centerX-radius/
3
, centerY);
187
path.lineTo(centerX, centerY-radius/
3
-roketSize);
188
path.lineTo(centerX+radius/
3
, centerY);
189
path.close();
190
canvas.drawPath(path, paint);
191
canvas.restore();
192
paint.setMaskFilter(filter);
193
paint.setColor(Color.GREEN);
194
paint.setShader(gradient);
195
canvas.drawCircle(centerX, centerY, radius/
5
, paint);
196
paint.setMaskFilter(
null
);
197
paint.setShader(
null
);
198
//重绘调整三角的指向达到滚动的效果,现实项目中可不能这样用的,效率太低下了,拆分View用动画完成滚动才是王道
199
if
(isRunning){
200
if
(initDegress>=
360
){
201
initDegress =
0
;
202
}
203
initDegress +=
4
;
204
invalidate();
205
}
206
if
(isStoping){
207
if
(initDegress<=
360
){
208
initDegress+=
4
;
209
invalidate();
210
}
else
{
211
if
(initDegress-
360
<stop_degress){
212
initDegress+=
2
;
213
invalidate();
214
}
215
}
216
}
217
}
218
private
boolean
isRunning =
false
;
219
private
boolean
isStoping =
false
;
220
private
int
stop_degress =
90
;
221
/**
222
* 渐变
223
*/
224
private
RadialGradient gradient;
225
public
void
play(){
226
isRunning =
true
;
227
invalidate();
228
}
229
public
void
stop(
int
count){
230
for
(
int
i =
0
;i<=count;i++){
231
if
(i == count){
232
stop_degress +=drgrees[i]/
2
;
233
}
else
{
234
stop_degress +=drgrees[i];
235
}
236
}
237
isStoping =
true
;
238
isRunning =
false
;
239
invalidate();
240
}
241
}
Main.java代码:
01
import
android.app.Activity;
02
import
android.os.Bundle;
03
import
android.os.Handler;
04
import
android.os.Message;
05
public
class
Main
extends
Activity {
06
private
SlyderView slyderView;
07
private
MyHandler handler;
08
@Override
09
protected
void
onCreate(Bundle savedInstanceState) {
10
super
.onCreate(savedInstanceState);
11
slyderView =
new
SlyderView(
this
);
12
setContentView(slyderView);
13
slyderView.play();
14
handler =
new
MyHandler();
15
new
Thread(
new
Runnable() {
16
@Override
17
public
void
run() {
18
try
{
19
Thread.sleep(
5
*
1000
);
20
}
catch
(InterruptedException e) {
21
// TODO Auto-generated catch block
22
e.printStackTrace();
23
}
24
handler.sendEmptyMessage(
1
);
25
}
26
}).start();
27
28
}
29
private
class
MyHandler
extends
Handler{
30
@Override
31
public
void
handleMessage(Message msg) {
32
//停止在那个位置
33
slyderView.stop(
3
);
34
}
35
}
36
}
Android抽奖转盘代码
最新推荐文章于 2021-05-25 14:28:38 发布