luckyTurnTable

由于公司前段时间抽奖活动的需求,所以小农依葫芦画瓢做了两款幸运转盘。

附上GitHub地址,如果老铁感觉有用请记得star!!!!!
https://github.com/lwang057/luckyTurnTable.git
效果展示:
  • 圆形转盘

  • 方形转盘

  • 废话不多说直接上代码:

首先是圆形转盘

package com.lwang.luckyturntable;import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.Toast;import java.util.Random;public class CircleTurntableActivity extends AppCompatActivity implements View.OnClickListener {private Animation mStartAnimation;private Animation mEndAnimation;private ImageView mLuckyTurntable;private boolean isRunning;private int mPrizeGrade = 6; //奖品级别,0代表没有private int mItemCount = 3;private int[] mPrizePosition = {0, 4, 2, 1, 5, 3}; //奖品在转盘中的位置(到达一等奖的距离)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_circle_turntable);mLuckyTurntable = (ImageView) findViewById(R.id.id_lucky_turntable);ImageView mStartBtn = (ImageView) findViewById(R.id.id_start_btn);mStartBtn.setOnClickListener(this);mStartAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);mStartAnimation.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) {}@Overridepublic void onAnimationRepeat(Animation animation) {}});}@Overridepublic void onClick(View v) {// 未抽过奖并有抽奖的机会if (!isRunning) {isRunning = true;mStartAnimation.reset();mLuckyTurntable.startAnimation(mStartAnimation);if (mEndAnimation != null) {mEndAnimation.cancel();}new Handler().postDelayed(new Runnable() {public void run() {endAnimation();}}, 2000);}}// 结束动画,慢慢停止转动,抽中的奖品定格在指针指向的位置private void endAnimation() {int position = mPrizePosition[mPrizeGrade - 1];float toDegreeMin = 360 / mItemCount * (position - 0.5f) + 1;Random random = new Random();int randomInt = random.nextInt(360 / mItemCount - 1);float toDegree = toDegreeMin + randomInt + 360 * 5; //5周 + 偏移量// 按中心点旋转 toDegree度// 参数:旋转的开始角度、旋转的结束角度、X轴的伸缩模式、X坐标的伸缩值、Y轴的伸缩模式、Y坐标的伸缩值mEndAnimation = new RotateAnimation(0, toDegreeMin, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);mEndAnimation.setDuration(3000); // 设置旋转时间mEndAnimation.setRepeatCount(0); // 设置重复次数mEndAnimation.setFillAfter(true);// 动画执行完后是否停留在执行完的状态mEndAnimation.setInterpolator(new DecelerateInterpolator()); // 动画播放的速度mEndAnimation.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) {isRunning = false;Toast.makeText(CircleTurntableActivity.this, "富光350ml水杯", Toast.LENGTH_SHORT).show();}@Overridepublic void onAnimationRepeat(Animation animation) {}});mLuckyTurntable.startAnimation(mEndAnimation);mStartAnimation.cancel();}//停止动画(异常情况,没有奖品)private void stopAnimation() {//转盘停止回到初始状态if (isRunning) {mStartAnimation.cancel();mLuckyTurntable.clearAnimation();isRunning = false;}}}

方形转盘

package com.lwang.luckyturntable;import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;import com.lwang.luckyturntable.view.LuckyMonkeyPanelView;import java.util.Random;public class SudokuTurnTableActivity extends AppCompatActivity {private LuckyMonkeyPanelView luckyPanelView;private ImageView mDrawBtn;private long drawTime; //抽奖时间private int MARK_LUCKY = 6; //中奖标记private static Handler handler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_sudoku_turn_table);luckyPanelView = (LuckyMonkeyPanelView) findViewById(R.id.lucky_panel);mDrawBtn = (ImageView) findViewById(R.id.id_draw_btn);mDrawBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (System.currentTimeMillis() - drawTime < 5000) {Toast.makeText(SudokuTurnTableActivity.this, "心急吃不了热豆腐,请5秒后再点击哦", Toast.LENGTH_SHORT).show();return;}//开始抽奖if (!luckyPanelView.isGameRunning()) {drawTime = System.currentTimeMillis();luckyPanelView.startGame();getLuck();}}});}private void getLuck() {long delay = 0; //延长时间long duration = System.currentTimeMillis() - drawTime;if (duration < 5000) {delay = 5000 - duration;}handler.postDelayed(new Runnable() {@Overridepublic void run() {if (SudokuTurnTableActivity.this.isFinishing()) {return;}luckyPanelView.tryToStop(getPrizePosition(MARK_LUCKY));luckyPanelView.setGameListener(new LuckyMonkeyPanelView.LuckyMonkeyAnimationListener() {@Overridepublic void onAnimationEnd() {//延长1S弹出抽奖结果handler.postDelayed(new Runnable() {@Overridepublic void run() {Toast.makeText(SudokuTurnTableActivity.this, getPrizeName(MARK_LUCKY), Toast.LENGTH_SHORT).show();}}, 1000);}});}}, delay);}/*** 根据奖品等级计算出奖品位置* @param prizeGrade* @return*/private int getPrizePosition(int prizeGrade) {switch (prizeGrade) {case 1:return 0;case 2:return 4;case 3:return 2;case 4:return 5;case 5:return 7;case 6: //六等奖有三个位置,随机取一个int[] position = {1, 3, 6};Random random = new Random();return position[random.nextInt(3)];}return prizeGrade;}/*** 奖品名称* @param grade* @return*/private String getPrizeName(int grade) {switch (grade) {case 1:return "iPhone 8 手机一部";case 2:return "Beats 耳机一副";case 3:return "周大福转运珠一颗";case 4:return "小米体重称一个";case 5:return "暴风魔镜VR眼镜一副";case 6:return "爱奇艺月卡会员";default:return "";}}}

Android自定义幸运转盘相关推荐

  1. Android自定义ViewGroup基本步骤

    1.自定义属性,获取自定义属性,可参考 ​ Android自定义View基本步骤 ​ 2.onMeasure() 方法,for循环测量子View,根据子View的宽高来计算自己的宽 高 3.onDra ...

  2. Android自定义View —— TypedArray

    在上一篇中Android 自定义View Canvas -- Bitmap写到了TypedArray 这个属性 下面也简单的说一下TypedArray的使用 TypedArray 的作用: 用于从该结 ...

  3. Android 自定义View —— Canvas

    上一篇在android 自定义view Paint 里面 说了几种常见的Point 属性 绘制图形的时候下面总有一个canvas ,Canvas 是是画布 上面可以绘制点,线,正方形,圆,等等,需要和 ...

  4. android 自定义loading,Android自定义动画-StarLoadingView

    今天来分享第二个自定义loading的动画,起了个名字叫 蹦跶的星星 ,还是老规矩先介绍,后上图. 实现效果在最后,GIF有点大,手机流量慎重. 介绍 首先声明做这个动画的初衷是为了学习和分享,所以从 ...

  5. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  6. android 自定义命名空间,Android自定义ActionBar实例

    本文实例讲述了android自定义actionbar的实现方法.分享给大家供大家参考.具体实现方法如下: android 3.0及以上已经有了actionbar的api,可以通过引入support p ...

  7. Android自定义View:ViewGroup(三)

    自定义ViewGroup本质是什么? 自定义ViewGroup本质上就干一件事--layout. layout 我们知道ViewGroup是一个组合View,它与普通的基本View(只要不是ViewG ...

  8. Android自定义视图四:定制onMeasure强制显示为方形

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  9. android自定义滑块解锁,android 滑动解锁

    通过android自定义View实现横向的滑动解锁,1.滑动到中间会自动返回到原始的位置,2.滑动到底部会自动解锁,会触发解锁的回调:首先看效果图如下: 实现以上部分一共分为三部分: 其中背景通过sh ...

最新文章

  1. 你应该知道的 Nginx 配置清单
  2. 路径包含空格_5分钟学会:矢量工具与路径-编辑路径
  3. spinner的理解
  4. [Java基础]IO流概述和分类
  5. 计算机网络管理员demo,计算机网络试题demo
  6. c++ winpcap开发(6)
  7. 一起学习C语言:初谈指针(二)
  8. Markdown编辑器常用功能以及快捷键介绍
  9. BZOJ 2301 Problem b
  10. java 内存溢出和内存泄漏_java中的内存溢出和内存泄漏
  11. Activiti7 表介绍
  12. Html5开发的在线画板涂鸦,使用html5 canvas制作涂鸦画板
  13. 韩信点兵-输出韩信至少拥有的士兵人数。
  14. html+css制作三角形
  15. 免息贷款但有手续费的年化利率计算方法及Java实现;
  16. Vue源码学习之Computed与Watcher原理
  17. NR常用协议以及下载路径
  18. Linux命令_Note1
  19. 新视觉任务!CVPR 2021 Oral | OWOD:面向开放世界的目标检测
  20. 国家卫生健康委办公厅关于启用全国统一电子无偿献血证的通知

热门文章

  1. vue 使用Export2Excel导出Excel表格
  2. 孩子厌学逃课怎么办,家长要从这3个方面入手,引导孩子爱上学习
  3. android爬虫框架jsoup,Android笔记之JSoup爬虫入门
  4. Kaggle项目之PUBG Finish Placement Prediction(一)——探索性分析
  5. 关于Importerror:Filepath looks like a hdf5 file but h5py is not available 解决
  6. 0元整一个电脑副屏 全平台制霸(支持Windows、macOS、ipad、iOS、Android和HTML5)
  7. Mac用户如何下载并配置JDK
  8. 新中国休假制度变迁:曾经每周只休息一天
  9. sketchbook手机版_SketchBook安卓版
  10. vue基础 v-系列