自定义控件之飘落动画

来源:互联网 发布:微商推广软件 编辑:程序博客网 时间:2024/06/05 15:10

不少人会遇到飘落动画的需求,在这里我大致写了一个,但是不可能满足所有需求,仍有很多地方需要修改,我直接贴代码,效果请自行黏贴到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()查看效果