您的位置:首页 > 移动开发 > Android开发

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

2016-05-16 16:48 911 查看
自定义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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: