欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现移动小球和CircularReveal页面切换动画实例代码

程序员文章站 2023-12-16 22:06:16
前言 本文主要给大家介绍了关于android如何实现移动小球和circularreveal页面切换动画的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的...

前言

本文主要给大家介绍了关于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>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

上一篇:

下一篇: