今天分享一个抽奖的类Lottery
/*
* Copyright (C) 2014 Jason Fang ( ijasonfang@gmail.com )
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ package fyc.framework.anim; import java.util.concurrent.TimeUnit; import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
import android.os.Build;
import android.os.CountDownTimer;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import fyc.framework.util.Flog;
import fyc.framework.util.RandomUtils; /**
* @author Jason Fang
* @datetime 2015年1月29日 下午7:19:36
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class Lottery {
static final boolean DEBUG = true; private static final int LOADING_UNIT_DEGREE = 360 * 5;
private static final int LOADING_DURATION = 720 * 5;
private static final long LOTTERY_TIME_OUT = TimeUnit.SECONDS.toMillis(5); private ImageView mImageView;
private ObjectAnimator mLoadingAnim;
private float mInitDegree = 0;
private int mMaxLevel = 10;
private int mUnitDegree;
private int[] mLevelMap;
private long mTimeout = LOTTERY_TIME_OUT; private boolean mIsLottering = false;
private boolean mIsInStop = false; private OnLotteryListener mListener;
private LotteryTimeOut mLotteryTimeOut; private Lottery(ImageView imageView, OnLotteryListener listener) {
mImageView = imageView;
mListener = listener;
} public static Lottery newInstance(ImageView imageView, OnLotteryListener listener) {
return new Lottery(imageView, listener);
} public Lottery setLevel(int level) {
mMaxLevel = level;
mUnitDegree = 360 / mMaxLevel;
return this;
} public Lottery setLevelMap(int[] levelMap) {
if (levelMap.length != mMaxLevel) {
throw new IllegalArgumentException("levelMap length must equal MaxLevel!");
}
mLevelMap = levelMap;
return this;
} public Lottery setTimeOut(int timeout) {
if (timeout <= 0) return this; mTimeout = TimeUnit.SECONDS.toMillis(timeout);
return this;
} public Lottery start() {
if (mIsLottering) return this;
mIsLottering = true; if (DEBUG) Flog.i("start"); loadingAnimStart(); if (mListener != null) {
mListener.onLotteryStart();
} mLotteryTimeOut = new LotteryTimeOut();
mLotteryTimeOut.start(); return this;
} public void stop(int level) {
if (mIsInStop) return;
mIsInStop = true; if (mLotteryTimeOut != null) {
mLotteryTimeOut.cancel();
} int levelAward = getLevelAward(level); if (mLoadingAnim != null && mLoadingAnim.isRunning()) {
mLoadingAnim.cancel();
} if (levelAward < 0 || levelAward > mMaxLevel) {
throw new IllegalArgumentException("level cannot below 0 or than MaxLevel!");
} float stopDegree = 0;
if (levelAward == 0) {
stopDegree = LOADING_UNIT_DEGREE - mUnitDegree / 2;
} else {
stopDegree = (LOADING_UNIT_DEGREE - mUnitDegree / 2) + RandomUtils.getRandom(mUnitDegree * levelAward + 5, mUnitDegree * (levelAward + 1) - 5);
} float startDegree = 0f;
if (mLoadingAnim != null) {
startDegree = (Float)mLoadingAnim.getAnimatedValue() % 360;
} else {
throw new RuntimeException("Must invoke start first!");
} long duration = (long)((stopDegree - startDegree) / ((LOADING_UNIT_DEGREE / (float)LOADING_DURATION))); stopAnimStart(startDegree, stopDegree, duration, levelAward); mInitDegree = stopDegree;
} int getLevelAward(int level) {
if (mLevelMap == null || mLevelMap.length == 0 || level == 0) return level;
return mLevelMap[level - 1];
} void loadingAnimStart() {
mLoadingAnim = ObjectAnimator.ofFloat(mImageView, "rotation", mInitDegree % 360, LOADING_UNIT_DEGREE);
mLoadingAnim.setInterpolator(new LinearInterpolator());
mLoadingAnim.setRepeatCount(ValueAnimator.INFINITE);
mLoadingAnim.setDuration(LOADING_DURATION);
mLoadingAnim.start();
} void stopAnimStart(float startDegree, float stopDegree, long duration, int levelAward) {
ObjectAnimator anim = ObjectAnimator.ofFloat(mImageView, "rotation", startDegree, stopDegree);
anim.setInterpolator(new DecelerateInterpolator());
anim.setDuration(duration * 2);
anim.addListener(new LotteryAnimatorListener(levelAward));
anim.start();
} class LotteryTimeOut extends CountDownTimer { public LotteryTimeOut() {
super(mTimeout, mTimeout);
} @Override
public void onTick(long millisUntilFinished) {
} @Override
public void onFinish() {
stop(0);
} } class LotteryAnimatorListener implements AnimatorListener { private int mLevel; public LotteryAnimatorListener() {
} public LotteryAnimatorListener(int level) {
mLevel = level;
} @Override
public void onAnimationStart(Animator animation) {
} @Override
public void onAnimationEnd(Animator animation) {
if (mListener != null) {
mListener.onLotteryStop(mLevel);
mIsLottering = false;
mIsInStop = false;
}
} @Override
public void onAnimationCancel(Animator animation) {
} @Override
public void onAnimationRepeat(Animator animation) {
} } public interface OnLotteryListener {
public void onLotteryStart();
public void onLotteryStop(int level);
}
}
如果要指针初始化指向圆盘的缝隙. 需要做简要的修改!
DEMO
mLottery = Lottery.newInstance(mWheel, new OnLotteryListener() {
@Override
public void onLotteryStop(int level) {
Flog.i("onLotteryStop:" + level);
}
@Override
public void onLotteryStart() {
Flog.i("onLotteryStart");
}
})
.setLevel(10) //总共几个奖
.setLevelMap(new int[]{5, 1, 1, 1, 1, 1, 1, 1, 1, 1}) //映射奖项
.setTimeOut(4);
获取到服务器端值之后调用
mLottery.stop(5); //参数为几等奖

今天分享一个抽奖的类Lottery的更多相关文章
- 分享一个Snackbar工具类 SnackbarUtils;
分享一个Snackbar工具类,源代码也是在Github上面找的,自己做了一下修改: 功能如下: 1:设置Snackbar显示时间长短 1.1:Snackbar.LEN ...
- [分享]一个String工具类,也许你的项目中会用得到
每次做项目都会遇到字符串的处理,每次都会去写一个StringUtil,完成一些功能. 但其实每次要的功能都差不多: 1.判断类(包括NULL和空串.是否是空白字符串等) 2.默认值 3.去空白(tri ...
- 分享一个Redis帮助类
最近在项目中使用了redis来存储已经下载过的URL,项目中用的是ServiceStack来操作Redis,一开始ServiceStack的版本用的是最新的,后来发现ServiceStack已经商业化 ...
- 分享一个FileUtil工具类,基本满足web开发中的文件上传,单个文件下载,多个文件下载的需求
获取该FileUtil工具类具体演示,公众号内回复fileutil20200501即可. package com.example.demo.util; import javax.servlet.htt ...
- 分享一个手机端好用的jquery ajax分页类
分享一个手机端好用的jquery ajax分页类 jquery-ias.min.js 1,引入jquery-ias.min.js 2,调用ajax分页 <script type="te ...
- .Net Excel 导出图表Demo(柱状图,多标签页) .net工具类 分享一个简单的随机分红包的实现方式
.Net Excel 导出图表Demo(柱状图,多标签页) 1 使用插件名称Epplus,多个Sheet页数据应用,Demo为柱状图(Epplus支持多种图表) 2 Epplus 的安装和引用 新建一 ...
- 分享一个SqliteHelper类
分享一个SqliteHelper类 SQLite作为一个本地文件数据库相当好用,小巧.快速.支持事务.关系型,甚至可以运行在Android上.在很久以前的一个项目中,我们用过它来将接收到的数据做本地统 ...
- 分享一个简单的C#的通用DbHelper类(支持数据连接池)
每次新项目的时候,都要从头去找一遍数据库工具类.这里分享一个简单实用的C#的通用DbHelper工具类,支持数据连接池. 连接池配置 <connectionStrings> <add ...
- 分享一个自己用的Objective-C的Http接连类
很久没有更新博客了,所以分享一个. @protocol HttpListenerDelegate; @interface BaseHttp : NSObject { } @property (nona ...
随机推荐
- 瞬间从IT屌丝变大神——注释规则
注释的主要规则如下: 公共组件和各栏目的维护者都需要在文件头部加上注释说明: /** *文件用途说明 *作者姓名 *联系方式*制作日期 **/ 大的模块注释方法: //======= //代码用途 / ...
- java的动态代理机制
前几天看到java的动态代理机制,不知道是啥玩意,然后看了看.死活不知道 invoke(Object proxy, Method m, Object[] args)种的proxy是个什么东西,放在这里 ...
- java出现no XXX in java.library.path的解决办法及eclipse配置
java一般使用两个path:classpath 和 java.library.path classpath是指向jar包的位置 java.library.path是非java类包的位置如(dll,s ...
- JavaScript快排与原生sort的测试
今天工作室断网!果断回宿舍,不然各种资料都没有.(他说将来会找到!)不好意思,又哼起来了.进入主题,大家都知道,快排是各种排序算法中,最高效的也是应用最广的,还有更重要的一点,面试特别爱考的! 其实大 ...
- hadoop conf中xml文件修改
core-site.xml <?xml version="1.0"?><?xml-stylesheet type="text/xsl" hre ...
- VB.NET开发中遇到的一个小问题
在修改公司用vb.net的写的代码时,遇到一个小问题 页面上有一个button, ID是btnNext, 在属性页中,它的click事件对应的是cmdNext, 我像在c#中一样,在属性页中双击cmd ...
- CCS 5 XDS100 仿真连接错误Error connecting to the target【瓦特芯笔记】
问题现象:在点击仿真是出现连接错误: Error connecting to the target: (Error -151 @ 0x0) One of the FTDI driver funct ...
- Light oj 1236 - Pairs Forming LCM (约数的状压思想)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1236 题意很好懂,就是让你求lcm(i , j)的i与j的对数. 可以先预处理1e7以 ...
- UVa 11971 Polygon (数学,转化)
题意:一根长度为n的木条,随机选k个位置将其切成k+1段,问这k+1段能组成k+1条边的多边形的概率. 析:这个题,很明显和 n 是没有任何关系的,因为无论 n 是多少那切多少段都可以,只与切多少段有 ...
- 如何关闭dell inspiron n4010的内置麦克
如何关闭dell inspiron n4010的内置麦克 dell inspiron n4010这款电脑的内置麦克是默认开启的,如果你的扩音器音量开得稍大,当你打字的时候就会听到回音,最讨厌的是,当你 ...