安卓开发20:动画之Animation 详细使用-主要通过java代码实现动画效果

来源:互联网 发布:mac有steam吗 编辑:程序博客网 时间:2024/06/09 16:44

AlphaAnimation 透明效果实现:

activity_main.xml中仅仅是一个简单的图片,下面的例子都会使用这个xml:

<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=".MainActivity" >    <!-- 用于动画的图片 -->    <ImageView        android:id="@+id/imageView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_alignParentTop="true"        android:layout_marginLeft="70dp"        android:layout_marginTop="138dp"        android:src="@drawable/jhs_button1_h" /></RelativeLayout>

透明效果的java代码:

package com.example.test.com;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.DecelerateInterpolator;import android.widget.ImageView;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        ImageView imageView = (ImageView) findViewById(R.id.imageView1);        //图片点击的时候,启动动画效果          imageView.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                Animation anim = getAlphaAnimation();                v.startAnimation(anim);            }        });    }    /**     * 透明效果     * @return     */    public Animation getAlphaAnimation() {        //实例化 AlphaAnimation 主要是改变透明度        //透明度 从 1-不透明 0-完全透明         Animation animation = new AlphaAnimation(1.0f, 0.5f);        //设置动画插值器 被用来修饰动画效果,定义动画的变化率         animation.setInterpolator(new DecelerateInterpolator());        //设置动画执行时间        animation.setDuration(1000);        return animation;    }}

ScaleAnimation 缩放效果实现:

package com.example.test.com;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.DecelerateInterpolator;import android.view.animation.ScaleAnimation;import android.widget.ImageView;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        ImageView imageView = (ImageView) findViewById(R.id.imageView1);        //图片点击的时候,启动动画效果          imageView.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                Animation scalegetAnim = getScaleAnimation();                v.startAnimation(scalegetAnim);            }        });    }        /**     * 缩放动画     * @return     */    public Animation getScaleAnimation() {        //实例化 ScaleAnimation 主要是缩放效果        //参数:fromX-动画开始前,x坐标   toX-动画结束后x坐标        //fromY-动画开始前,Y坐标  toY-动画结束后Y坐标        //pivotXType - 为动画相对于物件的X坐标的参照物   pivotXValue - 值        //pivotYType - 为动画相对于物件的Y坐标的参照物   pivotYValue - 值        Animation animation = new ScaleAnimation(1.0f, 0.0f, 1.0f, 0.0f,                 Animation.RELATIVE_TO_SELF, 0.5f,                Animation.RELATIVE_TO_SELF, 0.5f);        //设置动画插值器 被用来修饰动画效果,定义动画的变化率         animation.setInterpolator(new DecelerateInterpolator());        //设置动画执行时间        animation.setDuration(1000);        return animation;    }}

RotateAnimation 旋转效果实现:

package com.example.test.com;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.DecelerateInterpolator;import android.view.animation.RotateAnimation;import android.view.animation.ScaleAnimation;import android.widget.ImageView;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        ImageView imageView = (ImageView) findViewById(R.id.imageView1);        //图片点击的时候,启动动画效果          imageView.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                Animation rotateAnim = getRotateAnimation();                v.startAnimation(rotateAnim);            }        });    }        /**     * 旋转     * @return     */    public Animation getRotateAnimation() {        //实例化RotateAnimation        //以自身中心为圆心,旋转360度 正值为顺时针旋转,负值为逆时针旋转        RotateAnimation animation = new RotateAnimation(0, 360,                                         Animation.RELATIVE_TO_SELF, 0.5f,                                        Animation.RELATIVE_TO_SELF, 0.5f);          //设置动画插值器 被用来修饰动画效果,定义动画的变化率         animation.setInterpolator(new DecelerateInterpolator());        //设置动画执行时间        animation.setDuration(1000);        return animation;    }}

TranslateAnimation 移动效果实现:

