用最简单的方式来实现Android视图扩散切换效果。

一、概述

这两天时间动手撸了个视图扩散切换效果的控制器,API兼容至Android4.0,更方便我们在视图切换过程中有炫酷的过渡效果。本来是想实现两个View之间的过渡动画,实现的过程中想到之前写的Activity切换动画,就试着加上了对Activity切换的动画支持。先来看看效果吧,代码实现只需一行,感觉还不错~

二、实现思路简单阐述

关于过渡动画的实现,我们先简单分解下这个效果,首先,当Activity发生跳转时我们要先获取共享元素控件,在跳转的界面将其添加在跳转页面之上,关于控件位置的获取,在上一篇文章Android碎裂的粒子效果一文中进行了介绍,主要是通过如下方法获取其位置:

  1. protected Rect getRectInWindow(View view, boolean mIsFullWindow){
  2. int[] location = new int[2];
  3. view.getLocationInWindow(location);
  4. return new Rect(location[0],location[1],location[0]+view.getMeasuredWidth(),location[1]+view.getMeasuredHeight());
  5. }

当跳转至目标页面,我们现在其上方盖上一层遮罩,遮罩为我们自定义的控件,在控件上方绘制上一个页面的过渡视图,将其旋转、平移、或者缩放操作:

  1. canvas.save();
  2. Matrix matrix = new Matrix();
  3. matrix.postTranslate(mRect.left ,mRect.top);
  4. matrix.postScale(mScaleXCanvas,mScaleYCanvas,mRect.centerX(),mRect.centerY());
  5. matrix.postRotate(mRotationCanvas,mRect.centerX(),mRect.centerY());
  6. canvas.concat(matrix);
  7. mView.draw(canvas);
  8. canvas.restore();

最后就是圆形散开效果了,这里我在自定义控件上使用的是Xfermode,不断drawCircle并扩大半径,最终显示出跳转页面视图并将遮罩移除。记得关闭硬件加速。

  1. mClearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
  2. setLayerType(LAYER_TYPE_SOFTWARE,null);

返回动画同理,在界面返回前将遮罩盖在上一个页面之上,遮罩包括当前页面的视图影像,不断drawCircle并缩小其半径,同时减小当前页面视图的透明度,最终平滑的显示出上一个页面并移除遮罩。

三、具体使用

  1. helper = new BaseViewHelper
  2. .Builder(SecondActivity.this)
  3. //.setEndView()//如果是两个切换的视图 这里设定最终显示的视图
  4. .setTranslationView(v)//设置过渡视图
  5. .isFullWindow(true)//是否全屏显示
  6. .isShowTransition(true)//是否显示过渡动画
  7. .setDimColor(Color.WHITE)//遮罩颜色
  8. .setDimAlpha(200)//遮罩透明度
  9. //.setTranslationX(0)//x轴平移
  10. //.setRotation(360)//旋转
  11. //.setScaleX(0)//x轴缩放
  12. //.setScaleY(0)//y轴缩放
  13. //.setTranslationY(0)//y轴平移
  14. //.setDuration(800)//过渡时长
  15. //.setInterpolator(new AccelerateDecelerateInterpolator())//设置插值器
  16. //设置监听
  17. // .setOnAnimationListener(new BaseViewHelper.OnAnimationListener() {
  18. // @Override
  19. // public void onAnimationStartIn() {
  20. // Log.e("TAG","onAnimationStartIn");
  21. // }
  22. //
  23. // @Override
  24. // public void onAnimationEndIn() {
  25. // Log.e("TAG","onAnimationEndIn");
  26. // }
  27. //
  28. // @Override
  29. // public void onAnimationStartOut() {
  30. // Log.e("TAG","onAnimationStartOut");
  31. // }
  32. //
  33. // @Override
  34. // public void onAnimationEndOut() {
  35. // Log.e("TAG","onAnimationEndOut");
  36. // }
  37. // })
  38. .create();//开始动画

如果从A页面跳转至B页面,也就是Activity之间的跳转时,在A页面如下代码 :

  1. new BaseViewHelper
  2. .Builder(MainActivity.this, view)
  3. .startActivity(intent);

B页面代码:

  1. helper = new BaseViewHelper
  2. .Builder(SecondActivity.this)
  3. .isFullWindow(true)//是否全屏显示
  4. .isShowTransition(true)//是否显示过渡动画
  5. .setDimColor(Color.WHITE)//遮罩颜色
  6. .setDimAlpha(200)//遮罩透明度
  7. .create();//开始动画
  8. @Override
  9. public void onBackPressed() {
  10. if (helper!=null && helper.isShowing()){
  11. helper.backActivity(this);
  12. }else {
  13. super.onBackPressed();
  14. }
  15. }

如果在一个页面两个视图之间跳转,即A视图切换到B视图:

