Android Launcher 自定义View 炫酷换壁纸效果,水瓶加水进度显示效果

来源:互联网 发布:工作督促软件 编辑:程序博客网 时间:2024/05/17 05:58

自定义View 炫酷换壁纸效果,水瓶加水进度显示效果

后面补上效果图:

import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.os.Handler;import android.util.AttributeSet;import android.view.View;import android.view.animation.AccelerateDecelerateInterpolator;import android.view.animation.Animation;import android.view.animation.OvershootInterpolator;import com.nineoldandroids.animation.Animator;import com.nineoldandroids.animation.AnimatorSet;import com.nineoldandroids.animation.ObjectAnimator;import com.nineoldandroids.animation.ValueAnimator;/** * 一键换壁纸,加水动画效果
 459821731@qq.com * Created by ferris on 2016/1/19. */public class WallpaperFlashView extends View {    private PorterDuffXfermode xfermode;    private Paint mPaint;    private Drawable bg1;    private Drawable bg2;    private Bitmap wave;    private int waveadd;    private Rect mMaskRect;    private int waveheight;    private int wavelength;    private int wavewidth;    private int speed = 3;    private Bitmap srcwave;    private Rect mWaveRect;    private Rect mWaveSrcRect;    private int waveColor;    private Paint mBgColorPaint;    private Rect mBgRect;    private Bitmap iconMask;    private int padding_bottom;    private int padding_left;    private int padding_right;    private int padding_top;    private int width;    private int height;    private Rect mBgColorRect;    private boolean isFlash = true;    private boolean isUp = false;    private long startTime = 0L;    private int downProgress = 0;    private int progress = 0;    private ObjectAnimator mAnimator;    private boolean isStart = false;    private ObjectAnimator.AnimatorListener mListener;    private Handler handler = new Handler();    public WallpaperFlashView(Context context) {        super(context);        init();    }    public WallpaperFlashView(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public WallpaperFlashView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    /**     * 初始化     */    private void init() {        SizeUtils.reset(getContext());        mPaint = new Paint();        xfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);        mPaint.setXfermode(xfermode);        bg1 = getResources().getDrawable(R.drawable.widget_wallpaper_wave_mask);        bg2 = getResources().getDrawable(R.drawable.widget_wallpaper_wave_bg);        wave = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.widget_wallpaper_wave);        iconMask = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.widget_wallpaper_wave_mask);        srcwave = Bitmap.createBitmap(2 * wave.getWidth(), wave.getHeight(), wave.getConfig());        Canvas mCanvas = new Canvas(srcwave);        mCanvas.drawBitmap(wave, 0.0F, 0.0F, null);        mCanvas.drawBitmap(wave, this.wave.getWidth(), 0.0F, null);        mCanvas.save();        wavewidth = srcwave.getWidth();        waveheight = srcwave.getHeight();        wavelength = (wavewidth / 7);        speed = (this.wavelength / 15);        mWaveSrcRect = new Rect(0, 0, wavelength, waveheight / 5);        waveColor = srcwave.getPixel(srcwave.getWidth() / 2, 3 * srcwave.getHeight() / 4);        mBgColorPaint = new Paint();        mBgColorPaint.setColor(waveColor);    }    /**     * 画水波,背景色,以及遮罩,必须用layer 不然产生黑背景     *     * @param mCanvas     */    private void drawBgColordrawMask(Canvas mCanvas) {        int sc = mCanvas.saveLayer(padding_left, padding_top, width - padding_right, height - padding_bottom, null,                Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG                        | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG                        | Canvas.FULL_COLOR_LAYER_SAVE_FLAG                        | Canvas.CLIP_TO_LAYER_SAVE_FLAG);        //画水波        mCanvas.drawBitmap(srcwave, mWaveSrcRect, mWaveRect, null);        //画背景色        mCanvas.drawRect(mBgColorRect, mBgColorPaint);        //画罩子        mMaskRect = new Rect(padding_left, padding_top, width - padding_right, height - padding_bottom);        mCanvas.drawBitmap(iconMask, null, mMaskRect, mPaint);        mCanvas.restoreToCount(sc);    }    /**     * 画玻璃杯     *     * @param mCanvas     */    private void drawBackGroud(Canvas mCanvas) {        mBgRect = new Rect(padding_left, padding_top, width - padding_right, height - padding_bottom);        mCanvas.save();        mCanvas.clipRect(mBgRect);        bg1.setBounds(mBgRect);        bg1.draw(mCanvas);        bg2.setBounds(mBgRect);        bg2.draw(mCanvas);        mCanvas.restore();    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        width = getWidth();        height = getHeight();        padding_left = (width - SizeUtils.dip2px(38)) / 2;        padding_right = padding_left;        padding_top = (height - SizeUtils.dip2px(58)) / 2;        padding_bottom = padding_top;        refresh();        drawBackGroud(canvas);        drawBgColordrawMask(canvas);    }    private void refresh() {        if (!isFlash && isUp && (System.currentTimeMillis() - startTime > 60000L)) {            stopPlay();        }        if (isUp){            if (downProgress > progress) {                progress = (1 + progress);                if ((isFlash) && (progress >= 95)) {                    stopPlay();                }            }        }        if (mWaveSrcRect.left + speed < wavewidth / 2) {            mWaveSrcRect.left += speed;            mWaveSrcRect.right += speed;        } else {            waveadd = (mWaveSrcRect.left + speed - wavewidth / 2);            mWaveSrcRect.left = waveadd;            mWaveSrcRect.right = (wavelength + waveadd);        }        int i = (height - 2 * padding_bottom) / 3;        int j = (int) (progress / 100.0F * (height - 2 * padding_bottom - i));        int k = height - padding_bottom - i;        int m = height - padding_bottom;        mWaveRect = new Rect(padding_left, k - j, width - padding_right, m - j);        mBgColorRect = new Rect(padding_left, mWaveRect.bottom, width - padding_right, j + mWaveRect.bottom);    }    /**     * 停止动画调用     */    public void stopPlay() {        if (mAnimator != null && mAnimator.isRunning()) {            mAnimator.cancel();        }        isFlash=true;        isStart = false;        downProgress = 0;        progress = 0;        mWaveRect = new Rect(padding_left, padding_top, width - padding_right, height - padding_bottom);        invalidate();        setVisibility(View.INVISIBLE);        //动画停止        if (mListener != null) {            mListener.onAnimationEnd(mAnimator);        }    }    public void playerFlash(int paramInt) {        isFlash = true;        downProgress = 100;        isUp = true;        mAnimator = ObjectAnimator.ofFloat(this, "wavefloat", new float[]{0.0F, 1.0F, 0.0F});        mAnimator.setDuration(5000L);        mAnimator.setRepeatMode(2);        mAnimator.setRepeatCount(1);        mAnimator.start();    }    /**     * 监听灌水动画开始和结束     *     * @param mListener     */    public void setWallpaperFlashViewListener(ObjectAnimator.AnimatorListener mListener) {        this.mListener = mListener;    }    /**     * 下载进度设置     *     * @param mProgress     */    public void setProgress(int mProgress) {        //如果是开始状态,并且 下载进度比当前下载进度小,则赋予新的进度值        if (isStart && downProgress < mProgress) {            downProgress = mProgress;        }    }    /**     * 点击事件后,执行     */    public void start() {        if (!isStart) {            if(getVisibility()!=View.VISIBLE){                setVisibility(View.VISIBLE);            }            AccelerateDecelerateInterpolator mAccelerateDecelerateInterpolator = new AccelerateDecelerateInterpolator();            AnimatorSet mAnimatorSet = new AnimatorSet();            ObjectAnimator mObjectAnimatorScaleX = ObjectAnimator.ofFloat(WallpaperFlashView.this, "scaleX", new float[]{0.0F, 1.0F});            ObjectAnimator mObjectAnimatorScaleY = ObjectAnimator.ofFloat(WallpaperFlashView.this, "scaleY", new float[]{0.0F, 1.0F});            mObjectAnimatorScaleX.setInterpolator(mAccelerateDecelerateInterpolator);            mObjectAnimatorScaleY.setInterpolator(mAccelerateDecelerateInterpolator);            mObjectAnimatorScaleX.setDuration(300L);            mObjectAnimatorScaleY.setDuration(300L);            ObjectAnimator mObjectAnimatorRotation = ObjectAnimator.ofFloat(WallpaperFlashView.this, "rotation", new float[]{15.0F, 0.0F});            ObjectAnimator mObjectAnimatorRotation2 = ObjectAnimator.ofFloat(WallpaperFlashView.this, "rotation", new float[]{15.0F, 15.0F});            mObjectAnimatorRotation.setInterpolator(new OvershootInterpolator(5.0F));            mObjectAnimatorRotation.setDuration(200L).setStartDelay(200L);            mObjectAnimatorRotation2.setDuration(0L);            mAnimatorSet.playTogether(new Animator[]{mObjectAnimatorScaleX, mObjectAnimatorScaleY, mObjectAnimatorRotation2, mObjectAnimatorRotation});            mAnimatorSet.start();            handler.postDelayed(new Runnable() {                @Override                public void run() {                    startTime = System.currentTimeMillis();                    isStart = true;                    isFlash = false;                    startAnimator();                }            }, 500L);        }    }    public float getWavefloat() {        return wavefloat;    }    public void setWavefloat(float wavefloat) {        this.wavefloat = wavefloat;    }    private float wavefloat=0;    /**     * 对于动画的对象,请注意WallpaperFlashView.this     * 开始水波动画     */    public void startAnimator() {        setVisibility(View.VISIBLE);        if (mAnimator != null && mAnimator.isRunning()) {            mAnimator.cancel();        }        isUp = true;        mWaveRect = new Rect(padding_left, padding_top, width - padding_right, height - padding_bottom);        mAnimator = ObjectAnimator.ofFloat(WallpaperFlashView.this, "wavefloat", new float[]{0.0F, 1.0F});        mAnimator.setDuration(1000L);        mAnimator.setRepeatMode(Animation.REVERSE);        mAnimator.setRepeatCount(Animation.INFINITE);        mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {            @Override            public void onAnimationUpdate(ValueAnimator valueAnimator) {                WallpaperFlashView.this.invalidate();            }        });        mAnimator.start();    }}

1 0