android 抽奖盘动画

public class LotterPlate extends View {

    private Context context;

    private Paint dPaint = new Paint();
    private Paint sPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);


    private int[] images = new int[]{R.mipmap.huawei,R.mipmap.image_one,R.mipmap.iphone,R.mipmap.macbook,R.mipmap.meizu,R.mipmap.xiaomi};

    private String[] strs = {"0","1","2","3","4","5"};
    private List<Bitmap> bitmaps = new ArrayList<>();
    private ScrollerCompat scroller;

    private  ValueAnimator unfromanimtor;
    private int InitAngle = -150;
    private int radius = 0;
    private int number=images.length;
    private  int flag=360/number;
    private  int DesRotate;

    public LotterPlate(Context context) {
        this(context,null);
    }

    public LotterPlate(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public LotterPlate(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;

        scroller = ScrollerCompat.create(context);

        dPaint.setColor(Color.rgb(255,133,132));
        dPaint.setStrokeWidth(74);
        dPaint.setAntiAlias(true);
        dPaint.setStyle(Paint.Style.STROKE);

        sPaint.setColor(Color.BLACK);
        textPaint.setColor(Color.WHITE);
        textPaint.setTextSize(Util.dip2px(context,16));
        for(int i=0;i<number;i++){
            Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), images[i]);
            bitmaps.add(bitmap);
        }

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //wrap_content value
        int mHeight = Util.dip2px(context, 450);
        int mWidth = Util.dip2px(context, 450);

        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);

        if(widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST){
            setMeasuredDimension(mWidth, mHeight);
        }else if(widthSpecMode == MeasureSpec.AT_MOST){
            setMeasuredDimension(mWidth, heightSpecSize);
        }else if(heightSpecMode == MeasureSpec.AT_MOST){
            setMeasuredDimension(widthSpecSize, mHeight);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

            final int paddingLeft = getPaddingLeft();
            final int paddingRight = getPaddingRight();
            final int paddingTop = getPaddingTop();
            final int paddingBottom = getPaddingBottom();

            int width = getWidth() - paddingLeft - paddingRight;
            int height = getHeight() - paddingTop - paddingBottom;

            int MinValue = Math.min(width,height);

            radius = MinValue/2;

            RectF rectF = new RectF(getPaddingLeft()+250,getPaddingTop()+250,width-250,height-250);  //调整圆的半径

            for(int i= 0;i<number;i++){
                drawIcon(width/2, height/2, radius+100, InitAngle, i, canvas);
                canvas.drawArc(rectF,InitAngle-flag/2,1f,false,dPaint);
                drawText(InitAngle+flag/2,strs[i], radius, textPaint, canvas,rectF);
                InitAngle += flag;
        }

    }

    private void drawText(float startAngle, String string,int mRadius,Paint mTextPaint,Canvas mCanvas,RectF mRange)
    {
        Path path = new Path();
        path.addArc(mRange, startAngle, flag);
        float textWidth = mTextPaint.measureText(string);

        float hOffset = (float) (mRadius * Math.PI / 7 / 2 - textWidth / 2);
        float vOffset = mRadius / 2/4 ;
        mCanvas.drawTextOnPath(string, path, hOffset, vOffset, mTextPaint);

    }

    private void drawIcon(int xx,int yy,int mRadius,float startAngle, int i,Canvas mCanvas)
    {

        int imgWidth = mRadius / 4;

        float angle = (float) Math.toRadians(flag+startAngle);

        float x = (float) (xx + mRadius/3*2   * Math.cos(angle));
        float y = (float) (yy + mRadius/3*2   * Math.sin(angle));

        // 确定绘制图片的位置
        RectF rect = new RectF(x - imgWidth *3/ 4, y - imgWidth*3 / 4, x + imgWidth
                *3/ 4, y + imgWidth*3/4);

        Bitmap bitmap = bitmaps.get(i);

        mCanvas.drawBitmap(bitmap, null, rect, null);

    }


    public void setImages(List<Bitmap> bitmaps){
        this.bitmaps = bitmaps;
        this.invalidate();
    }

    public void setStr(String... strs){
        this.strs = strs;
        this.invalidate();
    }

    //旋转一圈所需要的时间
    private static final long ONE_WHEEL_TIME = 1000;


    /**
     * 开始转动
     * @param pos 如果 pos = -1 则随机,如果指定某个值,则转到某个指定区域
     */
    public void startRotate(int pos){

        int lap = (int) (Math.random()*12);

        int angle = 0;
        if(pos < 0){
            angle = (int) (Math.random() * 360);
        }else{
            int initPos  = queryPosition();
            if(pos > initPos){
                angle = (pos - initPos)*60;
                lap -= 1;
                angle = 360 - angle;
            }else if(pos < initPos){
                angle = (initPos - pos)*60;
            }else{
                //nothing to do.
            }
        }

        int increaseDegree = lap * 360 + angle;
        long time = (lap + angle / 360) * ONE_WHEEL_TIME;
         DesRotate = increaseDegree + InitAngle;
        int offRotate = DesRotate % 360 % flag;
        DesRotate -= offRotate;
        DesRotate += 30;
//        ferrisWheel(time,InitAngle,DesRotate);
        turntable(time,InitAngle,DesRotate);
//        unfromanimtor.cancel();

    }

    public void unifromAnim(){  //匀速旋转
        clearAnimation();
         unfromanimtor = ValueAnimator.ofInt(0,360);
        unfromanimtor.setInterpolator(new LinearInterpolator());
        unfromanimtor.setDuration(2000);
        unfromanimtor.setRepeatCount(-1);
        unfromanimtor.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int updateValue = (int) animation.getAnimatedValue();
                InitAngle = (updateValue % 360 + 360) % 360;
                ViewCompat.postInvalidateOnAnimation(LotterPlate.this);

            }
        });
        unfromanimtor.start();


    }

    private void ferrisWheel( long time,int starAngle,int endAngle){ // TODO: 2017/7/6 图片会随位置改变而调整角度
        ValueAnimator  valueAnimator = ValueAnimator.ofInt(starAngle,endAngle);
        valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
        valueAnimator.setDuration(time);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int updateValue = (int) animation.getAnimatedValue();
                InitAngle = (updateValue % 360 + 360) % 360;
                ViewCompat.postInvalidateOnAnimation(LotterPlate.this);
            }
        });
        valueAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                if(valueAnimatorListenter != null)
                    valueAnimatorListenter.endAnimation(queryPosition());
            }
        });
        valueAnimator.start();
        clearAnimation();
    }
    private void turntable(long time,int startAngle,int endAngle){ // TODO: 2017/7/6 图片自身不会变动
        RotateAnimation rotate  = new RotateAnimation(startAngle, endAngle, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        rotate.setInterpolator(new LinearInterpolator());
        rotate.setDuration(time);//设置动画持续时间
        rotate.setRepeatCount(0);//设置重复次数
        rotate.setFillAfter(true);//动画执行完后是否停留在执行完的状态
        startAnimation(rotate);
        rotate.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {}
            @Override
            public void onAnimationEnd(Animation animation) {

                if(valueAnimatorListenter != null) {
                    InitAngle=DesRotate;
                    int index=queryPosition();
                    valueAnimatorListenter.endAnimation(index);

                    for(int i=0;i<index;i++){
                        bitmaps.add(bitmaps.size(),bitmaps.get(i));
                        bitmaps.remove(i);
                    }
                }
            }
            @Override
            public void onAnimationRepeat(Animation animation) {}
        });
    }


    //查寻初始位置  可根据需求调整
    private int queryPosition(){
        InitAngle = (InitAngle % 360 + 360) % 360;
        int pos = InitAngle / flag;
        return calcumAngle(pos);
    }

    private int calcumAngle(int pos){
        if(pos >= 0 && pos <= 3){
            pos = 3 - pos;
        }else{
            pos = (6-pos) + 3;
        }
        return pos;
    }
    public interface AnimationEndListener{
        void endAnimation(int position);
    }

    private AnimationEndListener valueAnimatorListenter;

    public void setAnimationEndListener(AnimationEndListener valueAnimatorListenter){
        this.valueAnimatorListenter = valueAnimatorListenter;
    }


    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        clearAnimation();
    }


    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 抽奖转盘是一种常见的游戏玩法,可以在Android Studio中实现。可以使用Canvas绘制转盘,然后使用动画实现旋转效果。还可以使用随机数生成器来确定抽奖结果。需要注意的是,抽奖转盘的设计应该符合用户体验,避免过于复杂或难以理解。 ### 回答2: Android Studio抽奖转盘是一种基于安卓开发平台的应用程序,它通过转盘的方式来实现抽奖的目的。抽奖转盘是功能相对简单,但现实生活中广泛应用的一个互动游戏。在实现抽奖转盘的应用中,可以通过安卓工具集成一系列功能实现开发过程,同时也可以结合一些开源库来实现更多的功能。 要实现抽奖转盘,我们需要一个圆形界面,可以在程序中通过绘制圆形实现。在圆形中间需要添加一个指针,指针在转动的时候与圆盘进行交互。在转盘的表面上,需要添加几段不同角度的弧形,每段弧形都可以对应一个中奖奖品。当程序启动后,转盘开始旋转,可以通过设置旋转速度和旋转时间的属性来实现这一功能。随着指针的旋转,最终会停在一个中奖区域内,这时程序会弹出提示框展示中奖的信息。 为了实现抽奖转盘的功能,需要注意以下几个方面: 首先,在制作过程中需要采用合适的布局,尽可能使得控件之间的关系清晰明了,从而方便后续开发和使用。 其次,在指针的旋转过程中,需要注意速度和转角的获取。这些数据的获取需要与程序中的计时器相关联,从而实现精准的控制。 最后,在展示中奖信息的过程中,需要考虑多种展示方式。这样可以让中奖结果得以灵活地展示,提高用户体验。 总之,抽奖转盘是一种非常有趣的互动方式,通过安卓工具和开源库的结合,我们可以轻松开发出一个功能强大的抽奖应用程序。 ### 回答3: Android Studio抽奖转盘是一款运行在Andriod Studio平台上的应用程序,其功能主要是模拟抽奖过程,让用户在其中获得激动人心的体验。抽奖转盘运用了许多Android Studio平台提供的强大工具和技术,例如可以使用Android代码编写软件界面、响应用户交互以及处理后端数据等。 抽奖转盘的实现需要考虑几个方面,其中包括:转盘的转动效果、奖品与转盘的匹配关系、奖品信息的显示、中奖结果的提示等。 对于转盘的转动效果,可以使用Android Studio提供的动画效果和视图动作等工具进行实现,这样可以使转盘具有更加真实的旋转效果。同时,为了保证抽奖过程的公平性,还需要进行奖品池的随机抽取,以及防止用户通过欺骗方式获得大量奖品。 在奖品与转盘的匹配关系方面,开发者可以使用数据库或者其他的数据存储工具,将奖品与对应的转盘区块进行关联,这样可以在转盘旋转过程中快速地获取结果并向用户展示。 与此同时,还需要对抽奖过程进行监控和分析,例如记录用户中奖记录、统计用户抽奖次数等。这样可以为后续的运营策略提供依据,同时还可以对抽奖过程进行改进和优化。 最后,为了使用户获得更加良好的体验,需要在中奖结果的提示方面进行创新,例如可以加入音乐、动画等元素,让用户感受到惊喜和快乐。除此之外,还需要在用户界面设计、交互方式等方面进行深入优化,以提升用户参与度和满意度。 总之,Android Studio抽奖转盘是一款内容和技术相对较为复杂的应用程序,需要开发者具备较强的技术水平和创新意识,并且需要在多个方面进行综合考虑和优化,才能够为用户提供优质的抽奖体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值