1、创建初始化界面的定义类

public class AniPlayer {private RelativeLayout mBox = null;private Context mContext = null;public static final AniPlayer INST = new AniPlayer();private boolean isPlaying = false;int nextSwitchingStyle = 0;private int[] imageResources = {R.drawable.bbb, R.drawable.aaa};int nextImageResource = 0;private Handler handler = null;public void play(Context context,RelativeLayout box) {if (isPlaying) {return;}isPlaying = true;if (handler == null) {handler = new Handler();}mContext = context;mBox = box;playNext();}private void playNext() {nextSwitchingStyle++;if (nextSwitchingStyle >= 1) {nextSwitchingStyle = 0;}int imgRes = imageResources[nextImageResource];nextImageResource++;if (nextImageResource >= 2) {nextImageResource = 0;}SwitchableImageView imgView = new SwitchableImageView(mContext);imgView.setImageResource(imgRes);imgView.setScaleType(ScaleType.FIT_XY);LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);mBox.addView(imgView, lp);//imgView.setSwitchingPercent(0.0f);ObjectAnimator animator = ObjectAnimator.ofFloat(imgView, "switchingPercent",//0.001f, 0.4f, 0.5f, 1.0f);//0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f);1.0f);animator.setDuration(5000);animator.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {clearViewsNotOnTop(mBox);handler.postDelayed(new Runnable() {@Overridepublic void run() {playNext();}}, 2000);}@Overridepublic void onAnimationCancel(Animator animation) {isPlaying = false;}});animator.start();}private void clearViewsNotOnTop(RelativeLayout parent) {int count = parent.getChildCount();if (count >= 2) {parent.removeViews(0, count - 1);}}
}

2、创建马赛克工具类

public class SwitchableImageView extends ImageView {protected float switchingPercent = 0;public SwitchableImageView(Context context) {super(context);}public SwitchableImageView(Context context, AttributeSet attrs) {super(context, attrs);}public SwitchableImageView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}public void setSwitchingPercent(float switchingPercent) {this.switchingPercent = switchingPercent;switchingPercentChanged();}protected void switchingPercentChanged() {SwitchingStyle.马赛克.switchingPercentChanged(this);invalidate();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);SwitchingStyle.马赛克.onDraw(this, canvas);}public static enum SwitchingStyle {马赛克 {@Overrideprotected void onDraw(SwitchableImageView thiz, Canvas canvas) {thiz.drawMosaic(canvas);}@Overrideprotected void switchingPercentChanged(SwitchableImageView thiz) {if (thiz.switchingPercent < 1.0f) {thiz.setLayerType(View.LAYER_TYPE_SOFTWARE, null);} else {thiz.setLayerType(View.LAYER_TYPE_NONE, null);}}};private static final Paint CLEARING_PAINT;private static final Paint NORMAL_PAINT;static {// 预先创建,尽量别在onDraw中创建东西CLEARING_PAINT = new Paint();CLEARING_PAINT.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));NORMAL_PAINT = new Paint();NORMAL_PAINT.setColor(Color.BLACK);}protected abstract void switchingPercentChanged(SwitchableImageView thiz);protected abstract void onDraw(SwitchableImageView thiz, Canvas canvas);}// 以下是马赛克相关的东西private int mosaicSize = 0;private int xCount = 0, yCount = 0;private HashSet<Integer> revealedMosaicSet = new HashSet<Integer>();private Random random = new Random();private void initMosaicData(int width, int height) {int[] xyCount = { 0, 0 };mosaicSize = calcMosaicSize(width, height, xyCount);xCount = xyCount[0];yCount = xyCount[1];revealedMosaicSet.clear();}private static int calcMosaicSize(int width, int height, int[] outXyCount) {int dimen = width > height ? width : height;int result = dimen / 10;if (outXyCount != null && outXyCount.length >= 2) {outXyCount[0] = Math.round((float)width / (float)result);outXyCount[1] = Math.round((float)height / (float)result);}return result;}private void drawMosaic(Canvas canvas) {if (switchingPercent == 0.0f) {initMosaicData(canvas.getWidth(), canvas.getHeight());}int expectedRevealedCount = Math.round(xCount * yCount * switchingPercent);while (revealedMosaicSet.size() < expectedRevealedCount) {revealOneMosaic();}for (int y=0; y < yCount; y++) {for (int x=0; x < xCount; x++) {int w = mosaicSize;int h = mosaicSize;if (x == xCount - 1) {w = canvas.getWidth() - x * mosaicSize;}if (y == yCount - 1) {h = canvas.getHeight() - y * mosaicSize;}if (!revealedMosaicSet.contains(x + y * xCount)) {canvas.drawRect(x * mosaicSize, y * mosaicSize,x * mosaicSize + w, y * mosaicSize + h, SwitchingStyle.CLEARING_PAINT);}}}}private void revealOneMosaic() {int r = random.nextInt(xCount * yCount - revealedMosaicSet.size());for (int i=0; i < xCount * yCount; i++) {if (!revealedMosaicSet.contains(i)) {if (r == 0) {revealedMosaicSet.add(i);break;}r--;}}}
}

效果如图:

图片切换马赛克动画效果相关推荐

