今天分享一个抽奖的类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 ...
随机推荐
- e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (六) 自动化测试结构小节
上一篇‘e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (五) 如何让窗体记录登录 ...
- 使用DDMS测试安卓手机APP的性能(android)
安装/配置: 通过另外一个工具也可以测试手机客户端APP的性能,这就是android开发包中的DDMS工具(Dalvik Debug Monitor Service),先来说一下android开发包的 ...
- Tableau学习笔记之三
1.Tableau可以连接多种多样的数据以及数据库,例如txt,xls,mdb,sql server,oracle等等 2.Tableau还可以从剪贴板上粘贴数据 3.维度和度量的理解: 1)维度即表 ...
- 有关SQLite的substr函数的笔记
官方参考文档:SQLite Query Language: Core Functions http://www.sqlite.org/lang_corefunc.html 测试SQL语句: ,) AS ...
- 为duilib的MenuDemo增加消息响应,优化代码和显示效果
转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/38253297 第一部分 我在前一段时间研究了怎么制作duilib的菜单, ...
- 【C++对象模型】构造函数语意学之一 默认构造函数
默认构造函数,如果程序员没有为类定义构造函数,那么编译器会在[需要的时候]为类合成一个构造函数,而[需要的时候]分为程序员需要的时候和编译器需要的时候,程序员需要的时候应该由程序员来做工作,编译器需要 ...
- 在NodeJS中配置aws ec2
获取access key和secret access key 自己账户下有security credentials的选项 然后点击Acce ...
- AndroidAsync :异步Socket,http(client+server),websocket和socket.io的Android类库
AndroidAsync是一个用于Android应用的异步Socket,http(client+server),websocket和socket.io的类库.基于NIO,没有线程.它使用java.ni ...
- MANACHER---求最长回文串
求最长回文串,如果是暴力的方法的话,会枚举每个字符为中心,然后向两边检测求出最长的回文串,时间复杂度在最坏的情况下就是0(n^2),为什么时间复杂度会这么高,因为对于每一个作为中心的字符的检测是独立的 ...
- Spring入门(10)-Spring JDBC
Spring入门(10)-Spring JDBC 0. 目录 JdbcTemplate介绍 JdbcTemplate常见方法 代码示例 参考资料 1. JdbcTemplate介绍 JdbcTempl ...