Android抽奖转盘代码


  • 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[] { 0xfed9c9600xfe57c8c80xfe9fe5580xfef6b0000xfef462120xfecf2911,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[] { 111 },0.4f, 63.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(0xfF0x990x00);
    103         colores[1] = Color.rgb(0xff0xff0x00);
    104         colores[2] = Color.rgb(0xff0x990x00);
    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(0xdd0xdd0xdd));
    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(255000);
    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(0xff000));
    172         canvas.drawCircle(centerX, centerY, radius, paint);
    173         paint.setMaskFilter(null);
    174         canvas.restoreToCount(saveCount);
    175         //画内圆和内园效果
    176         canvas.save();
    177         paint.setColor(Color.argb(0xff000));
    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 }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值