两行代码搞定Android视图扩散切换效果
用最简单的方式来实现Android视图扩散切换效果。
一、概述
这两天时间动手撸了个视图扩散切换效果的控制器,API兼容至Android4.0,更方便我们在视图切换过程中有炫酷的过渡效果。本来是想实现两个View
之间的过渡动画,实现的过程中想到之前写的Activity
切换动画,就试着加上了对Activity
切换的动画支持。先来看看效果吧,代码实现只需一行,感觉还不错~
二、实现思路简单阐述
关于过渡动画的实现,我们先简单分解下这个效果,首先,当Activity发生跳转时我们要先获取共享元素控件,在跳转的界面将其添加在跳转页面之上,关于控件位置的获取,在上一篇文章Android碎裂的粒子效果一文中进行了介绍,主要是通过如下方法获取其位置:
protected Rect getRectInWindow(View view, boolean mIsFullWindow){
int[] location = new int[2];
view.getLocationInWindow(location);
return new Rect(location[0],location[1],location[0]+view.getMeasuredWidth(),location[1]+view.getMeasuredHeight());
}
当跳转至目标页面,我们现在其上方盖上一层遮罩,遮罩为我们自定义的控件,在控件上方绘制上一个页面的过渡视图,将其旋转、平移、或者缩放操作:
canvas.save();
Matrix matrix = new Matrix();
matrix.postTranslate(mRect.left ,mRect.top);
matrix.postScale(mScaleXCanvas,mScaleYCanvas,mRect.centerX(),mRect.centerY());
matrix.postRotate(mRotationCanvas,mRect.centerX(),mRect.centerY());
canvas.concat(matrix);
mView.draw(canvas);
canvas.restore();
最后就是圆形散开效果了,这里我在自定义控件上使用的是Xfermode
,不断drawCircle
并扩大半径,最终显示出跳转页面视图并将遮罩移除。记得关闭硬件加速。
mClearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
setLayerType(LAYER_TYPE_SOFTWARE,null);
返回动画同理,在界面返回前将遮罩盖在上一个页面之上,遮罩包括当前页面的视图影像,不断drawCircle
并缩小其半径,同时减小当前页面视图的透明度,最终平滑的显示出上一个页面并移除遮罩。
三、具体使用
helper = new BaseViewHelper
.Builder(SecondActivity.this)
//.setEndView()//如果是两个切换的视图 这里设定最终显示的视图
.setTranslationView(v)//设置过渡视图
.isFullWindow(true)//是否全屏显示
.isShowTransition(true)//是否显示过渡动画
.setDimColor(Color.WHITE)//遮罩颜色
.setDimAlpha(200)//遮罩透明度
//.setTranslationX(0)//x轴平移
//.setRotation(360)//旋转
//.setScaleX(0)//x轴缩放
//.setScaleY(0)//y轴缩放
//.setTranslationY(0)//y轴平移
//.setDuration(800)//过渡时长
//.setInterpolator(new AccelerateDecelerateInterpolator())//设置插值器
//设置监听
// .setOnAnimationListener(new BaseViewHelper.OnAnimationListener() {
// @Override
// public void onAnimationStartIn() {
// Log.e("TAG","onAnimationStartIn");
// }
//
// @Override
// public void onAnimationEndIn() {
// Log.e("TAG","onAnimationEndIn");
// }
//
// @Override
// public void onAnimationStartOut() {
// Log.e("TAG","onAnimationStartOut");
// }
//
// @Override
// public void onAnimationEndOut() {
// Log.e("TAG","onAnimationEndOut");
// }
// })
.create();//开始动画
如果从A页面跳转至B页面,也就是Activity之间的跳转时,在A页面如下代码 :
new BaseViewHelper
.Builder(MainActivity.this, view)
.startActivity(intent);
B页面代码:
helper = new BaseViewHelper
.Builder(SecondActivity.this)
.isFullWindow(true)//是否全屏显示
.isShowTransition(true)//是否显示过渡动画
.setDimColor(Color.WHITE)//遮罩颜色
.setDimAlpha(200)//遮罩透明度
.create();//开始动画
@Override
public void onBackPressed() {
if (helper!=null && helper.isShowing()){
helper.backActivity(this);
}else {
super.onBackPressed();
}
}
如果在一个页面两个视图之间跳转,即A视图切换到B视图:
在当前页面代码:
View v = View.inflate(this,R.layout.layout_second,null);
//显示在当前页面跳转
helper = new BaseViewHelper.Builder(this,view)
.setEndView(v)
.create();
@Override
public void onBackPressed() {
if (helper!=null && helper.isShowing()){
helper.back();
}else {
super.onBackPressed();
}
}
四、源码地址
项目地址:https://github.com/zhangke3016/ViewSpreadTranslationController
如果喜欢,欢迎star、fork、issues。
两行代码搞定Android视图扩散切换效果的更多相关文章
- jquery侧边折叠导航栏制作,两行代码搞定
jquery侧边折叠导航栏制作,两行代码搞定 //CSS*{margin: 0;padding: 0} ul{list-style: none} .menu li ul{display: none} ...
- 两行代码搞定网站gzip压缩
网站使用gzip压缩的好处就不用多说了吧,自行脑补,来说一下如何使用nodejs实现gzip压缩,只需要两行代码,so ease. 通过nodejs实现gzip 需要用到的模块 compression ...
- AJ学IOS(41)UI之核心动画 两行代码搞定3D转场
AJ分享,必须精品 效果: 代码: 其实代码很少,苹果都给封装好了 // 1.创建核心动画 CATransition *ca = [CATransition animation]; // 1.1动画过 ...
- 两行代码搞定 JavaScript 的日期验证
我们通常在 JavaScript 中验证日期,基本的思路大概是,先判断年月日是否有效,再判断当月是否有当日,比如一些月份没有 31 日,平年二月没有 29.30 日,闰年二月没有 30 日等等. 偶然 ...
- BaseHttpListActivity,几行代码搞定Android Http列表请求、加载和缓存
Android开发中,向服务器请求一个列表并显示是非常常见的需求,但实现起来比较麻烦,代码繁杂. 随着应用的更新迭代,这种需求越来越多,我渐渐发现了实现这种需求的代码的共同点. 于是我将Activit ...
- 两行代码搞定UITableView无数据无网络显示-b
不知是否有像我一样的,每次写TableView在监听网络和无数据源时逻辑处理提示视图都是一堆代码,很繁琐也很重复的垃圾代码(可能就只有我这样
- 两行代码搞定js对象深浅拷贝
有一段时间没有更新博客了,忙于工作.2018年刚过去,今天来开启2018第一篇博文.好了,咱们步入正题. 先上代码 /** * 遍历对象 * 1.判断是不是原始值 * 2.判断是数组还是对象 * 3. ...
- 两行代码搞定UI主流框架
XCNavTab XCNavTab适用于快速搭建NavigationController和TabBarController相结合的框架 https://github.com/xiaocaiabc/XC ...
- Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅
原文:Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅 在前几期中总结分享了Android的前世今生.Android 系统架构和应用组件那些事.带你一起来聊一聊Android开发 ...
随机推荐
- [转]Python多进程并发操作中进程池Pool的应用
Pool类 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量的时间.如果操作的对象数目不大时,还可以直接使用Process类动态的生成多个进程,十 ...
- Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布
Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布 摘要: jeasypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导 ...
- lvs 负载均衡 NAT模式
1.原理 基于NAT机制实现.当用户请求到达director之后,director将请求报文的目标地址(即VIP)改成选定的realserver地址,同时将报文的目标端口也改成选定的realserve ...
- 0418 jQuery笔记(添加事件、each、prop、$(this))
1.添加点击事件.each.prop.$(this) //全选框的被动操作 //定义一个标志保存最终状态 var flag = false; //为每一个选择框添加点击事件,数组.click() $( ...
- Markdown 编辑器使用指南
Markdown 编辑器使用指南 1.快捷键 加粗: Ctrl/Cmd + B 标题: Ctrl/Cmd + H 插入链接: Ctrl/Cmd + K 插入代码: Ctrl/Cmd + Shift + ...
- Mysql之数据类型(胖胖老师)
like语句与通配符insert into teacher_1 values('胖胖', '男', 18),('小明', '男', 19),('张三', '男', 30),('李四', '男', 27 ...
- [HNOI 2010]Bounce 弹飞绵羊
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- [NOIp 2015]斗地主
Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3& ...
- [APIO2016]
2016的题貌似是韩国棒子出的,好丧啊.... 看了题解还想了好久...... ------------------------------------------------- A.Boat 有n个 ...
- python 中range numpy.arange 和 numpy.linspace 的区别
1.返回值不同 range返回一个range对象,numpy.arange和numpy.linspace返回一个数组. 2.np.arange的步长可以为小数,但range的步长只能是整数. 与Pyt ...