Android Api Demos登顶之路(二)

今天我们来实现在两个activity之间实现动画切换的Demo,要实现这个功能非常简单,只需要 在启动第二个activity之后调用overridePendingTransition(enterAnim, exitAnim); 方法即可。
该方法的第一个参数进入的动画效果,即你要为第二个activity设置进入的动画效果 第二个数为退出时的动画效果,即你为第一个activity退出舞台时所设置的动画效果。
这两个参数都为整型,对应你的xml文件ID,你可以在该xml文件中随意定义你想要实现的动画效果。
我们在这里所使用的动画类型为补间动画类型,tween-animation。共有四种基本动画效果,alpha:透明度 渐变效果,rotate: 旋转效果,scale:缩放效果,translate:移动效果。
下面我们来一步一步实现对这些动画效果的定义
在res资源文件夹下新建anim文件夹,在该文件夹下选择新建android xml文件,资源类型选择tween animation
我们可以看到下面列出了四种动画类型,还有一个set,set指的是一个用来存放各种动画效果的容器,你可以 把各种动画效果自由组合,尔后放到set容器中,实现你想要达到的效果。
我们先选择alpha,来实现一个渐变的切换效果。
取名为fade.xml
android:interpolator=”@android:anim/accelerate_interpolator”设置插入器类型
为加速插入器
android:fromAlpha=”0.0”
android:toAlpha=”1.0”
设置透明度由完全透明到完全不透明变化
android:duration=”@android:integer/config_longAnimTime
设置动画持续时间,这里用了一个系统定义的时间

<?xml version="1.0" encoding="utf-8"?>
<alpha
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="0.0"
    android:toAlpha="1.0"
    android:duration="@android:integer/config_longAnimTime">
</alpha>

再创建一个名为hold.xml的动画文件,选择了translate效果
其实我们可以看到这里虽然定义了动画,但它定义的横向移动却是从0到0
所以这个动画是没有动起来的

<?xml version="1.0" encoding="utf-8"?>
<translate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromXDelta="0"
    android:toXDelta="0"
    android:duration="@android:integer/config_longAnimTime">
</translate>

接着再创建两个动画文件zoom_enter和zoom_exit,实现缩放的效果

<?xml version="1.0" encoding="utf-8"?>
<!-- android:pivotX="50%p",是指相对于父控件而言取中点,50%的写法是相对于自身而言-->
<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_longAnimTime"/>
</set>

zoom_exit

<?xml version="1.0" encoding="utf-8"?>
<!-- android:pivotX="50%p",是指相对于父控件而言取中点,50%的写法是相对于自身而言
android:zAdjustment="top"是设置将该动画层置于其他动画层的上面-->
<set
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:zAdjustment="top">
    <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_longAnimTime"/>
    <alpha 
        android:fromAlpha="1.0"
        android:toAlpha="0.0"
        android:duration="@android:integer/config_longAnimTime"/>
</set>

创建Animation类,并继承activity


public class Animation extends Activity {
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_animation);
        button = (Button) findViewById(R.id.fadein);
        button.setOnClickListener(mFadeinListener);
        button = (Button) findViewById(R.id.zoomin);
        button.setOnClickListener(mZoominListener);

        // 判断一下如果当前的编译版本大于或等于jelly_bean(16、17、18;4.1,4.2,4.3)
        // 则显示新功能的几个按钮
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
            button = (Button) findViewById(R.id.modernfadein);
            button.setOnClickListener(mModernFadeinListener);
            button = (Button) findViewById(R.id.modernzoomin);
            button.setOnClickListener(mModernZoominListener);
            button = (Button) findViewById(R.id.scaleup);
            button.setOnClickListener(mModernScaleupListener);
            button = (Button) findViewById(R.id.thumbnailzoom);
            button.setOnClickListener(mModernThumbnailzoomListener);
        } else {
            findViewById(R.id.modernfadein).setEnabled(false);
            findViewById(R.id.modernzoomin).setEnabled(false);
            findViewById(R.id.scaleup).setEnabled(false);
            findViewById(R.id.thumbnailzoom).setEnabled(false);
        }
    }

    private OnClickListener mFadeinListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Animation.this, HelloWord.class);
            startActivity(intent);
            overridePendingTransition(R.anim.fade, R.anim.hold);
        }
    };
    private OnClickListener mZoominListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Animation.this, HelloWord.class);
            startActivity(intent);
            overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
        }
    };
    private OnClickListener mModernFadeinListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Animation.this, HelloWord.class);
            ActivityOptions options = ActivityOptions.makeCustomAnimation(
                    Animation.this, R.anim.fade, R.anim.hold);
            startActivity(intent, options.toBundle());
        }
    };
    private OnClickListener mModernZoominListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            //Android 4.1(API16)提供了一个新类ActivityOptions,用来实现Activity的切换动画
            //该方法创建一个自定义的动画
            Intent intent = new Intent(Animation.this, HelloWord.class);
            ActivityOptions options = ActivityOptions.makeCustomAnimation(
                    Animation.this, R.anim.zoom_enter, R.anim.zoom_exit);
            startActivity(intent, options.toBundle());
        }
    };
    private OnClickListener mModernScaleupListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Animation.this, HelloWord.class);
            //Android 4.1(API16)提供了一个新类ActivityOptions,用来实现Activity的切换动画
            //该方法创建一个动画,能够从屏幕指定的位置和指定的大小拉伸一个活动窗口。
            //第一个参数是承载动画的View,第二和第三个参数指定拉伸开始的位置,第四和第五个参数指定拉伸的大小
            //这里的v就是名字为scaleup的button按钮,起始位置就是这个按钮的左上角
            ActivityOptions options = ActivityOptions.makeScaleUpAnimation(v,
                    0, 0, v.getWidth(), v.getHeight());
            startActivity(intent, options.toBundle());
        }
    };
    private OnClickListener mModernThumbnailzoomListener=new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Animation.this, HelloWord.class);
            //将view转换成bitmap
            v.setDrawingCacheEnabled(true);
            v.setPressed(false);
            v.refreshDrawableState();
            //转换成的图片就是名为thnmbnailzoom的按钮
            Bitmap bitmap = v.getDrawingCache();
            //Canvas c=new Canvas(bitmap);
            //创建一个动画,能够从屏幕指定的位置和提供的缩略图拉伸一个活动窗口
            ActivityOptions options = ActivityOptions.makeThumbnailScaleUpAnimation(v, bitmap, 0, 0);
            startActivity(intent, options.toBundle());
            //记得将DrawingCacheEnabled还原为false
            v.setDrawingCacheEnabled(false);
        }
    };
}

在layout文件夹下创建activity_animation布局文件

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

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:padding="5dp"
        android:text="Press a button to lauch an activity with a custom animation" />

    <Button
        android:id="@+id/fadein"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="14sp"
        android:text="Fade in" />

    <Button
        android:id="@+id/zoomin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="14sp"
        android:text="Zoom in" />

    <Button
        android:id="@+id/modernfadein"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="14sp"
        android:text="Modern fade in" />

    <Button
        android:id="@+id/modernzoomin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="14sp"
        android:text="Modern zoom in" />

    <Button
        android:id="@+id/scaleup"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="14sp"
        android:text="Scale up" />

    <Button
        android:id="@+id/thumbnailzoom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="14sp"
        android:text="Thumbnail zoom" />

</LinearLayout>

配置文件中配置activity

<activity 
            android:name="com.example.apidemos.Animation"
            android:label="@string/activity_animation" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="COM_FISHTOSKY_CODE"/>
            </intent-filter>
        </activity>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值