package com.example.test.com;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.DecelerateInterpolator;import android.view.animation.RotateAnimation;import android.view.animation.ScaleAnimation;import android.view.animation.TranslateAnimation;import android.widget.ImageView;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        ImageView imageView = (ImageView) findViewById(R.id.imageView1);        //图片点击的时候,启动动画效果          imageView.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                Animation translateAnim = getTranslateAnimation();                v.startAnimation(translateAnim);            }        });    }        /**     * 移动     * @return     */    public Animation getTranslateAnimation() {        //实例化TranslateAnimation        //以自身为坐标系和长度单位,从(0,0)移动到(1,1)        TranslateAnimation animation = new                 TranslateAnimation(                        Animation.RELATIVE_TO_SELF, 0.0f,                         Animation.RELATIVE_TO_SELF, 1.0f,                         Animation.RELATIVE_TO_SELF, 0.0f,                         Animation.RELATIVE_TO_SELF, 1.0f);          //设置动画插值器 被用来修饰动画效果,定义动画的变化率         animation.setInterpolator(new DecelerateInterpolator());        //设置动画执行时间        animation.setDuration(1000);        return animation;    }}

AnimationSet 动画集合实现和使用:

package com.example.test.com;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.DecelerateInterpolator;import android.view.animation.RotateAnimation;import android.view.animation.ScaleAnimation;import android.view.animation.TranslateAnimation;import android.widget.ImageView;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        ImageView imageView = (ImageView) findViewById(R.id.imageView1);        //图片点击的时候,启动动画效果          imageView.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                //AnimationSet类是一个Animation集合,里面可以许多Animation,                //且在AnimationSet中设置的属性适用于里面的所有Animation。                //参数true 则共享@Interpolator                AnimationSet set = new AnimationSet(true);                //透明                Animation alphaAnim = getAlphaAnimation();                set.addAnimation(alphaAnim);                //缩放                Animation scalegetAnim = getScaleAnimation();                set.addAnimation(scalegetAnim);                //旋转                Animation rotateAnim = getRotateAnimation();                set.addAnimation(rotateAnim);                //移动 上面三个动画是同时进行的,我现在需要让移动这个动画在上面的动画之后执行                //需要使用setStartOffset 设置动画开始的时间                Animation translateAnim = getTranslateAnimation();                translateAnim.setStartOffset(500);                set.addAnimation(translateAnim);                v.startAnimation(set);            }        });    }    /**     * 透明效果     * @return     */    public Animation getAlphaAnimation() {        //实例化 AlphaAnimation 主要是改变透明度        //透明度 从 1-不透明 0-完全透明         Animation animation = new AlphaAnimation(1.0f, 0.8f);        //设置动画插值器 被用来修饰动画效果,定义动画的变化率         animation.setInterpolator(new DecelerateInterpolator());        //设置动画执行时间        animation.setDuration(1000);        return animation;    }    /**     * 缩放动画     * @return     */    public Animation getScaleAnimation() {        //实例化 ScaleAnimation 主要是缩放效果        //参数:fromX-动画开始前,x坐标   toX-动画结束后x坐标        //fromY-动画开始前,Y坐标  toY-动画结束后Y坐标        //pivotXType - 为动画相对于物件的X坐标的参照物   pivotXValue - 值        //pivotYType - 为动画相对于物件的Y坐标的参照物   pivotYValue - 值        Animation animation = new ScaleAnimation(1.0f, 0.0f, 1.0f, 0.0f,                Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,                0.5f);        //设置动画插值器 被用来修饰动画效果,定义动画的变化率         animation.setInterpolator(new DecelerateInterpolator());        //设置动画执行时间        animation.setDuration(1000);        return animation;    }    /**     * 旋转     * @return     */    public Animation getRotateAnimation() {        //实例化RotateAnimation        //以自身中心为圆心,旋转360度  正值为顺时针旋转,负值为逆时针旋转        RotateAnimation animation = new RotateAnimation(0, 360,                Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,                0.5f);        //设置动画插值器 被用来修饰动画效果,定义动画的变化率         animation.setInterpolator(new DecelerateInterpolator());        //设置动画执行时间        animation.setDuration(1000);        return animation;    }    /**     * 移动     * @return     */    public Animation getTranslateAnimation() {        //实例化TranslateAnimation        //以自身为坐标系和长度单位,从(0,0)移动到(1,1)        TranslateAnimation animation = new TranslateAnimation(                Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,                1.0f, Animation.RELATIVE_TO_SELF, 0.0f,                Animation.RELATIVE_TO_SELF, 1.0f);        //设置动画插值器 被用来修饰动画效果,定义动画的变化率         animation.setInterpolator(new DecelerateInterpolator());        //设置动画执行时间        animation.setDuration(1000);        return animation;    }}

