zoukankan      html  css  js  c++  java
  • 29、Android基本动画

    基本动画

    帧动画

    帧动画(Frame-by-frame Animations)从字面上理解就是一帧挨着一帧的播放图片,就像放电影一样。和补间动画一样可以通过xml实现也可以通过java代码实现。

    a) 首先需要在res目录下创建drawable目录,再新建xml文件并指定播放形式和资源引用。

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
                    android:oneshot="false"><!--oneshot为true表示播放一次,false是重复播放 -->
        <!--duration:画面的播放时间,单位是毫秒 -->
        <item android:drawable="@mipmap/image_1" android:duration="200" />
        <item android:drawable="@mipmap/image_2" android:duration="200" />
        <item android:drawable="@mipmap/image_3" android:duration="200" />
        <item android:drawable="@mipmap/image_4" android:duration="200" />
        <item android:drawable="@mipmap/image_5" android:duration="200" />
        <item android:drawable="@mipmap/image_6" android:duration="200" />
    </animation-list>
    

    b) 在布局中创建ImageView,然后写上如下代码

    public class MainActivity extends AppCompatActivity {
        private AnimationDrawable mDrawable;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ImageView imageView = (ImageView) findViewById(R.id.iv_image);
            imageView.setBackgroundResource(R.drawable.frame_animation);
            mDrawable = (AnimationDrawable) imageView.getBackground();
        }
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                mDrawable.start();
                return true;
            }
            return super.onTouchEvent(event);
        }
    }
    

    补间动画

    渐变动画

    渐变动画是用来修改图片的透明度等操作,基本语法如下:

    XML节点 功能说明
    alpha 渐变透明度动画效果
    fromalpha 属性为动画起始时透明度 0.0表示完全透明 1.0表示完全不透明 以上取值0.0-1.0之间的float数据类型的数字
    toAlpha 属性为动画结束时透明度

    使用代码实现渐变动画:

    AlphaAnimation aa = new AlphaAnimation(0.0f, 1.0f);
    // 设置播放时间
    aa.setDuration(2 * 1000);
    // 设置重复次数
    aa.setRepeatCount(2);
    // 设置倒叙播放
    aa.setRepeatMode(Animation.REVERSE);
    imageView.setAnimation(aa);
    

    XML资源实现渐变动画:

    <alpha
        android:fromAlpha=“0.1”
        android:toAlpha=“1.0”
        android:duration=“3000”/> 
    

    缩放动画

    缩放动画是用来修改图片的大小等操作,基本语法如下:

    XML节点 功能说明
    Scale 渐变尺寸伸缩动画效果
    fromXScale[float] fromYScale[float] 为动画起始时,X、Y坐标上的缩伸尺寸 0.0表示收缩到没有,1.0表示正常无伸缩 值小于1.0表示收缩,值大于1.0表示放大
    toXScale[float toYScale[float]] 为动画结束时,X、Y坐标上的伸缩尺寸
    pivotX[float] pivotY[float] 为动画相对于物体的X、Y坐标的开始位置 属性值说明:从0%~100%中取值,50%位物体的X或Y方向坐标上的中点位置。

    使用代码实现缩放动画:

    ScaleAnimation sa = new ScaleAnimation(0.1f, 2.0f, 0.1f, 2.0f,
            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    // 设置播放的时间
    sa.setDuration(2 * 1000);
    // 设置播放次数
    sa.setRepeatCount(2);
    // 设置倒叙播放
    sa.setRepeatMode(Animation.REVERSE);
    imageView.startAnimation(sa);
    

    XML资源实现缩放动画:

    <scale
        android:interpolator= “@android:anim/accelerate_decelerate_interpolator”
        android:fromXScale=”0.0″
        android:toXScale=”1.4″
        android:fromYScale=”0.0″
        android:toYScale=”1.4″
        android:pivotX=”50%”
        android:pivotY=”50%”
        android:fillAfter=”false”
        android:startOffset=“700”
        android:duration=”700″
        android:repeatCount=”10″/>
    

    位移动画

    位移动画是用来修改图片的位置等操作,基本语法如下:

    XML节点 功能说明
    Transtate 画面转换位置移动动画效果
    fromXDeita toXDeita 为动画、结束起始时X坐标上的位置
    fromYDeita toYDeita 为动画、结束起始时Y坐标上的位置

    使用代码实现位移动画:

    TranslateAnimation ta = new TranslateAnimation(
            Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 3.0f,
            Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 3.0f);
    // 设置播放时间
    ta.setDuration(2 * 1000);
    // 设置播放次数
    ta.setRepeatCount(2);
    // 设置倒叙播放
    ta.setRepeatMode(Animation.REVERSE);
    imageView.startAnimation(ta);
    

    XML资源实现位移动画:

    <translate
         android:fromXDelta=”30″
         android:toXDelta=”-80″
         android:fromYDelta=”30″
         android:toYDelta=”300″
         android:duration=”2000″ />
    

    旋转动画

    旋转动画是用来修改图片的角度等操作,基本语法如下:

    XML节点 功能说明
    Rotate 画面转移旋转动画效果
    fromDegrees 为动画起始时物体的角度 当角度为负数---表示逆时针旋转 当角度为整数---表示顺时针旋转 (负数from---to整数:顺时针旋转) (负数from---to负数:逆时针旋转) (正数from---to正数:顺时针旋转) (正数from---to负数:逆时针旋转)
    toDegrees 动画结束时物体旋转的角度可以大于360度
    pivotX pivotY 为动画相对于物体的X、Y坐标的开始位 说明:以上两个属性值从0%~100%中取值 50%位物体的X或Y方向坐标上中点位置

    使用代码实现旋转动画:

    RotateAnimation ra = new RotateAnimation(0, 360,
            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    // 设置播放时间
    ra.setDuration(2 * 1000);
    // 设置播放次数
    ra.setRepeatCount(2);
    // 设置的倒叙播放
    ra.setRepeatMode(Animation.REVERSE);
    imageView.startAnimation(ra);
    

    XML资源实现旋转动画:

    <rotate
        android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
        android:fromDegrees=”0″
        android:toDegrees=”+350″
        android:pivotX=”50%”
        android:pivotY=”50%”
        android:duration=”3000″ />
    

    动画集合

    动画集是将上述动画进行合并到一起,具体请参看代码:

    AnimationSet set = new AnimationSet(false);
    .
    // 动画实现省略
    .
    // 将所有动画添加到动画集
    set.addAnimation(aa);
    set.addAnimation(sa);
    set.addAnimation(ta);
    set.addAnimation(ra);
    imageView.startAnimation(set);
    

    对于动画事件,Android也提供了对应的监听回调,要添加相应的监听方法,代码如下所示:

    animation.setAnimationListener(new AnimationListener() {
        /**动画开始时回调*/
        @Override
        public void onAnimationStart(Animation animation) {
            
        }
        /**动画重播时回调*/
        @Override
        public void onAnimationRepeat(Animation animation) {
            
        }
        /**动画结束时回调*/
        @Override
        public void onAnimationEnd(Animation animation) {
            
        }
    });  
    

    实现Activity进出动画

    slide_in_left.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false"
        android:zAdjustment="top">
        <translate
            android:duration="300"
            android:fromXDelta="-100.0%p"
            android:toXDelta="0.0" />
    </set>
    

    slide_in_right.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false"
        android:zAdjustment="top">
        <translate
            android:duration="300"
            android:fromXDelta="100.0%p"
            android:toXDelta="0.0" />
    </set>
    

    slide_out_left.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false"
        android:zAdjustment="top">
        <translate
            android:duration="300"
            android:fromXDelta="0.0"
            android:toXDelta="-100.0%p" />
    </set>
    

    slide_out_right.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false"
        android:zAdjustment="top">
        <translate
            android:duration="300"
            android:fromXDelta="0.0"
            android:toXDelta="100.0%p" />
    </set>
    

    在style.xml中AppTheme里配置Activity的动画

     <!--Activity进场。出场动画-->
    <style name="AnimationActivity" parent="@android:style/Animation.Activity">
        <!--用于设置打开新的Activity并进入新的Activity展示的动画-->
        <item name="android:activityOpenEnterAnimation">@anim/slide_in_left</item>
        <!--用于设置打开新的Activity并销毁之前的Activity展示的动画-->
        <item name="android:activityOpenExitAnimation">@anim/slide_out_right</item>
        <!--用于设置关闭当前Activity进入上一个Activity展示的动画-->
        <item name="android:activityCloseEnterAnimation">@anim/slide_in_right</item>
        <!--用于设置关闭当前Activity时展示的动画-->
        <item name="android:activityCloseExitAnimation">@anim/slide_out_left</item>
    </style>
    

    还可以在Activity的startActivity和finish方法中进行设置:

    @Override
    public void startActivity(Intent intent) {
        super.startActivity(intent);
        overridePendingTransition(R.anim.slide_in_left,R.anim.slide_out_right);
    
    }
    
    @Override
    public void finish() {
        super.finish();
        overridePendingTransition( R.anim.slide_in_right,R.anim.slide_out_left);
    }
    

    布局动画

    所谓布局动画是指作用在ViewGroup上,给VewGroup增加View时添加动画过渡效果。最简单的布局动画是在ViewGroup的XML中,使用以下代码来打开布局动画:

    android:animateLayoutChanges="true"  
    

    设置该属性后,当ViewGroup添加View时,子View会呈现逐渐显示的过渡效果,这个效果是Android默认的,且无法使用自定义的动画进行替换。如果想自定义子View

    的过渡效果,可以使用LayoutAnimationController类来完成相关操作。

    LinearLayout ll = (LinearLayout) findViewById(R.id.ll_root);
    // 设置过渡动画
    ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1);
    sa.setDuration(2000);
    // 设置布局动画的显示属性
    LayoutAnimationController lac = new LayoutAnimationController(sa, 0.5F);
    lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
    // 为ViewGroup设置布局动画
    ll.setLayoutAnimation(lac);  
    

    LayoutAnimationController的第一个参数是需要作用的动画,dirge参数是每个子View显示delay时间。

    当delay时间不为0时,可以设置子View显示的顺序:

    LayoutAnimationController.ORDER_NORMAL    -- 顺序
    LayoutAnimationController.ORDER_RANDOM    -- 随机
    LayoutAnimationController.ORDER_REVERSE   -- 反序
    
  • 相关阅读:
    Python环境的安装
    tar.xz如何解压:linux和windows下tar.xz解压命令介绍
    设置SVN忽略文件和目录(文件夹)
    C#【Thread】Interlocked 轻量级锁
    手把手教你做个AR涂涂乐
    理解UV贴图
    unity animation readonly 无法加事件?
    LUA Metatables
    增强现实阴影
    unity shader tags
  • 原文地址:https://www.cnblogs.com/pengjingya/p/14952681.html
Copyright © 2011-2022 走看看