  1. python怎么变成动图_python简单的图片切换形成动画效果程序

    简单事情复杂化了,这个程序实现这个效果还能再度精简很多代码,把类去掉吧,你能自行完成吗? import turtle class Window: def __init__(self,width,hei ...

  2. Tab页面手势滑动切换以及动画效果

    . 3张页卡之间的切换.带动画效果. 工程结构. 主要应用到android-support-v4.jar这个jar包. 布局文件. 1.main.xml中的代码 [html] <?xml ver ...

  3. react滑动切换tab动画效果_[React Native]react-native-scrollable-tab-view(入门篇)

    官方为我们提供的Tab控制器有两种: TabBarIOS,仅适用于IOS平台 ViewPagerAndroid,仅适用于Android平台(严格来讲并不算,因为我们还需要自己实现Tab) 如果我们需要 ...

  4. 如何把HTML转换成动图,html5实现图片转圈的动画效果——让页面动起来

    1.先瞧瞧效果: 2.代码是这样的: @mixin ani-btnRotate{ @keyframes btnRotate{ from{transform: rotateZ(0);} to{trans ...

  5. 照片转换为动画 html5,如何使用html5让图片转圈的动画效果

    如何使用html5让图片转圈的动画效果 发布时间:2020-10-26 09:33:22 来源:亿速云 阅读:78 作者:小新 如何使用html5让图片转圈的动画效果?这个问题可能是我们日常学习或工作 ...

  6. html怎样让图片自动转圈,html5怎样做出图片转圈的动画效果

    这次给大家带来html5怎样做出图片转圈的动画效果,h5做出图片转圈的动画效果的注意事项有哪些,下面就是实战案例,一起来看一下. @mixin ani-btnRotate{ @keyframes bt ...

  7. python炫酷动画源代码_Python tkinter实现的图片移动碰撞动画效果【附源码下载】...

    本文实例讲述了Python tkinter实现的图片移动碰撞动画效果.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: #!/usr/bin/python # -*- coding ...

  8. jQuery前端开发学习指南(18)——利用jQuery实现元素的隐藏、显示和切换及其动画效果

    版权声明 本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 概述 在jQuery框架中可便捷地以动画形式隐藏和显示以及切换元素,常用方式有如下三种:默认方 ...

  9. flash图片如何镜像翻转_在canvas上实现元素图片镜像翻转动画效果的方法

    这篇文章主要介绍了在canvas上实现元素图片镜像翻转动画效果的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧! 一.Canvas图片水平镜像翻转效果预览 ...

最新文章

  1. 【git学习三】git基础之git管理远程仓库
  2. nmap常用参数详解
  3. 第二十六期:英国建设下一代IOT基础设施的历史机遇和挑战
  4. C++/QT:获取当前路径并通过相对路径读取文件
  5. FacetWP 筛选与多条件搜索 WordPress插件
  6. 统计学基础一:基础概念
  7. Android学习笔记---29_构建soap协议内容,发送xml数据和调用webservice,手机号码归属地查询器
  8. DeFi预言机Umbrella Network与BSC上去中心化杠杆交易协议WOWswap达成合作
  9. 数据结构——树状数组
  10. POJ1007 UVA612 UVALive5414 ZOJ1188 HDU1379 Bailian4086 DNA Sorting【排序+逆序数】
  11. Python学习笔记001——Linux
  12. [转]Redis几个认识误区
  13. 【面向代码】学习 Deep Learning(二)Deep Belief Nets(DBNs)
  14. 在UOS(deepin)系统下安装CPUS-PDF虚拟PDF打印机的方法
  15. 振兴会杜振国分析美股行情
  16. 主引导记录 - 维基百科,自由的百科全书
  17. 复合高斯求积matlab代码,谁有复何求积公式和高斯求积公式在matlab中实现的代码...
  18. 环信java,java集成环信 - IM Geek开发者社区-移动开发者社区-开源社区-IM Geek官网...
  19. DFS入门级(模板)
  20. 数据预处理之数据缩放

热门文章

  1. DALAO们好我是新手
  2. Pinia——Actions
  3. 【爱课程-精品通选系列课程】哲学智慧与人文思想
  4. 电子凸轮追剪曲线生成算法 算法,理解后可转成其他品牌PLC或任何一种编程语言
  5. 使用zabbix_sender发送文本
  6. VIN码识别又叫车架号识别,OCR技术深度应用
  7. Android开发——应用宝推广渠道出现MD5值重复,请勿重复上传
  8. Docker(五)——Docker镜像仓库
  9. 计算机英语中CISC的汉语意思是,CISC是什么意思_CISC在线翻译_读音_用法_例句_含义-查字典网...
  10. 评测三款最流行的txt阅读器(windows适用)