Android实现移动小球和CircularReveal页面切换动画实例代码
程序员文章站
2023-12-16 22:06:16
前言
本文主要给大家介绍了关于android如何实现移动小球和circularreveal页面切换动画的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的...
前言
本文主要给大家介绍了关于android如何实现移动小球和circularreveal页面切换动画的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
效果图如下
是在fragment中跳转activity实现的效果,fragment跳fragment,activity跳activity类似~~
实现过程
- 重写floatingactionbutton的ontouchlistener()方法,使小球可以移动,并判断边界
- 点击fab时记录坐标传到下一个页面,在下一个页面展示动画。
- 点击后退或者重写onbackpressed()方法,执行动画
重写fab的ontouchlistener()
floatingactionbutton.setontouchlistener(new view.ontouchlistener() { @override public boolean ontouch(view view, motionevent ev) { switch (ev.getaction()) { case motionevent.action_down: downx = ev.getx(); downy = ev.gety(); isclick = true; break; case motionevent.action_move: isclick = false; movex = ev.getx(); movey = ev.gety(); int offsetx = (int) (movex - downx); int offsety = (int) (movey - downy); //这里使用了settranslation来移动view。。。尝试过layout。不知道为什么fragment切换回来的时候会恢复原位 floatingactionbutton.settranslationx(floatingactionbutton.gettranslationx() + offsetx); floatingactionbutton.settranslationy(floatingactionbutton.gettranslationy() + offsety); break; case motionevent.action_up: //用来触发点击事件 if (isclick) { startact(); return false; } //用来判断移动边界 if (floatingactionbutton.getx() < 0) { floatingactionbutton.setx(0); } if (floatingactionbutton.getx() + floatingactionbutton.getwidth() > screenutil.getscreenwidth(getcontext())) { floatingactionbutton.setx(screenutil.getscreenwidth(getcontext()) - floatingactionbutton.getwidth()); } if (floatingactionbutton.gety() < titleheight) { floatingactionbutton.sety(0); } if (floatingactionbutton.gety() + floatingactionbutton.getheight() + titleheight > getactivity().findviewbyid(r.id.activity_main_mainll).getheight() - getactivity().findviewbyid(r.id.fc_rg).getheight()) { floatingactionbutton.sety(getbottomy()); } break; } return true; } private void startact() { //跳转activity,传递动画参数 intent intent = new intent(getactivity(), checkworkactivity.class); intent.putextra("x", (int) floatingactionbutton.getx() + floatingactionbutton.getwidth() / 2); intent.putextra("y", (int) floatingactionbutton.gety() + floatingactionbutton.getheight() / 2); intent.putextra("start_radius", floatingactionbutton.getwidth() / 2); intent.putextra("end_radius", dialogfragment.this.view.getheight()); startactivity(intent); } });
在下一个页面中实现circlerevel动画
oncrete中调用
private void initanimation() { //ll为根布局 final linearlayout linearlayout = (linearlayout) findviewbyid(r.id.ll); linearlayout.post(new runnable() { @override public void run() { if (build.version.sdk_int >= build.version_codes.lollipop) { animator animator = viewanimationutils.createcircularreveal( linearlayout,// 操作的视图 getintent().getintextra("x", 0), // 动画的中心点x getintent().getintextra("y", 0) + findviewbyid(r.id.title).getheight(), // 动画的中心点y getintent().getintextra("start_radius", 0), // 动画半径 getintent().getintextra("end_radius", 0) // 动画结束半径 ); animator.setinterpolator(new accelerateinterpolator()); animator.setduration(500); animator.start(); } } }); }
点击后退或者触发onbackpressed时候调用
private void endanim() { final linearlayout linearlayout = (linearlayout) findviewbyid(r.id.ll); if (build.version.sdk_int >= build.version_codes.lollipop) { animator animator = viewanimationutils.createcircularreveal( linearlayout,// 操作的视图 getintent().getintextra("x", 0), getintent().getintextra("y", 0) + findviewbyid(r.id.title).getheight(), getintent().getintextra("end_radius", 0), getintent().getintextra("start_radius", 0) ); animator.setinterpolator(new accelerateinterpolator()); animator.setduration(500); animator.addlistener(new animatorlisteneradapter() { @override public void onanimationend(animator animation) { super.onanimationend(animation); finish(); } }); animator.start(); } }
还有一个重要的地方是修改两个activity的theme
<style name="appthemecirclerevel" parent="theme.appcompat.light.noactionbar"> <!-- customize your theme here. --> <item name="colorprimary">@color/colorprimary</item> <item name="colorprimarydark">@color/colorprimarydark</item> <item name="coloraccent">@color/blue</item> <item name="android:windowanimationstyle">@null</item> <item name="android:windowbackground">@android:color/transparent</item> <item name="android:windowistranslucent">true</item> <item name="android:colorbackgroundcachehint">@null</item> </style>
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。