Interpolator 描述动画的速率:

安卓默认的Interpolator:

AccelerateInterpolator:动画开始时比较慢,然后逐渐加速。

DecelerateInterpolator:动画开始时比较快,然后逐渐减速。

AccelerateDecelerateInterpolator:动画开始时和结束时比较慢,中间过程加速。

LinearInterpolator:动画匀速进行。

CycleInterpolator:动画循环播放指定次数,速率沿着正弦曲线改变。

DecelerateInterpolator代码:主要实现getInterpolation ,也可以自定义

/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package android.view.animation;import android.content.Context;import android.content.res.TypedArray;import android.util.AttributeSet;/** * An interpolator where the rate of change starts out quickly and  * and then decelerates. * */public class DecelerateInterpolator implements Interpolator {    public DecelerateInterpolator() {    }    /**     * Constructor     *      * @param factor Degree to which the animation should be eased. Setting factor to 1.0f produces     *        an upside-down y=x^2 parabola. Increasing factor above 1.0f makes exaggerates the     *        ease-out effect (i.e., it starts even faster and ends evens slower)     */    public DecelerateInterpolator(float factor) {        mFactor = factor;    }        public DecelerateInterpolator(Context context, AttributeSet attrs) {        TypedArray a =            context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.DecelerateInterpolator);                mFactor = a.getFloat(com.android.internal.R.styleable.DecelerateInterpolator_factor, 1.0f);                a.recycle();    }        public float getInterpolation(float input) {        float result;        if (mFactor == 1.0f) {            result = (float)(1.0f - (1.0f - input) * (1.0f - input));        } else {            result = (float)(1.0f - Math.pow((1.0f - input), 2 * mFactor));        }        return result;    }        private float mFactor = 1.0f;}

使用:

        //设置动画插值器 被用来修饰动画效果,定义动画的变化率         animation.setInterpolator(new DecelerateInterpolator());

AnimationListener 监听器:

可以监听动画前,动画结束,动画repeat的时候的动作,对上面代码中的移动效果进行动画监听:

 /**     * 移动     * @return     */    public Animation getTranslateAnimation() {        //实例化TranslateAnimation        //以自身为坐标系和长度单位,从(0,0)移动到(1,1)        TranslateAnimation animation = new TranslateAnimation(                Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,                1.0f, Animation.RELATIVE_TO_SELF, 0.0f,                Animation.RELATIVE_TO_SELF, 1.0f);        //设置动画插值器 被用来修饰动画效果,定义动画的变化率         animation.setInterpolator(new DecelerateInterpolator());        //设置重复动画        animation.setRepeatCount(2);         //设置动画执行时间        animation.setDuration(1000);        //设置监听器        animation.setAnimationListener(new AnimationListener() {                        @Override            public void onAnimationStart(Animation animation) {                //动画开始前                Toast.makeText(getBaseContext(), "Strart!", Toast.LENGTH_SHORT).show();              }                        @Override            public void onAnimationRepeat(Animation animation) {                //重复动画的时候,                Toast.makeText(getBaseContext(), "Repeat!", Toast.LENGTH_SHORT).show();              }                        @Override            public void onAnimationEnd(Animation animation) {                // 结束动画的时候                Toast.makeText(getBaseContext(), "End!", Toast.LENGTH_SHORT).show();                              }        });        return animation;    }

备注内容

动画运动完毕后,停止在动画完成的位置

        animation.setFillAfter(true);        animation.setFillEnabled(true);

动画结束后,清除动画

tempLayout.clearAnimation();

动画结束后,改变View的偏移量

tempLayout.offsetLeftAndRight(width);



原创粉丝点击