xml编写补间动画 PopupWindow实现出现退出的动画

alpha 渐变透明动画效果
scale 渐变尺寸伸缩动画效果
translate 画面转换位置移动动画效果
rotate 画面转移旋转动画效果

Animation是所有动画《scale、alpha、rotate、translate》的基类,这里已scale为例,讲解下Animation所有属性及意义

android:duration            动画持续时间,以毫秒为单位
android:fillAfter              如果设置为true,控件动画结束时,保持动画最后时的状态
android:fillBefore           如果设置为true,控件动画结束时,还原到动画开始前的状态
android:fillEnabled        与android:fillBefore 效果相同
android:repeatCount     重复次数 如果设置为infinite,则表示无限次重复动画
android:repeatMode     重复类型,有reverse和restart两个值,reverse表示倒叙回放,restart表示重新播放一遍,必须与android:repeatCount一起使用才有效果,因为这里的意义是重复类型,即回放的动作   
android:interpolator      插值器,指定动作的效果,比如弹跳,快速等

Scale动画

Scale是Android的尺寸缩放动画,继承自基类Animation

Scale的属性

直接参照代码中的注释(ps:方便说明,直接使用#作为注释符)

<?xml version="1.0" encoding="utf-8"?>  
<scale xmlns:android="http://schemas.android.com/apk/res/android"  
    android:fromXScale="0.0"           #起始x尺寸比例  
    android:toXScale="1.4"             #最终x尺寸比例
    android:fromYScale="0.0"           #起始y尺寸比例
    android:toYScale="1.4"             #最终y尺寸比例
    android:pivotX="50%"               #缩放起点x轴坐标,取值可以是数值(50)、百分数(50%)、百
                                        分数p(50%p),当取值为数值时,缩放起点为View左上角坐标
                                        加具体数值像素,当取值为百分数时,表示在当前View左上角坐
                                        加上View宽度的具体百分比,当取值为百分数p时,表示在View
                                        左上角坐标加上父控件宽度的具体百分比
    android:pivotY="50%"               #同上
    android:duration="700"             #动画持续时间,毫秒为单位
    android:fillAfter="true"           #动画结束后,保持结束时的状态
    android:fillBefore="true"          #动画结束后,恢复为初始状态
    android:fillEnabled="true"         #效果同上
    android:repeatCount="5"            #重复次数,取值为-1时无限重复,默认动画执行一次
    android:repeatMode ="reverse"      #重复模式,有reverse和restart两个值,前者为倒序回放,后者为重新开始
    android::interpolator="@android:anim/accelerate_decelerate_interpolator" #插值器   
    />

alpha 调节透明度

android:fromAlpha         动画开始的透明度,取值范围0.0-1.0,0.0表示完全透明,1.0表示完全不透明
android:toAlpha             动画结束的透明度,取值范围0.0-1.0

rotate 旋转

android:fromDegrees      开始旋转的角度位置,正值表示顺时针方向的度数,负值表示逆时针方向的度数
android:toDegrees          结束旋转的角度位置,正值表示顺时针方向的度数,负值表示逆时针方向的度数
android:pivotX                 旋转中心点X轴坐标,可以是数值,百分数,百分数p三种样式,比如50,50%,50%p;具体意义已经在scale标签中讲述,这里就不一 一作解释了
android:pivotY                旋转中心点Y轴坐标,意义同上

translate平移

android:fromXDelta            起始点X轴坐标,可以是数值,百分数,百分数p三种样式,比如50,50%,50%p;具体意义已经在scale标签中讲述,这里就不作解释了
android:fromYDelta            起始点Y轴坐标,意义同上
android:toXDelta                结束点X轴坐标
android:toYDelta                结束点Y轴坐标

set 定义动作合集

简单来说假如我想要的动画需要平移 旋转 透明度变化 缩放 那么在xml外层就需要使用set

注意:如果使用到Set标签

在Set标签中设置android:repeatCount是无效的,只能在子动画中重复次数才有效果。如果没有设置则默认为1次。如下图一
对于android:duration和android:repeatMode则优先使用Set标签中设置的属性,如果Set标签中没有设置就使用子控件中的(Set没有设置动画时长,子动画一定要设置时长)。如下图一二
android:fillAfter、android:fillBefore、android:fillEnabled属性只能在Set标签中设置,如果没有设置则使用默认的android:fillBefore="true",在子动画中设置是无效的。如下图三

案例 从右到左缩放透明度变化的动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
   <scale
       android:interpolator="@android:anim/decelerate_interpolator"
       android:duration="250"
       android:fromXScale="0.6"
       android:fromYScale="0.6"
       android:toXScale="1.0"
       android:toYScale="1.0"
       android:pivotX="100%"
       android:pivotY="50%"/>
   <alpha
       android:interpolator="@android:anim/decelerate_interpolator"
       android:duration="250"
       android:fromAlpha="0.0"
       android:toAlpha="1.0" />

</set>

在外部获取动画并设置给view

Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_set);
mTextView.startAnimation(animation);

PopupWindow实现出现退出的动画

如上述动画xml编写后 需要在styles.xml中编写如下内容

<style name="anim_dislike_btn">
        <item name="android:windowEnterAnimation">@anim/move_from_right_to_left</item>
        <item name="android:windowExitAnimation">@anim/move_from_left_to_right</item>
    </style>

android:windowEnterAnimation :弹窗展示动画
android:windowExitAnimation:弹窗退出动画

				View popView = LayoutInflater.from(itemView.getContext()).inflate(R.layout.item_dislike_btn, null); //布局加载器加载菜单布局
                PopupWindow popup = new PopupWindow(popView, 300, 80); // 声明 设置宽高
                // 设置成点击弹窗以外位置让弹窗隐藏
                popup.setOutsideTouchable(true);
                popup.setFocusable(true);
                // 设置弹窗动画 
                // 注意: 必须在showAsDropDown方法前设置动画 否则不生效
                popup.setAnimationStyle(R.style.anim_dislike_btn);
                // 设置弹窗弹出 并设置位置
                popup.showAsDropDown(moreButton, -230, -65, Gravity.CENTER);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用以下代码实现PopupWindow的进入动画退出动画: ```java // 设置PopupWindow进入动画 popupWindow.setAnimationStyle(R.style.PopupWindowEnterAnimation); // 设置PopupWindow退出动画 popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { popupWindow.setAnimationStyle(R.style.PopupWindowExitAnimation); } }); ``` 接着,在styles.xml文件中定义进入动画退出动画的样式: ```xml <style name="PopupWindowEnterAnimation"> <item name="android:windowEnterAnimation">@anim/slide_in_from_bottom</item> </style> <style name="PopupWindowExitAnimation"> <item name="android:windowExitAnimation">@anim/slide_out_to_bottom</item> </style> ``` 其中,@anim/slide_in_from_bottom和@anim/slide_out_to_bottom是自定义的进入和退出动画资源文件。你可以根据自己的需求进行定义。 slide_in_from_bottom.xml: ```xml <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="@android:integer/config_mediumAnimTime"/> <alpha android:fromAlpha="0" android:toAlpha="1" android:duration="@android:integer/config_mediumAnimTime"/> </set> ``` slide_out_to_bottom.xml: ```xml <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="0" android:toYDelta="100%p" android:duration="@android:integer/config_mediumAnimTime"/> <alpha android:fromAlpha="1" android:toAlpha="0" android:duration="@android:integer/config_mediumAnimTime"/> </set> ``` 这里的动画效果是从底部滑入和滑出,你可以根据需要进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值