自定义控件之飘落动画

不少人会遇到飘落动画的需求,在这里我大致写了一个,但是不可能满足所有需求,仍有很多地方需要修改,我直接贴代码,效果请自行黏贴到demo中尝试


public class FlowerView extends View {
    public int alalpha = 300;
    Bitmap[] flos;
    int[] drawables;
    //    Bitmap mFlowers = null;
    MyFlower flowers[];
    private Integer[] offsetX;
    private Integer[] offsetY;
    private int drawableSize = 50;
    /**
     * 定一个全局随机
     */
    Random newRandom = new Random();
    /**
     * 图片处理类
     */
    Matrix imMatrix = new Matrix();
    /**
     * 画笔
     */
    Paint p = new Paint();
    /**
     * 画布宽度
     */
    int mW = 480;
    /**
     * 画布高度
     */
    int mH = 800;

    int animalTime = 10000;//默认10秒动画
    private long startTime;

    /**
     * 设置动画时长  毫秒
     *
     * @param animalTime
     */
    public void setAnimalTime(int animalTime) {
        this.animalTime = animalTime;
    }

    private boolean isDrawing = false;

    boolean HIDE_MODE = false;
    private boolean fileAfter = false;

    //是否保留最后状态
    public void setFileAfter(boolean fileAfter) {
        this.fileAfter = fileAfter;
    }

    //是否渐隐
    public void setHIDE_MODE(boolean HIDE_MODE) {
        this.HIDE_MODE = HIDE_MODE;
    }

    //设置漂浮物
    public void setDrawables(int[] drawables) {
        this.drawables = drawables;

    }

    //设置漂浮物密度
    public void setDrawableSize(int drawableSize) {
        this.drawableSize = drawableSize;

    }

    /**
     * 设置画布大小
     *
     * @param pW 宽度
     * @param pH 高度
     */
    private void setWH(int pW, int pH) {
        this.mW = pW;
        this.mH = pH;
        offsetX = new Integer[]{2, -2, -1, 0, 1, 2, 1};
        offsetY = new Integer[]{3, 5, 5, 3, 4};
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        setWH(w, h);
        init();
    }

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

    public FlowerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

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

    }

    private void init() {
        if (drawables == null)
            drawables = new int[]{};
        if (flowers == null)
            flowers = new MyFlower[drawableSize];
        loadFlower();
        addRect();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);
        if (isDrawing) {
            if (HIDE_MODE) {
                alalpha--;
                p.setAlpha(alalpha);
            }
            for (int i = 0; i < flowers.length; i++) {
                MyFlower rect = flowers[i];
                Bitmap bi = rect.bi;
                int t = rect.t;
                t--;
                if (t <= 0) {
                    rect.y += rect.g;
                    rect.x += rect.h;
                    canvas.save();
                    imMatrix.reset();
                    imMatrix.setScale(rect.s, rect.s);
                    canvas.setMatrix(imMatrix);
                    canvas.drawBitmap(bi, rect.x, rect.y, p);
                    canvas.restore();
                }
                rect.t = t;
                if (rect.y >= mH) {
                    rect.init(bi);
                }
                if (rect.x >= mW || rect.x < -20) {
                    rect.init(bi);
                }
                flowers[i] = rect;
            }
            postInvalidateDelayed(10);
            if (HIDE_MODE) {
                if (alalpha <= 0)
                    isDrawing = false;
            } else {
                if (System.currentTimeMillis() - startTime > animalTime) {
                    isDrawing = false;
                }
            }
        } else {

            if (fileAfter) {
                for (int i = 0; i < flowers.length; i++) {
                    MyFlower rect = flowers[i];
                    Bitmap bi = rect.bi;
                    int t = rect.t;
                    t--;
                    if (t <= 0) {
                        rect.y += rect.g;
                        rect.x += rect.h;
                        canvas.save();
                        imMatrix.reset();
                        imMatrix.setScale(rect.s, rect.s);
                        canvas.setMatrix(imMatrix);
                        canvas.drawBitmap(bi, rect.x, rect.y, p);
                        canvas.restore();
                    }
                    rect.t = t;
                    if (rect.y >= mH) {
                        rect.init(bi);
                    }
                    if (rect.x >= mW || rect.x < -20) {
                        rect.init(bi);
                    }
                    flowers[i] = rect;
                }
            }
        }
    }


    public void loadFlower() {
        Resources r = this.getContext().getResources();
        if (flos != null) {
            for (int i = 0; i < flos.length; i++) {
                flos[i].recycle();
            }
            flos = null;
        }
        flos = new Bitmap[drawables.length];
        for (int i = 0; i < drawables.length; i++) {
            flos[i] = ((BitmapDrawable) r.getDrawable(drawables[i])).getBitmap();
        }
    }


    public void addRect() {
        for (int i = 0; i < flowers.length; i++) {
            flowers[i] = new MyFlower(flos[(int) (Math.random() * flos.length)]);
        }
    }

    /**
     * 开始动画
     */
    public void start() {
        if (isDrawing) {
            return;
        }
        alalpha = 300;
        startTime = System.currentTimeMillis();
        isDrawing = true;
        postInvalidateDelayed(100);
    }


    class MyFlower {
        Bitmap bi;

        int x;

        int y;
        /**
         * 缩放尺寸
         */
        float s;
        /**
         * 透明度
         */
        int alpha;

        int t = -10;
        /**
         * y轴偏移
         */
        int g;
        /**
         * x轴偏移
         */
        int h;

        public void init(Bitmap bi) {

            float aa = newRandom.nextFloat();
            this.x = newRandom.nextInt(mW - 80) + 80;
            this.y = 0;
            if (aa >= 1) {
                this.s = 1.1f;
            } else if (aa <= 0.2) {
                this.s = 0.4f;
            } else {
                this.s = aa;
            }
            this.alpha = alalpha;
            this.t = -1;
            this.g = offsetY[newRandom.nextInt(4)];
            this.h = offsetX[newRandom.nextInt(7)];
        }

        public MyFlower(Bitmap bi) {
            super();
            this.bi = bi;
            init(bi);
        }
    }

}

有关初始化和调用的代码如下


private void initFlower() {
        flower = (FlowerView) findViewById(R.id.flower);
//        flower.setFileAfter(true);
        flower.setDrawableSize(50);
        flower.setDrawables(new int[]{R.drawable.sn1, R.drawable.sn2, R.drawable.sn3, R.drawable.sn4});
    }

    public void startFlow(View v) {
        flower.start();
    }

就会有飘落动画的出现,设置密度

flower.setDrawableSize(50);

一定要设置需要飘落的图片

flower.setDrawables(new int[]{R.drawable.sn1, R.drawable.sn2, R.drawable.sn3, R.drawable.sn4});
调用start()查看效果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值