Android Property Animator (属性动画)第二篇

Android Property Animator (属性动画)第一篇了解到了Property Animator实现动画的基本流程。这篇主要讲解布局动画以及做出简单的动画效果。

1、如何使用xml文件来创建属性动画

大家都知道,View Animator 、Drawable Animator都可以在res/anim文件夹下创建动画。那么 Property Animator 也可以在文件中申明:
首先在res文件夹创建animator文件夹,然后在animator文件夹下创建自己xml文件。如res/animator/scale_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:propertyName="rotationX"
    android:valueFrom="0.0"
    android:valueTo="360.0"
    android:valueType="floatType"></objectAnimator>

我们只需要在Activity中这么调用:

    public void bntXml(View v) {
        Animator animator = AnimatorInflater.loadAnimator(this, R.animator.scale_anim);
        animator.setTarget(ivFace);
        animator.start();
    }

那么你肯定会想呢,只支持单纯单一的动画吗?如果我需要多动画呢?

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together">

    <objectAnimator
        android:duration="2000"
        android:propertyName="rotationX"
        android:valueFrom="0.0"
        android:valueTo="360.0"
        android:valueType="floatType"></objectAnimator>

    <objectAnimator
        android:duration="2000"
        android:propertyName="scaleX"
        android:valueFrom="1.0"
        android:valueTo="2.0"
        android:valueType="floatType"></objectAnimator>

    <objectAnimator
        android:duration="2000"
        android:propertyName="scaleY"
        android:valueFrom="1.0"
        android:valueTo="2.0"
        android:valueType="floatType"></objectAnimator>

</set>

使用set标签,android:ordering属性值为together表示一起运动,值还可以为sequentially表示按着先后顺序运动。

我们来看看效果图:

property

Layout Animations(布局动画)

主要是通过使用LayoutAnimation为布局的容器设置动画,当容器中的视图层次发生变化时存在过渡的动画效果。

使用之前,我们要来了解下LayoutAnimation有哪些类型:

LayoutTransition.APPEARING :一个View在ViewGroup中出现,该View的动画

LayoutTransition.CHANGE_APPEARING :一个View在ViewGroup中出现,该View对该ViewGroup中其他View位置造成影响,其他View的动画

LayoutTransition.DISAPPEARING :一个View在ViewGroup中消失,该View的动画

LayoutTransition.CHANGE_DISAPPEARING :一个View在ViewGroup中消失,该View对该ViewGroup中其他View位置造成影响,其他View的动画

这里重点区分加粗字体的含义,我们还是通过一个例子具体来看一下:
布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/bntXml"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="bntXml"
        android:text="xml动画"
        android:textColor="#ffffff" />

    <Button
        android:id="@+id/bntAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/bntXml"
        android:onClick="bntAdd"
        android:text="addBtn动画"
        android:textColor="#ffffff" />

    <GridLayout
        android:id="@+id/gridLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/bntXml"
        android:columnCount="5"></GridLayout>

    <ImageView
        android:id="@+id/ivFace"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@mipmap/face" />

</RelativeLayout>

Activity代码:

package com.github.ws.animationdemo;

import android.animation.Animator;
import android.animation.AnimatorInflater;
import android.animation.LayoutTransition;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.GridLayout;
import android.widget.ImageView;

/**
 * Created by Administrator on 4/6 0006.
 */
public class XmlAnimatorActivity extends Activity {

    private ImageView ivFace;
    private GridLayout gridLayout;
    private LayoutTransition transition;
    private int count = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.xml_anim);
        ivFace = (ImageView) findViewById(R.id.ivFace);
        gridLayout = (GridLayout) findViewById(R.id.gridLayout);

        transition = new LayoutTransition();
        transition.setAnimator(LayoutTransition.APPEARING, ObjectAnimator.ofFloat(gridLayout, "scaleX", 0.0f, 1.0f));
        transition.setDuration(1000);
        gridLayout.setLayoutTransition(transition);
    }

    void bntAdd(View view) {
        Button btn = new Button(this);
        btn.setText(""+count++);
        gridLayout.addView(btn,Math.min(1, gridLayout.getChildCount()));
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                gridLayout.removeView(view);
            }
        });
    }

    public void bntXml(View v) {
        Animator animator = AnimatorInflater.loadAnimator(this, R.animator.more_anim);
        animator.setTarget(ivFace);
        animator.start();
    }
}

效果图:

property

属性动画是不是很很容易实现,你也动手试试吧,效果肯定很棒。属性动画第二篇和第一篇都是一些基础知识,你如果感兴趣做出一些比较拉风,绚丽的动画,我们可以一起研究。

有什么疑问,什么地方写得不当的地方,还请多多指出。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值