Android---动画机制(一)---View动画和帧动画

本文探讨Android中人机交互的关键部分——动画效果,重点分析View动画(包括TranslateAnimation, ScaleAnimation, RotateAnimation, AlphaAnimation)及其在ListView等场景的应用,还介绍了帧动画的实现方式以及Activity和Fragment的切换动画设定。" 78760023,400039,使用Linq时如何监控内部生成的Sql语句,"['数据库', 'Linq', 'C#编程', '数据查询', '日志']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android中的动画效果一直是人机交互中的一个非常重要的一个部分.接下来就让我研究研究Android中动画的特性分析等
动画的分类

  1. View动画 也是我们常说的补间动画
  2. Frame动画 也是我们常说的帧动画
  3. 属性动画

View动画的分析:

在View动画的探索过程中我们主要用到了Animation原生的框架,实现原理 是每次绘制视图时View所在的ViewGroup种的drawChild函数获取该View的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix()),通过矩阵运算完成动画帧.如果没有动画完成就继续调用invalidate()函数,启动下次绘制来驱动动画.

View动画的作用对象是View,它支持4种动画效果

  • 平移动画----TranslateAnimation
  • 缩放动画----ScaleAnimation
  • 旋转动画----RotateAnimation
  • 透明度动画----AlphaAnimation

四种动画效果既可以通过XML来定义又可以通过代码来动态创建.

以下是View动画Java代码编写

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void btnAlpha(View view) {
        //参数为透明度的呈现百分比
        AlphaAnimation aa = new AlphaAnimation(0, 1);
        aa.setDuration(2000);
        view.startAnimation(aa);
    }

    public void btnRotate(View view) {
        //以View的100,100坐标旋转360度
        RotateAnimation ra = new RotateAnimation(0, 360, 100, 100);
        ra.setDuration(1000);
        view.startAnimation(ra);
    }

    public void btnRotateSelf(View view) {
        //以自身的中点旋转360度
        RotateAnimation ra = new RotateAnimation(0, 360,
                RotateAnimation.RELATIVE_TO_SELF, 0.5F,
                RotateAnimation.RELATIVE_TO_SELF, 0.5F);
        ra.setDuration(1000);
        view.startAnimation(ra);
    }

    public void btnTranslate(View view) {
        //以View自身坐标的(0,0)点开始移,移动到(200,300)坐标
        TranslateAnimation ta = new TranslateAnimation(0, 200,0, 300);
        ta.setDuration(1000);
        view.startAnimation(ta);
    }

    public void btnScale(View view) {
        //以View自身坐标的(0,0)点开始缩放,缩放到X的3倍大小Y的2倍大小
        ScaleAnimation sa = new ScaleAnimation(0, 3, 0, 2);
        sa.setDuration(1000);
        view.startAnimation(sa);
    }

    public void btnScaleSelf(View view) {
        //以View自身中间点开始缩放,缩放到正常大小
        ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1,
                Animation.RELATIVE_TO_SELF, 0.5F,
                Animation.RELATIVE_TO_SELF, 0.5F);
        sa.setDuration(1000);
        view.startAnimation(sa);
    }

    public void btnSet(View view) {
        //创建一个动画集合
        AnimationSet as = new AnimationSet(true);
        as.setDuration(1000);
        //创建一个透明度动画
        AlphaAnimation aa = new AlphaAnimation(0, 1);
        aa.setDuration(1000);
        //创建一个位移动画
        TranslateAnimation ta = new TranslateAnimation(0, 100, 0, 200);
        ta.setDuration(1000);
        //将透明动画和位移动画填入到动画集合中
        as.addAnimation(aa);
        as.addAnimation(ta);

        view.startAnimation(as);
    }
}

对View动画Android提供了监听的回调可以添加相应的监听方法:

as.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        
    }

    @Override
    public void onAnimationEnd(Animation animation) {

    }

    @Override
    public void onAnimationRepeat(Animation animation) {

    }
});

以下是View动画XML代码编写

<!--set标签表示动画集合 对应AnimaationSet类-->
<!--interpolator
    表示动画集合所采用的差值器,差值器可以影响动画的速度
    比如说非匀速动画就需要通过差值器来控制动画的播放过程
    默认为@android:anim/accelerate_interpolator" 加速差值器-->
<!--shareInterpolator
    表示集合中的动画是否和集合共享同一个值
    如果不指定差值器那么子动画需要单独制定所需要的差值器或者使用默认值-->
