ActivityOptionsCompat 过渡动画

  • makeCustomAnimation (Context context, int enterResId, int exitResId)

    • 需要自定义两个动画效果

ActivityOptionsCompat compat = ActivityOptionsCompat.makeCustomAnimation(this, R.anim.in, R.anim.out);
Intent intent = new Intent(this, MyActivity.class);
ActivityCompat.startActivity(this, intent, compat.toBundle());
  • makeScaleUpAnimation (View source, int startX,int startY, int width,int height)
  • 缩放动画,可以指定位置开始缩放,这里我是在图片中间开始进行缩放的

ActivityOptionsCompat compat = ActivityOptionsCompat.makeScaleUpAnimation(view, view.getWidth() / 2,  view.getHeight() / 2, 0, 0);
Intent intent = new Intent(this, MyActivity.class);
ActivityCompat.startActivity(this, intent, compat.toBundle());
  • makeThumbnailScaleUpAnimation(View source, Bitmap thumbnail, int startX, int startY)
  • 默认从图片的左上角开始缩放,可以指定偏移量

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.a4);ActivityOptionsCompat compat =ActivityOptionsCompat.makeThumbnailScaleUpAnimation(view, bitmap, -500, 500);Intent intent = new Intent(this, MyActivity.class);ActivityCompat.startActivity(this, intent, compat.toBundle());
  • makeSceneTransitionAnimation : 共享元素动画

    • 条件一,需要布局1和布局2,有共同的元素
    • 给这两个共同的元素设置android:transitionName属性,和id
ActivityOptionsCompat compat = ActivityOptionsCompat.makeSceneTransitionAnimation(this,Pair.create(findViewById(R.id.img1), "noe"),Pair.create(findViewById(R.id.img2), "two"));Intent intent = new Intent(this, MyActivity.class);ActivityCompat.startActivity(this, intent, compat.toBundle());

Scene(场景动画)

  • google在旧版本的API中提供了View Animation与Propery Animator两套动画系统,可是这两套动画系统都是要程序员自己编写大量的动画代码,但是在5.0版本后,程序员只需要把开始动画前的布局和结束时的布局写出来就可以了,不用再去写大量的动画代码了,这个动画就是transition
  • 场景动画 : 我们可以把需要实现动画效果的布局或者部分布局叫做场景,我们在切换场景的时候只需要告诉它实现什么效果的动画就可以.
  • Scene.getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context) : 创建一个场景
    • sceneRoot : 场景的位置,就是说我这个场景的作用域,我这里是使用了MainActivity的跟布局
    • layoutId : 场景的布局
    • context : 上下文对象
  • TransitionManager.beginDelayedTransition(Viewgroup group) : 延迟场景变化,TransitionManager就会根据场景变化自动执行动画
  • TransitionManager.go(Scene scene, Transition transition) : 切换到指定的场景
    • scene : 场景对象
    • transition : 以什么动画切换场景


/**
*   两个场景对应两个布局,还给布局中的ImageView设置了transitionName的属性
*/
public class MainActivity extends AppCompatActivity {private RelativeLayout mActivityMain;private Scene mScene1;private Scene mScene2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mActivityMain = (RelativeLayout) findViewById(R.id.activity_main);if (Build.VERSION.SDK_INT >= 21) {//创建两个场景mScene1 = Scene.getSceneForLayout(mActivityMain, R.layout.scene1_layout, this);mScene2 = Scene.getSceneForLayout(mActivityMain, R.layout.scene2_layout, this);//一开始Activity就切换到场景1,为了到场景二后可以切换回场景二TransitionManager.go(mScene1, new ChangeBounds());}}//切换到场景二public void click(View view) {if (Build.VERSION.SDK_INT >= 21 && mScene1 != null) {TransitionManager.go(mScene2, new ChangeBounds());}}//切换到场景1public void scene2(View view) {if (Build.VERSION.SDK_INT >= 21 && mScene1 != null) {TransitionManager.go(mScene1, new ChangeBounds());}}
}

beginDelayedTransition

  • beginDelayedTransition(ViewGroup sceneRoot, Transition transition) : beginDelayedTransition不会直接就执行动画效果,需要它监听的ViewGroup对象发生了变化才会执行动画效果

