Android实现抽奖转盘实例代码

本文详述了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();
  }
}
(0)

相关推荐

  • js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS

    绝对值得看的来篇,哈哈.本人亲自完成,有错误请大家指出: 现在的手机完美支持html5,所以如果手机端想要做个抽奖模块的话,用刮刮卡抽奖效果,相信这个互动体验是非常棒的 ​ps:由于本人没有wp8系统的手机,所以没法兼容wp8系统的,目前完美兼容android,IOS 如果要在pc浏览的话,得改下js,目前支持谷歌,火狐,ie>=10,如果网友想要的话我就去写个 代码如下: 复制代码 代码如下: <!DOCTYPE html> <html lang="en"&g

  • Android打造流畅九宫格抽奖活动效果

    因为company项目中需要做九宫格抽奖活动,以前都没有做过类似的功能,虽然之前在浏览大神们的博客中,无意中也看到了好多关于抽奖的项目,但因为项目中没有需要,一直都没有点击进去看.这次不去看估计不行.直到公司计划要做抽奖功能,才迫不得已上网查找demo 网上找了大半天,好不容易找到了几个demo,下载下来,解压缩包发现竟然里面空空如也,只有几张九宫格的图片,害我白白浪费了几个CSDN积分.后面在eoe网站那发现了一个demo,于是好开心,下载下来后马上导入到工程中,运行看了效果,九宫格是出来了,

  • Android自定义View实现QQ运动积分转盘抽奖功能

    因为偶尔关注QQ运动, 看到QQ运动的积分抽奖界面比较有意思,所以就尝试用自定义View实现了下,原本想通过开发者选项查看下界面的一些信息,后来发现积分抽奖界面是在WebView中展示的,应该是在H5页面中用js代码实现的,暂时不去管它了. 这里的自定义View针对的是继承自View的情况,你可以将Canvas想象为画板, Paint为画笔,自定义View的过程和在画板上用画笔作画其实类似,想象在画板上作画的过程,你要画一个多大图形(对应View的测量 onMeasure方法),你要画什么样的图

  • Android简单实现圆盘抽奖界面

    闲来无事,做了一个简单的抽奖转盘的ui实现,供大家参考 package com.microchange.lucky; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.util.AttributeSet;

  • Android中利用SurfaceView制作抽奖转盘的全流程攻略

    一.概述 今天给大家带来SurfaceView的一个实战案例,话说自定义View也是各种写,一直没有写过SurfaceView,这个玩意是什么东西?什么时候用比较好呢? 可以看到SurfaceView也是继承了View,但是我们并不需要去实现它的draw方法来绘制自己,为什么呢? 因为它和View有一个很大的区别,View在UI线程去更新自己:而SurfaceView则在一个子线程中去更新自己:这也显示出了它的优势,当制作游戏等需要不断刷新View时,因为是在子线程,避免了对UI线程的阻塞. 知

  • Android App中实现简单的刮刮卡抽奖效果的实例详解

    主要思想: 将一个view设计成多层:背景层,含中奖信息等: 遮盖层,用于刮奖,使用关联一个Bitmap的Canvas 在该Bitmap上,使用它的canvas.drawPath的api来处理 手势滑动(类似刮奖的动作) 使用paint.setXfermode 来进行消除手势滑动区域 public class GuaView extends View { private Bitmap mBitmap; //遮盖的图层 private Canvas mCanvas; //绘制遮盖图层 privat

  • Android抽奖轮盘的制作方法

    本文实例为大家分享了Android抽奖轮盘的具体代码,供大家参考,具体内容如下 main布局(图片资源请自行寻找,抱歉) <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gra

  • Android使用surfaceView自定义抽奖大转盘

    使用surfaceView自定义抽奖大转盘 话不多说,先上效果图 完整代码地址欢迎start 实现思路以及过程 1.首先了解SurfaceView的基本用法,它跟一般的View不太一样,采用的双缓存机制,可以在子线程中绘制View,不会因为绘制耗时而失去流畅性,这也是选择使用SurfaceView去自定义这个抽奖大转盘的原因,毕竟绘制这个转盘的盘块,奖项的图片和文字以及转动都是靠绘制出来的,是一个比较耗时的绘制过程. 2.使用SurfaceView的一般模板样式 一般会用到的成员变量 priva

  • Android实现抽奖转盘实例代码

    本文详述了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 获取屏幕尺寸实例代码

    Android 获取屏幕尺寸实例代码 实现代码: /** * <supports-screens * android:smallScreens="true" * android:normalScreens="true" * android:largeScreens="true" * android:resizeable="true" * android:anyDensity="true" />

  • Android字段验证的实例代码

    先给大家展示效果图: package com.example.walkerlogin1; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widge

  • Android 操作excel功能实例代码

    学习app对excel的读写控制 1.界面设计 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id

  • Android 画一个太极图实例代码

    今天练手一下,一起来画个太极图吧~ 最终效果如下: 最终效果 一般都是先讲原理,我就反其道而行,先讲实现吧. 1.继承实现初始化方法 继承View,实现基本的构造函数: public TestView(Context context) { this(context, null); } public TestView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TestView(Context c

  • Webview实现android简单的浏览器实例代码

    WebView是Android中一个非常实用的组件,它和Safai.Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面,下面通过本文给大家介绍Webview实现android简单的浏览器实例代码. 实现了浏览器的返回 前进 主页 退出 输入网址的功能 注释的很清楚啦 就不多说了 首先是布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu

  • Android绘制验证码的实例代码

    在前面仿华为加载动画.仿网易音乐听歌识曲-麦克风动画中,我们通过绘图的基础知识完成了简单的绘制.在本例中,我们将绘制常见的验证码. 一.效果图 二.知识点与思路分析 通过上面的效果图观察,我们可以看到里面有绘制的随机线条,随机绘制的验证码. 绘制线条,直线或曲线 绘制文本,生成的验证码文本的绘制 绘制圆点. 三.代码编写 /** * Created by Iflytek_dsw on 2017/7/3. */ public class IdentifyCodeUtil { private sta

  • Android系统音量条实例代码

    最近在定制Android系统音量条,发现代码还是蛮多的,下面总结一下. 代码是基于5.1.1版本的. 系统音量条的代码是在/frameworks/base/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java 布局文件是在/frameworks/base/packages/SystemUI/res/layout下. 先看看原生的音量条样式: 在代码中可以发现volume_dialog.xml这个文件,这个文件就是承载

  • Android实现桌面快捷方式实例代码

    Android 快捷方式 使用方式 ShortcutUtils.getInstance().addShortcut(this , MainActivity2.class , liveBundle , "live_Id" , "看直播" , "看直播" , R.drawable.live) .addShortcut(this , MainActivity2.class ,vodBundle , "vod_Id" , "

  • PHP实现抽奖功能实例代码

    在项目开发中经常会遇到花钱抽奖类型的需求.但是老板总是担心用户用小钱抽到大奖.这样会导致项目亏损.下边这段代码可以有效制止抽奖项目亏钱. 个人奖池: 语言:thinkphp redis mysql 表:desire抽奖商品表 desire_log用户抽奖奖品表 user_desire_log用户抽奖记录表   desire_risk抽奖风控表 需求:用户奖池分为进行中奖池 和已完成奖池 当用户抽到大奖后 用户个人奖池重置 否则将继续抽奖 最后一次抽奖必中大奖 通过风控金额来判断用户是否可以抽大奖

随机推荐