Activity切换动画效果的修改

Activity切换动画效果的修改

Activity的动画效果在\android\frameworks\base\core\res\res\values下的stlyes.xml,themes.xml两个文件中有定义。
但是有时这些效果未必能满足你的要求,需要自己定义styles.xml来实现这个功能。

Activity去掉默认的动画效果方法:
1.重写Activity的Them中的windowAnimationStyle相关属性,并保存在res/values/styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Theme" parent="android:Theme">
        <item name="android:windowAnimationStyle">@style/Animation</item>
    </style>
    <style name="Animation">
        <item name="android:activityOpenEnterAnimation">@null</item>
        <item name="android:activityOpenExitAnimation">@null</item>
        <item name="android:activityCloseEnterAnimation">@null</item>
        <item name="android:activityCloseExitAnimation">@null</item>
        <item name="android:taskOpenEnterAnimation">@null</item>
        <item name="android:taskOpenExitAnimation">@null</item>
        <item name="android:taskCloseEnterAnimation">@null</item>
        <item name="android:taskCloseExitAnimation">@null</item>
        <item name="android:taskToFrontEnterAnimation">@null</item>
        <item name="android:taskToFrontExitAnimation">@null</item>
        <item name="android:taskToBackEnterAnimation">@null</item>
        <item name="android:taskToBackExitAnimation">@null</item>

    </style>
</resources>



2.在不想有动画的Activity上设置此属性即可
<activity android:name=".yourActivity"
            android:label="@string/app_name"
            android:screenOrientation="nosensor"
            android:theme="@style/Theme">

Android Activity界面切换添加动画特效

http://androidstudy.iteye.com/blog/800660
在Android 2.0之后有了overridePendingTransition() ,其中里面两个参数,一个是前一个activity的退出两一个activity的进入。
@Override
      public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);  

              setContentView(R.layout.SplashScreen);
 
              new Handler().postDelayed(new Runnable() {
                      @Override
                      public void run() {
                              Intent mainIntent = new Intent(SplashScreen.this,     AndroidNews.class);
                              SplashScreen.this.startActivity(mainIntent);
                              SplashScreen.this.finish();
 
                              overridePendingTransition(R.anim.mainfadein,
                                      R.anim.splashfadeout);
                      }
              }, 3000);
      }

上面的代码只是闪屏的一部分。
getWindow ().setWindowAnimations ( int );  

这可没有上个好但是也可以 。

实现淡入淡出的效果
overridePendingTransition(Android.R.anim.fade_in,android.R.anim.fade_out);  

由左向右滑入的效果
overridePendingTransition(Android.R.anim.slide_in_left,android.R.anim.slide_out_right);  

新建anim\zoomin.xml文件
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.android.com/apk/res/android"
        Android:interpolator="@android:anim/decelerate_interpolator">
    <scale Android:fromXScale="2.0" android:toXScale="1.0"
           Android:fromYScale="2.0" android:toYScale="1.0"
           Android:pivotX="50%p" android:pivotY="50%p"
           Android:duration="@android:integer/config_mediumAnimTime" />
</set>

新建anim\zoomout.xml文件
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.android.com/apk/res/android"
        Android:interpolator="@android:anim/decelerate_interpolator"
        Android:zAdjustment="top">
    <scale Android:fromXScale="1.0" android:toXScale=".5"
           Android:fromYScale="1.0" android:toYScale=".5"
           Android:pivotX="50%p" android:pivotY="50%p"
           Android:duration="@android:integer/config_mediumAnimTime" />
    <alpha Android:fromAlpha="1.0" android:toAlpha="0"
            Android:duration="@android:integer/config_mediumAnimTime"/>
</set>


Android电视关闭的动画效果

老式电视机关闭的时候画面一闪消失的那个效果:





首先创建一个TVOffAnimation继承于Animation:

import android.graphics.Matrix;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.Transformation;

public class TVOffAnimation extends Animation {

    private int halfWidth;
    private int halfHeight;

    @Override
    public void initialize(int width, int height, int parentWidth,
            int parentHeight) {

        super.initialize(width, height, parentWidth, parentHeight);
        setDuration(500);
        setFillAfter(true);
        //保存View的中心点
        halfWidth = width / 2;
        halfHeight = height / 2;
        setInterpolator(new AccelerateDecelerateInterpolator());
        
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {

        final Matrix matrix = t.getMatrix();
        if (interpolatedTime < 0.8) {
            matrix.preScale(1+0.625f*interpolatedTime, 1-interpolatedTime/0.8f+0.01f,halfWidth,halfHeight);
        }else{
            matrix.preScale(7.5f*(1-interpolatedTime),0.01f,halfWidth,halfHeight);
        }
    }
}

interpolatedTime表示的是当前动画的间隔时间 范围是0-1

那么横向来讲前80%的时间我们要横向拉伸到150%,纵向是直接减小,最后只留一条线。
后20%的时间里我们要横向从150%压缩至0%,纵向保持不变就好了,当横向为0的时候就全部消失了。
可能大家对于1+0.625f*interpolatedTime, 1-interpolatedTime/0.8f+0.01f,7.5f*(1-interpolatedTime),0.01f 这4个值比较疑惑,其实很简单,这是一个一次函数的函数值。

然后在activity中直接可以用了

View img = findViewById(R.id.imageView);
button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                img.startAnimation(new TVOffAnimation());
            }
        });



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值