animation of android (1)

android把动画的模式分为:property animation,view animation,drawable animation.

view animation:给出动画的起止状态,并且通过一定的方式来是view动起来。这个动画只能用于view。

帧动画:是给出一组图片,有drawable来展示动画变化过程。

1.tweened animation

 layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".AnimationActivity" >

    <ImageView
        android:id="@+id/animation_img"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_centerInParent="true"
        android:src="@drawable/icon_follower" />

    <LinearLayout
        android:id="@+id/action_items"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn_alphaanimation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:text="@string/alpha_animation" />

        <Button
            android:id="@+id/btn_rotateanimation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:text="@string/rotate_animation" />

        <Button
            android:id="@+id/btn_scaleanimation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:text="@string/scale_animation" />
                <Button
            android:id="@+id/btn_translationanimation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:text="@string/scale_animation" />
    </LinearLayout>

</RelativeLayout>

activity:

package com.joyfulmath.animatatorsamples;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.BounceInterpolator;
import android.view.animation.LinearInterpolator;
import android.view.animation.OvershootInterpolator;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ImageView;

public class AnimationActivity extends Activity implements OnClickListener{

    private static final String TAG = "animatatorsamples";
    Button mAlphaAnimation = null;
    Button mRotateAnimation = null;
    Button mScaleAnimation = null;
    Button mTranslationAnimation = null;
    ImageView mImage = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_animation_main);
        mAlphaAnimation = (Button) this.findViewById(R.id.btn_alphaanimation);
        mAlphaAnimation.setOnClickListener(this);
        mRotateAnimation = (Button) this.findViewById(R.id.btn_rotateanimation);
        mRotateAnimation.setOnClickListener(this);
        
        mScaleAnimation = (Button) this.findViewById(R.id.btn_scaleanimation);
        mScaleAnimation.setOnClickListener(this);
        
        mTranslationAnimation = (Button) this.findViewById(R.id.btn_translationanimation);
        mTranslationAnimation.setOnClickListener(this);
        
        mImage = (ImageView) this.findViewById(R.id.animation_img);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.animation, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch(v.getId())
        {
        case R.id.btn_alphaanimation:
            startAlphaAnimation();
            break;
        case R.id.btn_rotateanimation:
            startRotateAnimation();
            break;
        case R.id.btn_scaleanimation:
            startScaleAnimation();
            break;
        case R.id.btn_translationanimation:
            startThanslationAnimation();    
            break;
        }
    }

    private void startRotateAnimation() {
        Log.i(TAG, "[startRotateAnimation]");
        //Animation.RELATIVE_TO_SELF the center of rotate
        Animation rotateaAni = new RotateAnimation(0f, 360f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
        rotateaAni.setDuration(3000);
        rotateaAni.setFillAfter(true);
        rotateaAni.setInterpolator(new LinearInterpolator());        
        mImage.startAnimation(rotateaAni);
        
    }

    private void startAlphaAnimation() {
        Log.i(TAG, "[startAlphaAnimation]");
        AlphaAnimation alphaAni = new AlphaAnimation(1.0f, 0.5f);
        alphaAni.setDuration(3000);
        alphaAni.setFillAfter(true);
        alphaAni.setInterpolator(new OvershootInterpolator());
        alphaAni.setAnimationListener(new AnimationListener() {
            
            @Override
            public void onAnimationStart(Animation arg0) {
                // TODO Auto-generated method stub
                Log.i(TAG, "[onAnimationStart]");
            }
            
            @Override
            public void onAnimationRepeat(Animation arg0) {
                // TODO Auto-generated method stub
                Log.i(TAG, "[onAnimationRepeat]");
            }
            
            @Override
            public void onAnimationEnd(Animation arg0) {
                // TODO Auto-generated method stub
                Log.i(TAG, "[onAnimationEnd]");
            }
        });
        
        mImage.startAnimation(alphaAni);
    }
    
    private void startScaleAnimation()
    {
        float fromX; //1.0f to 0.0f
        float toX; 
        float fromY; 
        float toY;
        int pivotXType; //where is the last place after scale
        float pivotXValue;
        int pivotYType; 
        float pivotYValue;    
        //Animation.ABSOLUTE,         //the last place with X ordinate with absolute diff 20f
        //Animation.RELATIVE_TO_SELF,   //specified dimension to self
        //Animation.RELATIVE_TO_PARENT.    //specified dimension to parent move 100%=1f with diff (%parent diff)
        ScaleAnimation scaleAnim = new ScaleAnimation(1.0f, 0.5f, 1.0f, 0.5f
//                ,Animation.ABSOLUTE, 20f, Animation.RELATIVE_TO_PARENT,
//                2f
                );
        //ScaleAnimation(float fromX, float toX, float fromY, float toY) 绫讳技Animation.ABSOLUTE,涓攛,y =0;
        scaleAnim.setDuration(3000);
        scaleAnim.setFillAfter(true);
        scaleAnim.setInterpolator(new OvershootInterpolator());
        mImage.startAnimation(scaleAnim);
        
    }
    
    private void startThanslationAnimation()
    {
        Log.i(TAG, "[startThanslationAnimation]");
        //Animation.ABSOLUTE where is the last point show place
        //the start x,y ordinate is the current place with translation 
        TranslateAnimation anmit= new TranslateAnimation(Animation.RELATIVE_TO_PARENT,0.1f,Animation.RELATIVE_TO_PARENT,0.5f,
                Animation.RELATIVE_TO_PARENT,0.2f,Animation.RELATIVE_TO_PARENT, 0.6f);
        anmit.setDuration(3000);
        anmit.setFillAfter(true);
        anmit.setInterpolator(new BounceInterpolator());
        mImage.startAnimation(anmit);    
    }
    
}

animation 是一种变换动画,也就是实际的响应位置和大小并没有变化,只是视图上的变换。

这种动画变换成本低,效率高。

这些类都继承自android.view.animation.Animation

 2.animationset

view视图动画组合只用是一个view对象的多种状态变换。

    /**
     * Constructor to use when building an AnimationSet from code
     * 
     * @param shareInterpolator Pass true if all of the animations in this set
     *        should use the interpolator associated with this AnimationSet.
     *        Pass false if each animation should use its own interpolator.
     */
    public AnimationSet(boolean shareInterpolator) {
        setFlag(PROPERTY_SHARE_INTERPOLATOR_MASK, shareInterpolator);
        init();
    }

如androidsdk源码所示,shareInterpolator将决定使用每个animation的interpolator

还是animationset的变换方式。

animationset的变换只能一起播放,只有通过startoffset的方式可以模拟变换的顺序。

3.android.view.animation.BaseInterpolator

变换方式:

末前支持的是:

AccelerateDecelerateInterpolator,  开始和结束变换慢,中间变换快速

AccelerateInterpolator,          开始缓慢,然后加速

AnticipateInterpolator,        变换会有一个回调,也就是先向后变换,然后按照给定关键帧的方式变换。   

AnticipateOvershootInterpolator,      An interpolator where the change starts backward then flings forward and overshoots the target value and finally goes back to the final value

BounceInterpolator,         贝叶斯曲线

CycleInterpolator,          sin曲线

DecelerateInterpolator,        减速变化

LinearInterpolator,          默认,线性变换

OvershootInterpolator,        An interpolator where the change flings forward and overshoots the last value then comes back.

PathInterpolator          5.1新功能。可以自定义变换路径方式。         

原文地址:https://www.cnblogs.com/deman/p/4357455.html