<!--fillAfter表示动画结束以后View是否停留在结束的位置-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:shareInterpolator="true"
    android:fillAfter="true"
    >
    <!--平移动画,对应TranslateAnimation类-->
    <translate
        android:fromXDelta="0"   #起始x尺寸比例 
        android:toXDelta="300"   #最终x尺寸比例
        android:fromYDelta="0"   #起始y尺寸比例
        android:toYDelta="300"/>  #最终y尺寸比例
    <!--缩放动画对应ScaleAnimation类-->
    <!--从X的0.5倍开始缩放到1.3倍
        从Y的1.2倍开始缩放到2.3倍-->
    <!--pivotX 缩放轴点的坐标,会影响缩放的效果,当前是从右下往左上缩放-->
    <scale
        android:fromXScale="1"
        android:toXScale="2"
        android:fromYScale="1"
        android:toYScale="2"
        android:pivotX="500"
        android:pivotY="500"
        />
    <!--透明度动画对应AlphaAnimation类-->
    <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0"
        />
    <!--旋转动画对应RotateAnimation类-->
    <!--degree表示旋转的角度-->
    <!--pivot表示旋转的轴点-->
    <rotate
        android:fromDegrees="0"
        android:toDegrees="300"
        android:pivotX="300"
        android:pivotY="300"
        />
</set>

 android:pivotY="50%"               #同上
    android:duration="700"             #动画持续时间,毫秒为单位
    android:fillAfter="true"           #动画结束后,保持结束时的状态
    android:fillBefore="true"          #动画结束后,恢复为初始状态
    android:fillEnabled="true"         #效果同上
    android:repeatCount="5"            #重复次数,取值为-1时无限重复,默认动画执行一次
    android:repeatMode ="reverse"      #重复模式,有reverse和restart两个值,前者为倒序回放,后者为重新开始

最后在通过JAVA代码载入对应动画

    public void btn(View view) {
        Animation animation= AnimationUtils.loadAnimation(this,R.anim.zc);
        //animation.setDuration(1000); Java代码优先级高于XML代码
        view.startAnimation(animation);

帧动画

帧动画就是顺序播放一组预先定义好的图片,类似于电影的播放.
系统提供了另外一个类AnimationDrawable来使用帧动画.
建立XML标签animation-list的时候要在drawable文件夹下建立,不要在anim文件夹下建立,不然会报错

<?xml version="1.0" encoding="utf-8"?>
    <!--oneshot表示是否停留在最后一帧
	    true表示停留在最后一帧
	    false表示循环播放-->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/dog1" android:duration="5000"/>
    <item android:drawable="@drawable/dog2" android:duration="5000"/>
    <item android:drawable="@drawable/dog3" android:duration="5000"/>
</animation-list>
 imageView= (ImageView) findViewById(R.id.image);
        AnimationDrawable animationDrawable= (AnimationDrawable) imageView.getBackground();
        animationDrawable.start();

View动画的特殊使用场景

LayoutAnimation
LayoutAnimation它作用于ViewGroup,当他的子元素出场的时候会具有这种动画效果,这种效果常常用在ListView上,步骤如下:

1.首先定义LayoutAnimation:

<?xml version="1.0" encoding="utf-8"?>
<!--delay:
            子元素动画的时间延迟 目前是二倍的延迟-->
<!--animationOrder
            子元素动画的顺序,有三种选项
            normal:顺序显示
            reverse逆向显示
            random随机显示-->
<!--animation
            为子元素置顶具体的入场动画-->
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:delay="2"
    android:animationOrder="normal"
    android:animation="@anim/anim_item">
</layoutAnimation>

2.定义一个指定动画:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:shareInterpolator="true" >
    <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
    <translate
        android:fromXDelta="500"
        android:toXDelta="0" />
</set>

3.为ViewGroup制定android:layoutAnimation属性android:layoutAnimation="@anim/layoutanimation"
.例如ListView:

   <ListView
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layoutAnimation="@anim/layoutanimation"
       android:id="@+id/list"></ListView>

除了XML代码,JAVA代码中也可以实现:

        Animation animation= AnimationUtils.loadAnimation(this,R.anim.anim_item);
        LayoutAnimationController controller=new LayoutAnimationController(animation);
        controller.setDelay(2f);
        controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
        mListView.setLayoutAnimation(controller);

具体含义同XML这里就不在解释了.

这里写图片描述
Acitivity的切换效果

Acitivity有默认的切换效果,并且我们可以自定义的.
启动时候的启动效果:

 Intent intent=new Intent(MainActivity.this,LoginActivity.class);
	startActivity(intent);
	// enter_anim被打开时所需资源的ID
	// enter_exit被暂停时所需资源的ID
    overridePendingTransition(R.anim.enter_anim,R.anim.anim_item);

关闭时候得效果

    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.anim_item,R.anim.exit_anim);
    }

注意
使用overridePendingTransition方法必须位于startActivity之后或者finish后面,不然不起作用.

Fragment也可以添加动画
可以通过FragmentTransaction中的setCustomAnimations()方法来添加切换动画.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值