在当前页面代码:

  1. View v = View.inflate(this,R.layout.layout_second,null);
  2. //显示在当前页面跳转
  3. helper = new BaseViewHelper.Builder(this,view)
  4. .setEndView(v)
  5. .create();
  6. @Override
  7. public void onBackPressed() {
  8. if (helper!=null && helper.isShowing()){
  9. helper.back();
  10. }else {
  11. super.onBackPressed();
  12. }
  13. }

四、源码地址

项目地址:https://github.com/zhangke3016/ViewSpreadTranslationController

如果喜欢,欢迎star、fork、issues。

两行代码搞定Android视图扩散切换效果的更多相关文章

  1. jquery侧边折叠导航栏制作,两行代码搞定

    jquery侧边折叠导航栏制作,两行代码搞定 //CSS*{margin: 0;padding: 0} ul{list-style: none} .menu li ul{display: none} ...

  2. 两行代码搞定网站gzip压缩

    网站使用gzip压缩的好处就不用多说了吧,自行脑补,来说一下如何使用nodejs实现gzip压缩,只需要两行代码,so ease. 通过nodejs实现gzip 需要用到的模块 compression ...

  3. AJ学IOS(41)UI之核心动画 两行代码搞定3D转场

    AJ分享,必须精品 效果: 代码: 其实代码很少,苹果都给封装好了 // 1.创建核心动画 CATransition *ca = [CATransition animation]; // 1.1动画过 ...

  4. 两行代码搞定 JavaScript 的日期验证

    我们通常在 JavaScript 中验证日期,基本的思路大概是,先判断年月日是否有效,再判断当月是否有当日,比如一些月份没有 31 日,平年二月没有 29.30 日,闰年二月没有 30 日等等. 偶然 ...

  5. BaseHttpListActivity,几行代码搞定Android Http列表请求、加载和缓存

    Android开发中,向服务器请求一个列表并显示是非常常见的需求,但实现起来比较麻烦,代码繁杂. 随着应用的更新迭代,这种需求越来越多,我渐渐发现了实现这种需求的代码的共同点. 于是我将Activit ...

  6. 两行代码搞定UITableView无数据无网络显示-b

    不知是否有像我一样的,每次写TableView在监听网络和无数据源时逻辑处理提示视图都是一堆代码,很繁琐也很重复的垃圾代码(可能就只有我这样

  7. 两行代码搞定js对象深浅拷贝

    有一段时间没有更新博客了,忙于工作.2018年刚过去,今天来开启2018第一篇博文.好了,咱们步入正题. 先上代码 /** * 遍历对象 * 1.判断是不是原始值 * 2.判断是数组还是对象 * 3. ...

  8. 两行代码搞定UI主流框架

    XCNavTab XCNavTab适用于快速搭建NavigationController和TabBarController相结合的框架 https://github.com/xiaocaiabc/XC ...

  9. Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅

    原文:Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅 在前几期中总结分享了Android的前世今生.Android 系统架构和应用组件那些事.带你一起来聊一聊Android开发 ...

随机推荐

  1. [Kaggle] dogs-vs-cats之建立模型

    建立神经网络模型,下面要建立的模型如下: (上图来源:训练网络时,打开tensorboard即可观察网络结构,在下一节模型训练的时候会讲到) 下面为具体步骤: Step 0:导入相关库 import ...

  2. Go-GRPC 初体验

    grpc 跟常见的client-server模型相似(doubbo)grpc 编码之前需要准备以下环境: 安装protobuf,grpc的client与server之间消息传递使用的protoc格式消 ...

  3. Ubuntu+apt-get update时的源

    源是通过 /etc/apt/sources.list # file /etc/apt/sources.list.d # dir 来确定的, 只要将其中的相应文件/相应行删除了, 在apt-get up ...

  4. C++_进阶之函数模板_类模板

     C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...

  5. 对于python这门课程的一些想法、计划、期望

    本人是一名大二的码农,专业信息安全.之前在知乎上看到过对于python一些评论,说用python写的代码和诗一样.也在网上大概的了解了一下,python要求有严格的缩进.学习python语言,最想学的 ...

  6. winform中的数据绑定

    1. 简单的数据绑定 例1 using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[& ...

  7. vue报错 Do not use built-in or reserved HTML elements as component id:header

    组件,不能和html标签重复 header组件,h5新标签重复 Do not use built-in or reserved HTML elements as component id:header ...

  8. Flask博客开发——Tinymce编辑器

    之前Flask博客的文本编辑器比较简陋,这里为博客添加个优雅易用的Tinymce文本编辑器. 1.项目中添加Tinymce 下载好Tinymce包以及语言包,并添加到项目中.添加到项目的方法,参考了这 ...

  9. 报错pymysql.err.DataError: (1406, "Data too long for column 'gender' at row 1")

    在Django默认的admin后台创建超级用户时, 报错pymysql.err.DataError: (1406, "Data too long for column 'gender' at ...

  10. [SHOI2008]cactus仙人掌图

    [题目描述] 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例 ...