  • 布局代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/content"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Button
        android:onClick="click"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="点我"/><TextView
        android:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="25sp"android:text="Hello World!"/>
</LinearLayout>
  • java代码

public class MainActivity extends AppCompatActivity {private TextView mTv;private LinearLayout mContent;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {mTv = (TextView) findViewById(R.id.tv);mContent = (LinearLayout) findViewById(R.id.content);}public void click(View view) {int visibility = mTv.getVisibility();if (Build.VERSION.SDK_INT >= 21) {//开始监视ViewGroup,对象一旦发生变化,就会执行动画TransitionManager.beginDelayedTransition(mContent, new Slide(Gravity.RIGHT));}//让其发生变化从而执行动画mTv.setVisibility(visibility == View.VISIBLE ? View.GONE : View.VISIBLE);}
}

explose

  • 类似爆炸的动画效果

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic void onItemClick(int Position) {//创建一个爆炸的动画Explode explode = new Explode();//延时时间explode.setDuration(1000);//监听ViewGroup,一旦变化就开始动画TransitionManager.beginDelayedTransition(mRlv, explode);//删除RecyclerView里面的数据,让其发生变化,从而启动动画mMyAdapter.removeDatas();}

Transition 与 Activity

  • Transition 与 Activity的跳转动画有以下几个

    • setEnterTransition Activity进入的动画
    • setExitTransition Activity退出的动画
    • setReturnTransition Activity返回的动画
    • setReenterTransition Activity重入的动画
  • 这个Demo是一个Activity退出时的一个动画效果


public class MainActivity extends AppCompatActivity {@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//想要使用transition动画需要配置Slide explode = new Slide(Gravity.RIGHT);getWindow().setExitTransition(explode);getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);setContentView(R.layout.activity_and_transition);}public void explose(View view) {Intent intent = new Intent(this, Main2Activity.class);if (Build.VERSION.SDK_INT >= 21)startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());}
}

水波纹动画

  • ViewAnimationUtils.createCircularReveal(View view,int centerX,int centerY,float startRadius, float endRadius)

    • view 用来显示圆形动画的控件
    • centerX 圆心的坐标X轴
    • centerY 圆心的坐标Y轴
    • startRadius 动画开始圆形的半径
    • endRadius 动画结束时圆形的半径


public class MainActivity extends AppCompatActivity {private FrameLayout mFl;private RelativeLayout mActivityMain;private int mWidth;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取屏幕宽度WindowManager wm = this.getWindowManager();mWidth = wm.getDefaultDisplay().getWidth();//获取布局的控件initView();}private void initView() {mFl = (FrameLayout) findViewById(R.id.fl);mActivityMain = (RelativeLayout) findViewById(R.id.activity_main);}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public void click(View view) {Animator anim = ViewAnimationUtils.createCircularReveal(mFl, (int)(mWidth / 2), (int)(mFl.getMeasuredHeight() / 2),0, mWidth);mFl.setBackgroundColor(Color.RED);//波纹的颜色anim.setDuration(2000); //动画执行时间anim.setInterpolator(new AccelerateDecelerateInterpolator());anim.start();   //开启动画}
}
  • 共享动画+水波纹动画

  • Activity1的代码,做了一个共享动画,需要在两个共享元素的控件上(两个圆)加上transitionName属性

public class RippleActivity extends AppCompatActivity{@RequiresApi(api = Build.VERSION_CODES.KITKAT)@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.ripper_activity_layout);}public void click(View view) {ActivityOptionsCompat compat = ActivityOptionsCompat.makeSceneTransitionAnimation(this,findViewById(R.id.circle1), "circle");Intent intent = new Intent(this, CircleActivity2.class);ActivityCompat.startActivity(this, intent, compat.toBundle());}
}
  • Activity2的代码

public class CircleActivity2 extends AppCompatActivity{@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);ChangeBounds changeBounds = new ChangeBounds();//进场动画结束后,再执行水波纹动画changeBounds.addListener(new Transition.TransitionListener() {@Overridepublic void onTransitionStart(Transition transition) {}@Overridepublic void onTransitionEnd(Transition transition) {//水波纹动画show();}@Overridepublic void onTransitionCancel(Transition transition) {}@Overridepublic void onTransitionPause(Transition transition) {}@Overridepublic void onTransitionResume(Transition transition) {}});getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);getWindow().setSharedElementEnterTransition(changeBounds);setContentView(R.layout.circle_activit_layout2);}public void show(){Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);//位置int width = toolbar.getMeasuredWidth() / 2;int height = toolbar.getMeasuredHeight() / 2;int max = Math.max(width, height);Animator anim = ViewAnimationUtils.createCircularReveal(toolbar, width, height, 0, max);toolbar.setBackgroundColor(getResources().getColor(R.color.colorPrimary));anim.setDuration(1000);anim.start();}
}

MaterialDesigner(三)相关推荐

  1. 转载:自动驾驶之软件定义汽车

    写文章 自动驾驶之软件定义汽车 慕容衣 ​ 金融从业者 ​ 关注他 1 人 赞同了该文章 软件定义汽车时代下,智能汽车软件架构逐步向 SOA 迈进,软件成为智能汽车差异化的核心 汽车智能化的大趋势下, ...

  2. 伍六七带你学算法 进阶篇-三数之和

    三数之和 难度-中等 题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...

  3. 远程控制virtual box虚拟机系统的三种方式

    远程控制virtual box虚拟机系统的三种方式[阅读时间:5分钟] 1.使用现有的远程控制软件 2.使用SSH连接 3.使用远程桌面控制虚拟机系统 对于把虚拟机安装在寝室笔记本的人来说,能够远程控 ...

  4. 2022-2028年中国三轴陀螺仪行业市场深度分析及投资前景分析报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了三轴陀螺仪行业相关概述.中国三轴陀螺仪行业运行环境.分析了中国三轴陀 ...

  5. TCP三次握手和四次挥手的解释

    基础知识 在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段. 它们的含义是: SYN ...

  6. python实现简单的用户密码登录控制(输入三次就锁定用户)

    问题描述 我们经常在登录一些网站的时候,发现我们如果连续的输错好几次密码,我们的帐号就被锁定起来了,那这个过程是如何实现的呢?本程序主要就是解决以下3件事情 1.输入用户名密码 2.认证成功并显示欢迎 ...

  7. 难忘的一天——装操作系统(三)

    谈我此次装机的曲折过程,本来我是打算win7,win8.1,win10这三个系统都装个遍,这样多装几次差不多就会了.刚开始装win7.我就卡壳了. 开始装了,进入了老毛桃的界面,浏览文件选中自己优盘里 ...

  8. 提高班第三周周记(中秋第三天)

    中秋节第三天 早上总结昨天下午的头脑风暴.头脑风暴:不批评不教育,给所有人说话的机会.我很喜欢. 有人说:你是什么样子,你的世界就是什么样子. 1.不要绝对思维.不同场合我们选择的工具不同.不是说电子 ...

  9. 提高班第三周周记(中秋第一天)

    这是第三周,也是中秋节.没有月饼的中秋节.但我过得很充实.我很快乐,发自内心的. 中秋第一天早上贾琳师哥讲课.讲他为什么辞职来这里.他的确学成,有着令人羡慕的工资.可是他的问题让我触动. 提到了邓稼先 ...

最新文章

  1. linux uefo引导 win_基于UEFI和GPT模式下U盘安装windows8.1和Linux双启动教程
  2. leetcode_linearList03
  3. Memcached分布式算法详解--转
  4. 编程笔试(解析及代码实现):求出一个整数中各位数上所包含全部质数之和
  5. [BZOJ 1500] [NOI2005] 维修数列
  6. 2018暑假集训测试六总结
  7. 流媒体测试笔记记录之————阿里云监控、OBS、FFmpeg拉流和推流变化比较记录...
  8. Linux vector最大存储数量,C++ STL vector容量(capacity)和大小(size)的区别
  9. 模板 - 图论 - 最小生成树
  10. Appium+Python之批量执行测试用例
  11. 亲宝伙伴ai早教机器人_伴随孩子成长的智能伙伴,聪聪AI陪伴教育机器人让学习更轻松!...
  12. grep正则表达式详解及练习
  13. 服务器清洗项目,服务器带电清洗流程和注意事项
  14. MySQL Front的作者到底何许人也,这款好用的sql可视化软件背后有什么故事。。
  15. 学习C++程序设计需要什么基础
  16. IIS 发布网站无法显示图片
  17. 2019 ICPC 南京区域赛 - H Prince and Princess(博弈+思维)
  18. 天猫精灵方糖AI智能音箱拆解报告
  19. 域名CNAME记录不能同时适配根域名和www的解决方法
  20. 耳机插入电脑没反应 控制面板也找不到realtek音频管理器的解决方案

热门文章

  1. gMIS吉密斯十年执念:Lower Costs较低成本Better Productivity较高效率
  2. oracal开发工作记录
  3. 全景丨0基础学习VR全景制作,平台篇第八章:全局功能-说一说管理
  4. html5测网址,HTML5浏览器测试网站汇总
  5. 人类线粒体全基因组二代测序原始数据过滤
  6. pixhawk2.4.8(FMUV3)变砖拯救方法
  7. 英特尔酷睿i3和i5的区别是什么?
  8. 社会网络分析利器——pajek使用教程 比保姆还保姆!
  9. 如何做好“全面”预算管理?提升企业综合竞争力
  10. Intellij IDEA查看所有断点