转盘抽奖代码

传入抽奖集合对象获得随机的奖品id 

 public int getPrizeIndex(List<Prize> prizes) {
        int random = -1;
        try {
            //计算总权重
            double sumWeight = 0;
            for (Prize p : prizes) {
                sumWeight += p.getPrizeWeight();
            }
            //产生随机数
            double randomNumber;
            randomNumber =new SecureRandom().nextDouble();
            //根据随机数在所有奖品分布的区域并确定所抽奖品
            double d1 = 0;
            double d2 = 0;
            for (int i = 0; i < prizes.size(); i++) {
                if (sumWeight != 0){
                    d2 += Double.parseDouble(String.valueOf(prizes.get(i).getPrizeWeight())) / sumWeight;
                }
                if (i == 0) {
                    d1 = 0;
                } else {
                    if (sumWeight != 0) {
                        d1 += Double.parseDouble(String.valueOf(prizes.get(i - 1).getPrizeWeight())) / sumWeight;
                    }
                }
                if (randomNumber >= d1 && randomNumber <= d2) {
                    random = i;
                    break;
                }
            }
        } catch (Exception e) {
            logger.error("生成抽奖随机数出错,出错原因:" + e.getMessage());
        }
        return random;
    }
@Data
public class Prize {
    private Integer id;//奖品id
    private Integer prizeWeight;//奖品权重
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我们可以看到有两个与Kotlin转盘抽奖相关的引用。其中,引用提供了一个彩色转盘类的继承,可以绘制圆盘并实现转盘抽奖的效果。而引用则提供了一个名为StatisticRingChart的自定义视图类,可以实现类似于转盘抽奖的统计环形图效果。 以下是一个基于引用的Kotlin转盘抽奖代码的示例: ``` class LuckyWheelView(context: Context, attrs: AttributeSet) : View(context, attrs) { private var mColors = intArrayOf(Color.RED, Color.YELLOW, Color.GREEN, Color.BLUE, Color.CYAN, Color.MAGENTA) private var mPaint = Paint(Paint.ANTI_ALIAS_FLAG) private var mRectF = RectF() private var mRadius = 0f private var mStartAngle = 0f private var mSweepAngle = 0f private var mItemCount = 6 private var mItemTexts = arrayOf("Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6") private var mTextPaint = Paint(Paint.ANTI_ALIAS_FLAG) private var mTextSize = 0f private var mCenterX = 0f private var mCenterY = 0f init { mPaint.style = Paint.Style.FILL mTextPaint.color = Color.WHITE mTextPaint.textAlign = Paint.Align.CENTER } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec, heightMeasureSpec) val width = MeasureSpec.getSize(widthMeasureSpec) val height = MeasureSpec.getSize(heightMeasureSpec) val size = Math.min(width, height) setMeasuredDimension(size, size) } override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { super.onSizeChanged(w, h, oldw, oldh) mRadius = (Math.min(w, h) / 2 * 0.8).toFloat() mCenterX = (w / 2).toFloat() mCenterY = (h / 2).toFloat() mTextSize = mRadius / 8 mTextPaint.textSize = mTextSize mRectF.left = mCenterX - mRadius mRectF.top = mCenterY - mRadius mRectF.right = mCenterX + mRadius mRectF.bottom = mCenterY + mRadius } override fun onDraw(canvas: Canvas) { super.onDraw(canvas) canvas.drawColor(Color.WHITE) mSweepAngle = 360f / mItemCount for (i in 0 until mItemCount) { mPaint.color = mColors[i % mColors.size] canvas.drawArc(mRectF, mStartAngle, mSweepAngle, true, mPaint) drawText(canvas, mStartAngle, mItemTexts[i]) mStartAngle += mSweepAngle } } private fun drawText(canvas: Canvas, angle: Float, text: String) { val path = Path() path.addArc(mRectF, angle, mSweepAngle) val textWidth = mTextPaint.measureText(text) val hOffset = (mRadius * Math.PI / mItemCount - textWidth) / 2 val vOffset = mRadius / 2 / 6 canvas.drawTextOnPath(text, path, hOffset.toFloat(), vOffset.toFloat(), mTextPaint) } } ``` 该代码实现了一个LuckyWheelView类,继承自View类,可以在Android应用中实现一个转盘抽奖的效果。在该类中,我们定义了转盘的颜色、半径、起始角度、扫描角度、选项个数、选项文本等属性,并在onMeasure()和onSizeChanged()方法中计算了转盘的大小和位置。在onDraw()方法中,我们使用Canvas绘制了转盘的扇形区域,并在每个扇形区域中绘制了对应的选项文本。最后,我们使用drawTextOnPath()方法将文本沿着扇形区域的弧线绘制出来,实现了转盘抽奖的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值