2024年Android最全项目需求讨论 — 用Transition做一个漂亮的登录界面(1),进大厂面试填什么表

总结

【Android 详细知识点思维脑图(技能树)】

我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

最后,赠与大家一句话,共勉!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Transition:

所以我们知道了用的是过渡的方式来做,那什么是过渡呢?

Android 4.4:

Android对于开发者提供了越来越多的动画API支持。从API 1就存在的Drawable Animation和View Animation,以及API 11(Android 3.0)以后加入的Property Animation。而过渡动画Transition是在API 19(Android 4.4.2)中加入的。

基础知识我就不说了,直接看其他文章传送门:

Android 过渡(Transition)动画解析之基础篇

所以初步我们可以理解为(可能这么说明有不对,可以提出):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

场景(scenes)和变换(transitions)。场景(scenes)定义了当前的UI状态,变换(transitions)则定义了在不同场景之间动画变化的过程。

当一个场景改变的时候,transition主要负责:

(1)捕捉每个View在开始场景和结束场景时的状态。

(2)根据两个场景(开始和结束)之间的区别创建一个Animator。

Android 5.0

Android 5.0中Transition可以被用来实现Activity或者Fragment切换时的异常复杂的动画效果。

虽然在以前的版本中,已经可以使用Activity的overridePendingTransition() 和 FragmentTransaction的setCustomAnimation()来实现Activity或者Fragment的动画切换,但是他们仅仅局限与将整个视图一起动画变换。新的Lollipop api更进了一步,让单独的view也可以在进入或者退出其布局容器中时发生动画效果,甚至还可以在不同的activity/Fragment中共享一个view。

还是上面那个图,只是变成了二个Activity界面:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们在跳转到第二个Activity的时候,我们会有个过场动画。会第一个Activity的按钮移动到第二个Activity的按钮。效果如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以我们再回头看下面这种效果,是不是就知道怎么实现了,用的是Activity的过渡动画了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

大家也可以看看下面的相关文章链接:

Activity和Fragment Transition介绍

深入理解Content Transition

深入理解共享元素变换(Shared Element Transition)-上


正文

我们先准备第一个Activity,界面如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Activity 1

第一步:fab按钮的移动:

我们让那个按钮"+"能移动到顶部:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们由前面的demo说明已经知道了,启动第二个Activity,我们我们先让第二个Activity的界面如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们设置第二个Activity的主题为:

没错,我们在第二个界面先写上一个按钮"X",这样我们启动第二个Activity的时候就盖在了第一个Activity的上面,同时这个fab按钮也有了动画的效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代码很简单,只要让第一个Activity的按钮的android:transitionName与第二个Activity的按钮的android:transitionName一样就可以。我们称这个为共享元素

FloatingActionButton btn = findViewById(R.id.fab);;

ActivityOptionsCompat optionsCompat
= ActivityOptionsCompat.makeSceneTransitionAnimation(LoginMainActivity.this,btn,btn.getTransitionName());
startActivity(new Intent(LoginMainActivity.this,RegisterMainActivity.class),optionsCompat.toBundle());

然后通过ActivityOptionsCompat来记录当前这个Activity的这个fab按钮的状态。然后在startActivity的时候,通过optionsCompat.toBundle()把内容带到了第二个Activity中。第二个Activity就会让现在的相同trasitionName的fab按钮,以传过来的第一个Activity的按钮相同位置的为起始点,然后通过动画到了最终的地方。(所以动画是在第二个Activity中完成的,只是按钮的起始状态是以第一个Activity传过来的按钮的状态信息相同,然后到最终用户设置的位置。)

我们可以看到,共享元素变换并不是真正实现了两个activity或者Fragment之间元素的共享,实际上我们看到的几乎所有变换效果中(不管是B进入还是B返回A),共享元素都是在B中绘制出来的。Framework没有真正试图将A中的某个元素传递给B,而是采用了不同的方法来达到相同的视觉效果。A传递给B的是共享元素的状态信息。B利用这些信息来初始化共享View元素,让它们的位置、大小、外观与在A中的时候完全一致。当变换开始的时候,B中除了共享元素之外,所有的其他元素都是不可见的。随着动画的进行,framework 逐渐将B的activity窗口显示出来,当动画完成,B的窗口才完全可见。

并且其实动画是绘制在ViewOverlay上面,可以看看这篇文章:ViewOverlay与animation介绍

第二步让fab按钮通过曲线路径变化:

我们直接不做任何处理,默认是fab按钮的位置变化是直线。 我们更希望是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以设置共享元素的进入动画:

<?xml version="1.0" encoding="utf-8"?>

//获取过渡动画
Transition transition = TransitionInflater.from(this).inflateTransition(R.transition.fabtransition);
设置共享元素的进入动画
getWindow().setSharedElementEnterTransition(transition);

这里使用的是arcMotion来做的曲线路径.

ArcMotion文档

里面的介绍我用的谷歌翻译翻译的,大致应该是这个意思: PathMotion在包含两个点的假想圆上沿圆弧生成曲线路径。 如果点之间的水平距离小于垂直距离,则圆的中心点将与终点水平对齐。 如果垂直距离小于水平距离,则圆的中心点将与终点垂直对齐。 当两点接近水平或垂直时,运动的曲线将会变小,因为圆的中心距两点都很远。 要强制路径的曲率,可以使用setMinimumHorizontalAngle(float)和setMinimumVerticalAngle(float)来设置两点之间的弧的最小角度。

其他参考文章:

曲线运动-1

曲线运动 - 2

第三步fab按钮动画结束后出现注册界面:

我们上一步对fab按钮设置了过渡的动画。我们可以对这个过渡动画设置结束的监听,然后其他我们的注册界面的出现:

Transition transition = TransitionInflater.from(this).inflateTransition(R.transition.fabtransition);
getWindow().setSharedElementEnterTransition(transition);
transition.addListener(new Transition.TransitionListener() {


@Override
public void onTransitionEnd(Transition transition) {
transition.removeListener(this);

/*我们可以在动画结束后,
可以在这里写上代码,
让注册界面出现
*/

}
});

这是我们的第二个Activity的布局变成了这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

只不过默认这个注册界面是不可见的,等到我们的fab按钮动画结束后,我们再让注册界面可见就可以了。

这里我们可以直接在上面fab按钮动画结束的时候,直接让注册界面出现(因为这个注册界面是用CardView写的,所以这里直接用cardView来指这个实例),我们可以在上面的结束监听里面直接设置:

@Override
public void onTransitionEnd(Transition transition) {
transition.removeListener(this);
//设置可见
cardView.setVisibility(View.VISIBLE);
}

效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们发现,直接突然出现,虽然功能实现了,但我们还是希望有更好看的效果,就像文章开头那样,这个注册界面是慢慢展开的。所以我们在fab按钮过渡动画结束后,不是简单的对cardView设置View.VISIBLE就可以。我们使用揭露动画来实现:

Animator mAnimator = ViewAnimationUtils.createCircularReveal(cardView,cardView.getWidth()/2
,0,0,cardView.getHeight());
mAnimator.setDuration(500);

最后笔者收集整理了一份Flutter高级入门进阶资料PDF

以下是资料目录和内容部分截图



里面包括详细的知识点讲解分析,带你一个星期入门Flutter。还有130个进阶学习项目实战视频教程,让你秒变大前端。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

339)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值