Android UI效果篇-(3)用属性动画实现收缩菜单

 
 

前言

~ 这篇文章主要记录下属性动画的简单使用,通过属性动画来实现一个常见的收缩菜单的功能。效果如下:

收缩菜单动画效果

1.属性动画简单使用

~ 下面通过第一种收缩的样式代码来详细介绍下属性动画的属性:

private boolean isOpen = true;//开关标志位
LinearLayout ll= (LinearLayout) findViewById(R.id.llbottom);//模拟的底部菜单栏
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {    
  @Override    
  public void onClick(View view) {        
    if (isOpen) {            
    isOpen = false;            
    ObjectAnimator animator = ObjectAnimator.ofFloat(ll, View.TRANSLATION_X,ll.getWidth());            
    animator.start();        
    } else {            
    isOpen = true;            
    ObjectAnimator animator = ObjectAnimator.ofFloat(ll, View.TRANSLATION_X, 0);            
    animator.start();        
    }    
}});

这里使用ObjectAnimator类对底部菜单栏ll的X轴方向进行了平移动画处理,平移的距离是底部菜单栏ll的整个宽度。

ObjectAnimator animator = ObjectAnimator.ofFloat(ll, View.TRANSLATION_X,ll.getWidth());
  • 第一个参数:被操控的View
  • 第二个参数:需要被改变的View的属性
  • 第三个参数:改变的大小

其实还可以有更多的参数:

ObjectAnimator animator = ObjectAnimator.ofFloat(ll, View.TRANSLATION_X,0,ll.getWidth(),0,llll.getWidth(),0);

这样实现的就是一个来回拉伸的效果。


2.属性动画属性值

~

属性值名称对应View属性值名称属性效果
"translationX"View.TRANSLATION_X在X轴上平移
"translationY"View.TRANSLATION_Y在Y轴上平移
"translationZ"View.TRANSLATION_Z在Z轴上平移
"x"View.XView的x坐标
"y"View.YView的y坐标
"alpha"View.ALPHA改变View的透明度
"rotation"View.ROTATION围绕支点进行2D旋转
"rotationX"View.ROTATION_X围绕X轴进行3D旋转
"rotationY"View.ROTATION_Y围绕Y轴进行3D旋转
"scaleX"View.SCALE_X缩放X轴
"scaleY"View.SCALE_Y缩放Y轴

以上就是全部的属性动画属性值,部分会有api版本的限制,比如“z”,“translationZ”等,不建议使用。


3.改变属性动画的缩放点

~
属性动画并没有像补间动画一样提供了“pivotX”的方法来改变缩放动画的点,所以我们需要手动来设置缩放点。我们知道属性动画是直接改变的控件的属性,所以我们直接改变控件的"PivotX"或者"PivotY"即可。

DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; 
ll.setPivotX(width);
ll.setPivotY(0);

通过上面的代码我们就将缩放点改变到了控件的右上角,默认是控件左上角。


4.其他效果的核心代码

  • 效果二:平移Y轴
    if (isOpen2) {   
    isOpen2 = false;   
    ObjectAnimator animator = ObjectAnimator.ofFloat(ll2, View.TRANSLATION_Y, ll.getHeight());    
    animator.start();
    } else {    
    isOpen2 = true;    
    ObjectAnimator animator = ObjectAnimator.ofFloat(ll2, View.TRANSLATION_Y, 0);      
    animator.start();
    }
  • 效果三:缩放Y轴
    if (isOpen3) {   
    isOpen3 = false;    
    ObjectAnimator animator = ObjectAnimator.ofFloat(ll3, View.SCALE_Y, 1);    
    animator.start();
    } else {    
    isOpen3 = true;    
    ObjectAnimator animator = ObjectAnimator.ofFloat(ll3, View.SCALE_Y, 0);    
    animator.start();
    }
  • 效果四:缩放X轴
    if (isOpen4) {    
    isOpen4 = false;    
    ObjectAnimator animator = ObjectAnimator.ofFloat(ll4, View.SCALE_X, 1);    
    animator.start();
    } else {    
    isOpen4 = true;    
    ObjectAnimator animator = ObjectAnimator.ofFloat(ll4, View.SCALE_X, 0);    
    animator.start();
    }
  • 效果五:同时缩放X轴和Y轴
    if (isOpen5) {    
    isOpen5 = false;    
    ObjectAnimator animator = ObjectAnimator.ofFloat(ll5, View.SCALE_X, 1);    
    ObjectAnimator animator1 = ObjectAnimator.ofFloat(ll5, View.SCALE_Y, 1);    
    AnimatorSet animatorSet = new AnimatorSet();    
    animatorSet.playTogether(animator, animator1);    
    animatorSet.start();
    } else {   
     isOpen5 = true;    
    ObjectAnimator animator = ObjectAnimator.ofFloat(ll5, View.SCALE_X, 0);    
    ObjectAnimator animator1 = ObjectAnimator.ofFloat(ll5, View.SCALE_Y, 0);    
    AnimatorSet animatorSet = new AnimatorSet();    
    animatorSet.playTogether(animator, animator1);    
    animatorSet.start();
    }


作者:自导自演的机器人
链接:http://www.jianshu.com/p/835fc313d1e1
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值