国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > 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();  }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 罗定市| 湘阴县| 双牌县| 宜兴市| 甘德县| 滦平县| 安图县| 宜城市| 讷河市| 乐平市| 枣阳市| 东山县| 申扎县| 和政县| 包头市| 称多县| 沂水县| 田林县| 临沭县| 那曲县| 晋州市| 南充市| 含山县| 宜川县| 宿松县| 阿坝县| 五常市| 榆树市| 广丰县| 泸西县| 吴堡县| 安塞县| 马龙县| 峨山| 沁源县| 延长县| 海原县| 南城县| 云龙县| 来凤县| 万山特区|