Prechádzať zdrojové kódy

添加签到扭蛋机动画效果

zhoujuncai 7 rokov pred
rodič
commit
4031107745

+ 207 - 0
app/src/main/java/com/sheep/jiuyan/samllsheep/ui/view/EggView.java

@@ -0,0 +1,207 @@
+package com.sheep.jiuyan.samllsheep.ui.view;
+
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.animation.LinearInterpolator;
+
+import com.sheep.jiuyan.samllsheep.R;
+
+import java.util.Random;
+
+/**
+ * Created by: zhoujuncai.
+ * Created date: 2018/11/2.
+ * Description: 跳动扭蛋机
+ */
+public class EggView extends View {
+
+    /* 控件宽度 */
+    private int width;
+    /* 控件高度 */
+    private int height;
+    /* 扭蛋图片集合 */
+    private Bitmap[] drawables;
+    /* 扭蛋集合 */
+    private Egg[] eggs;
+    /* 画笔 */
+    private Paint paint;
+    /* 是否停止 */
+    private boolean isStop = false;
+
+    public EggView(Context context) {
+        super(context);
+    }
+
+    public EggView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init();
+    }
+
+    public EggView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    /**
+     * 初始化
+     */
+    private void init() {
+        paint = new Paint();
+        paint.setAntiAlias(true);
+        paint.setStyle(Paint.Style.FILL);
+        setBackgroundColor(getResources().getColor(android.R.color.transparent));
+        drawables = new Bitmap[]{
+                BitmapFactory.decodeResource(getResources(), R.drawable.niudan1),
+                BitmapFactory.decodeResource(getResources(), R.drawable.niudan2),
+                BitmapFactory.decodeResource(getResources(), R.drawable.niudan3),
+                BitmapFactory.decodeResource(getResources(), R.drawable.niudan4),
+                BitmapFactory.decodeResource(getResources(), R.drawable.niudan5),
+                BitmapFactory.decodeResource(getResources(), R.drawable.niudan6),
+                BitmapFactory.decodeResource(getResources(), R.drawable.niudan7),
+                BitmapFactory.decodeResource(getResources(), R.drawable.niudan8),
+        };
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        width = getWidth();
+        height = getHeight();
+        if (eggs == null) {
+            initEggs();
+        }
+        if (!isStop) {
+            for (Egg egg : eggs) {
+                if (egg.getX() > egg.getWidth() || egg.getX() < 0) {
+                    egg.xValue.reverse();
+                }
+                if (egg.getY() > egg.getHeight() || egg.getY() < 0) {
+                    egg.yValue.reverse();
+                }
+                canvas.drawBitmap(egg.getBitmap(), egg.getX(), egg.getY(), paint);
+            }
+        }
+        super.onDraw(canvas);
+        invalidate();
+    }
+
+    public void setStop(boolean stop) {
+        isStop = stop;
+    }
+
+    /**
+     * 初始化扭蛋
+     */
+    private void initEggs() {
+        eggs = new Egg[8];
+        for (int i = 0; i < eggs.length; i++) {
+            Egg egg = new Egg(width, height, drawables[i]);
+            eggs[i] = egg;
+        }
+    }
+
+    /**
+     * 扭蛋对象
+     */
+    private class Egg {
+
+        /* 活动范围宽度 */
+        private int width;
+        /* 活动范围高度 */
+        private int height;
+        /* X坐标 */
+        private int x;
+        /* Y坐标 */
+        private int y;
+        /* X轴动画偏移量 */
+        private int offsetX;
+        /* Y轴动画偏移量 */
+        private int offsetY;
+        /* 扭蛋图片 */
+        private Bitmap bitmap;
+        private ValueAnimator xValue;
+        private ValueAnimator yValue;
+
+        /**
+         * 构造方法
+         *
+         * @param width  活动范围的宽度
+         * @param height 活动范围的高度
+         * @param bitmap 扭蛋图片
+         */
+        public Egg(int width, int height, Bitmap bitmap) {
+            this.width = width - bitmap.getWidth();
+            this.height = height - bitmap.getHeight();
+            this.bitmap = bitmap;
+            this.init();
+        }
+
+        /* 初始化 */
+        private void init() {
+//            this.x = random(0, width);
+            this.x = 0;
+//            this.y = random(0, height);
+            this.y = 0;
+            xValue = ValueAnimator.ofInt(0, width);
+            xValue.setDuration(random(200, 1000));
+            xValue.setRepeatCount(-1);
+            xValue.setRepeatMode(ValueAnimator.REVERSE);
+            xValue.setInterpolator(new LinearInterpolator());
+            xValue.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+                @Override
+                public void onAnimationUpdate(ValueAnimator animation) {
+                    offsetX = (int) animation.getAnimatedValue();
+                }
+            });
+            xValue.start();
+            yValue = ValueAnimator.ofInt(0, height);
+            yValue.setDuration(random(200, 1000));
+            yValue.setRepeatCount(-1);
+            yValue.setRepeatMode(ValueAnimator.REVERSE);
+            yValue.setInterpolator(new LinearInterpolator());
+            yValue.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+                @Override
+                public void onAnimationUpdate(ValueAnimator animation) {
+                    offsetY = (int) animation.getAnimatedValue();
+                }
+            });
+            yValue.start();
+        }
+
+        public int getX() {
+            return x + offsetX;
+        }
+
+        public int getY() {
+            return y + offsetY;
+        }
+
+        public Bitmap getBitmap() {
+            return bitmap;
+        }
+
+        public int getWidth() {
+            return width;
+        }
+
+        public int getHeight() {
+            return height;
+        }
+
+        /**
+         * 随机取数
+         *
+         * @param min 最小值
+         * @param max 最大值
+         * @return 返回一个在最小值和最大值之间的数
+         */
+        private int random(int min, int max) {
+            Random r = new Random();
+            return r.nextInt(max) % (max - min + 1) + min;
+        }
+    }
+}

+ 5 - 0
app/src/main/res/layout/activity_sign.xml

@@ -66,6 +66,11 @@
                     android:text="活动规则"
                     android:textColor="#ffffff"
                     android:textSize="12sp" />
+
+                <com.sheep.jiuyan.samllsheep.ui.view.EggView
+                    android:layout_width="190dp"
+                    android:layout_height="140dp"
+                    android:layout_centerInParent="true" />
             </RelativeLayout>
         </LinearLayout>
     </ScrollView>