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
- Android Launcher 自定义View 炫酷换壁纸效果,水瓶加水进度显示效果
- Android自定义View之水波纹显示进度效果
- Android:自定义View实现水波进度效果
- android自定义View实现图片上传进度显示(仿手机QQ上传效果)
- android自定义View实现图片上传进度显示(仿手机QQ上传效果)
- android自定义View实现图片上传进度显示(仿手机QQ上传效果)
- Android Launcher开发(三)动态壁纸(LiveWallPaper)气泡流动效果
- Android Launcher开发(三)动态壁纸(LiveWallPaper)气泡流动效果
- 类似Launcher壁纸的视差背景效果
- android Launcher 自定义View 高仿hola一键清理效果
- android 自定义ProgressBar 文字跟随进度效果
- Android自定义View--仿驾考宝典显示分数效果
- Android 水波纹显示进度效果
- Android 自定义View 时钟效果
- Android自定义View时钟效果
- android自定义view锯齿状效果
- Android自定义View-刮刮卡效果
- 心电图效果View Android自定义View
- 为什么object_getClass(obj)与[OBJ class]返回的指针不同
- 获取字符串的宽度或者高度来实现控件的宽或者高的自适应
- 现实的巧合?精心的设计?砍价模型?以退为进?
- 使用工具
- android坐标
- Android Launcher 自定义View 炫酷换壁纸效果,水瓶加水进度显示效果
- mysql输入输出参数存储过程简单使用
- ViewPager实现炫酷的滑动缩放广告页
- 计算机期刊
- log4j按天生成日志文件
- MYSQL中INET_ATON(expr)函数的调查
- 欧拉函数模版
- VS2013与MySql建立连接;您的项目引用了最新实体框架;
- 安卓汉字转拼音字符串,进行模糊搜索时使用