首页 > 系统 > Android > 正文

Android实现抽奖转盘实例代码

2020-04-11 11:47:20
字体:
来源:转载
供稿:网友

本文详述了android抽奖程序的实现方法,程序为一个抽奖大转盘代码,里面定义了很多图形方法和动画。

实现主要功能的SlyderView.java源代码如下:

import android.app.Activity;import android.content.Context;import android.graphics.BlurMaskFilter;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.ColorMatrixColorFilter;import android.graphics.EmbossMaskFilter;import android.graphics.MaskFilter;import android.graphics.Paint;import android.graphics.PorterDuffXfermode;import android.graphics.Paint.Style;import android.graphics.PorterDuff.Mode;import android.graphics.Path;import android.graphics.RadialGradient;import android.graphics.RectF;import android.graphics.Shader.TileMode;import android.util.AttributeSet;import android.util.TypedValue;import android.view.View;public class SlyderView extends View{  public SlyderView(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    init(context);  }  public SlyderView(Context context, AttributeSet attrs) {    super(context, attrs);    init(context);  }  public SlyderView(Context context) {    super(context);    init(context);  }  /**   * 屏幕宽度   */  private int screenW;  /**   * 屏幕的高度   */  private int screenH;  /**   * 分割的度数   */  private int [] drgrees = {20,50,40,90,70,40,50};  /***   * 分割的文字   */  private String [] strs = {"level1","level2","level3","level4","level5","level6","level7"};  /**   * 分割的颜色   */  private int [] colos = new int[] { 0xfed9c960, 0xfe57c8c8, 0xfe9fe558, 0xfef6b000, 0xfef46212, 0xfecf2911, 0xfe9d3011 };  /**   * 画笔   */  private Paint paint;  /**   * 文字的大小   */  private float textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 15, getResources().getDisplayMetrics());  /**   * 文字的颜色   */  private int textcolor = Color.WHITE;  /**   * 园的半径   */  private float radius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 100, getResources().getDisplayMetrics());  /**   * 画文字的距离   */  private float textdis = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 80, getResources().getDisplayMetrics());  /**   * 画箭头的大小   */  private float roketSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 10, getResources().getDisplayMetrics());  private float initDegress = 0;  /**   * 圆心   */  private float centerX;  /**   * 圆心   */  private float centerY;  /**   * 立体边缘   */  private MaskFilter filter = new EmbossMaskFilter(new float[] { 1, 1, 1 },0.4f, 6, 3.5f);  private MaskFilter outerFilter = new BlurMaskFilter(10, BlurMaskFilter.Blur.OUTER);  private MaskFilter innerFilter = new BlurMaskFilter(10, BlurMaskFilter.Blur.INNER);  @SuppressWarnings("deprecation")  private void init(Context context){    paint = new Paint();    paint.setAntiAlias(true);    paint.setStyle(Style.FILL);    paint.setColor(Color.WHITE);    screenW = ((Activity)context).getWindowManager().getDefaultDisplay().getWidth();    screenH = ((Activity)context).getWindowManager().getDefaultDisplay().getHeight();    int[] colores = new int[3];    colores[0] = Color.rgb(0xfF, 0x99, 0x00);    colores[1] = Color.rgb(0xff, 0xff, 0x00);    colores[2] = Color.rgb(0xff, 0x99, 0x00);    float[] positions = new float[3];    positions[0] = 0.0f;    positions[1] = 0.5f;    positions[2] = 1.0f;    gradient = new RadialGradient(centerX, centerY, radius/5, colores, positions, TileMode.CLAMP);  }  /**   * 绘制三角箭头   */  private Path path = new Path();  /**   * 绘制矩形框   */  private RectF oval;  /**   * 外圆内阴影矩阵   */  private ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(new float[]{      1,0,0,0,0,      0,1,0,0,0,      0,0,1,0,0,      0,0,0,-1,255  });  @Override  protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    centerX = screenW/2;    centerY = screenH/2;    oval = new RectF(centerX-radius,centerY-radius,centerX+radius,centerY+radius);    float start = 0;    paint.setColor(Color.rgb(0xdd, 0xdd, 0xdd));    paint.setAlpha(127);    canvas.drawCircle(centerX, centerY, radius+10, paint);    paint.setAlpha(255);    //画扇形    paint.setAntiAlias(true);    for(int i=0;i<drgrees.length;i++){      float sweepAngle = drgrees[i];      float startAngle = start;      paint.setColor(colos[i%colos.length]);      canvas.drawArc(oval, startAngle, sweepAngle, true, paint);      start += drgrees[i];    }    //画文字    paint.setColor(textcolor);    paint.setAntiAlias(true);    paint.setTextSize(textSize);    paint.setTextAlign(Paint.Align.RIGHT);    start = 0;    for(int i=0;i<drgrees.length;i++){      canvas.save();      canvas.rotate(start+drgrees[i]/2, centerX, centerY);      canvas.drawText(strs[i], centerX+textdis, centerY, paint);      canvas.restore();      start += drgrees[i];    }    int saveCount = canvas.save();    //画外层立体效果    paint.setColorFilter(colorFilter);    canvas.saveLayer(oval,paint,Canvas.ALL_SAVE_FLAG);    paint.setColorFilter(null);    canvas.drawARGB(255, 0, 0, 0);    paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));    canvas.drawCircle(centerX, centerY, radius, paint);    paint.setXfermode(null);    paint.setMaskFilter(innerFilter);    paint.setColor(Color.argb(0xff, 0, 0, 0));    canvas.drawCircle(centerX, centerY, radius, paint);    paint.setMaskFilter(null);    canvas.restoreToCount(saveCount);    //画内圆和内园效果    canvas.save();    paint.setColor(Color.argb(0xff, 0, 0, 0));    paint.setAntiAlias(true);    paint.setMaskFilter(outerFilter);    canvas.rotate(initDegress, centerX, centerY);    canvas.drawCircle(centerX, centerY, radius/3, paint);    paint.setMaskFilter(null);    paint.setColor(Color.WHITE);    canvas.drawCircle(centerX, centerY, radius/3, paint);    //画三角型叠加当箭头    path.moveTo(centerX-radius/3, centerY);    path.lineTo(centerX, centerY-radius/3-roketSize);    path.lineTo(centerX+radius/3, centerY);    path.close();    canvas.drawPath(path, paint);    canvas.restore();    paint.setMaskFilter(filter);    paint.setColor(Color.GREEN);    paint.setShader(gradient);    canvas.drawCircle(centerX, centerY, radius/5, paint);    paint.setMaskFilter(null);    paint.setShader(null);    //重绘调整三角的指向达到滚动的效果,现实项目中可不能这样用的,效率太低下了,拆分View用动画完成滚动才是王道    if(isRunning){      if(initDegress>=360){        initDegress = 0;      }      initDegress +=4;      invalidate();    }    if(isStoping){      if(initDegress<=360){        initDegress+=4;        invalidate();      }else{        if(initDegress-360<stop_degress){          initDegress+=2;          invalidate();        }      }    }  }  private boolean isRunning = false;  private boolean isStoping = false;  private int stop_degress =90;  /**   * 渐变   */  private RadialGradient gradient;  public void play(){    isRunning = true;    invalidate();  }  public void stop(int count){    for(int i =0;i<=count;i++){      if(i == count){        stop_degress +=drgrees[i]/2;      }else{        stop_degress +=drgrees[i];      }    }    isStoping = true;    isRunning = false;    invalidate();  }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表