Material Design学习(三)

Activity Transition

这个看上去效果赞极了,首先偷张图。
原图地址:<a href=https://github.com/lgvalle/Material-Animations” title=”” />

网上Android 5.0关于这个的介绍不是很详细,都是简单的将官方文档做翻译,不过有了官方文档可以自己测试倒是。

先贴主要的学习链接:

http://www.androiddesignpatterns.com/2014/12/activity-fragment-transitions-in-android-lollipop-part1.html

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0116/2320.html

[https://github.com/lgvalle/Material-Animations](
https://github.com/lgvalle/Material-Animations)

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0116/2310.html

方法一:使用Material Design主题
http://blog.csdn.net/a396901990/article/details/40187203这篇文章已经说的蛮清楚了,步骤说的不是很详细,这里我稍作补充,再来是有好奇心的我在测试的时候发现了一些问题。

首先Android studio创建一个新的Android project
接着再res/values下的styles.xml里作修改。

<style name="myTheme" parent="android:Theme.Material">  
        <!-- 允许使用transitions -->  
        <item name="android:windowContentTransitions">true</item>  

        <!-- 指定进入和退出transitions -->  
        <item name="android:windowEnterTransition">@transition/explode</item>  
        <item name="android:windowExitTransition">@transition/explode</item>  

        <!-- 指定shared element transitions -->  
        <item name="android:windowSharedElementEnterTransition">  
            @transition/change_image_transform</item>  
        <item name="android:windowSharedElementExitTransition">  
            @transition/change_image_transform</item>  
</style>

接着你就需要修改AndroidManifest.xml修改成
android:theme="@style/myTheme"
然后你需要新建一个Directory名为transition(在res文件夹下),然后在里面创建相应的文件。比如explode.xml.修改如下:


<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">  
    <explode/>  
</transitionSet> 

你要写别的效果你可以再创建,修改里面得属性改成你需要的属性即可。

然后你需要创建一个新的Activity,创建好了就需要写两个Activity跳转的代码了。在MainActivity.java中设置按钮的点击事件跳转至另一个Activity。这里可以设置它的ExitTransition,在setContentView之前添加如下代码就行。

// 允许使用transitions  
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);  

// 设置一个exit transition  
getWindow().setExitTransition(new Explode());  

这里效果不是很好看出来,在你添加的另一个Activity中,同样在setContentView之前添加:

// 允许使用transitions  
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);  

// 设置一个exit transition  
getWindow().setEnterTransition(new Explode());  

然后你跳转时需要使用:

Intent intent1 = new Intent(MainActivity.this, ExplodeActivity.class);
startActivity(intent1, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

这样就可以很清楚的看到你跳转到另一个Activity时就会有Explode\Fade\Slide的效果(修改setEnterTransition里面的参数即可)。

这里我发现了一些问题,在style.xml中我们设置了windowEnterTransition而在代码中我们也setEnterTransition两个会不会起冲突?不会,你最后给Acitivity设置了什么Transition它就是什么。所以style.xml里应该算是设置默认setEnterTransition是什么Transition了。这也意味着可以通过xml和代码两种方式设置setEntransition。而且我发现只要你使用了主题android:Theme.Material就算你不在style.xml和代码里写Content Transition的相关设置代码,你只需要在跳转的时候使用:

startActivity(intent1, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

你就可以看到Activity Transition的效果了,默认是Fade效果。

下面介绍下Share Element Transition,上面的链接中有对这个做介绍的,大家看看我这里就不写了。

MainActivity.java的布局文件activity_main.xml中加入:

<Button
    android:id="@+id/shareElememt"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="shareElement测试按钮"
    android:transitionName="shareView"
    android:layout_weight="1"
    />
    ```
注意这里的一个属性`android:transitionName="shareView"`。
在另一个你要共享元素传递到的那个`Activity`的布局文件中加入
```xml
<Button
    android:id="@+id/btn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="shareElement测试按钮"
    android:transitionName="shareView"
    android:layout_weight="1"
    />

<Space
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:layout_weight="1"/>

<Space
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:layout_weight="1"/>
<Space
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:layout_weight="1"/>
    ```
可以看到我们这里的`Button`同样添加了上面的属性。正如链接里说的:
**共享元素变换并不是真正实现了两个activity或者Fragment之间元素的共享,实际上我们看到的几乎所有变换效果中(不管是B进入还是B返回A),共享元素都是在B中绘制出来的。Framework没有真正试图将A中的某个元素传递给B,而是采用了不同的方法来达到相同的视觉效果。A传递给B的是共享元素的状态信息。B利用这些信息来初始化共享View元素,让它们的位置、大小、外观与在A中的时候完全一致。当变换开始的时候,B中除了共享元素之外,所有的其他元素都是不可见的。随着动画的进行,framework 逐渐将B的activity窗口显示出来,当动画完成,B的窗口才完全可见。
**

然后在`MainActivity.java`中设置Button的点击事件。




<div class="se-preview-section-delimiter"></div>

```java
Intent intent4 = new Intent(MainActivity.this, ShareElememtActivity.class);
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, v, "shareView" );
startActivity(intent4, options.toBundle());

同样在跳转的那个Activity中设置Button的点击事件。

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent4 = new Intent(ShareElememtActivity.this, MainActivity.class);
        ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(ShareElememtActivity.this, v, "shareView" );
        startActivity(intent4, options.toBundle());
    }
});

最后效果如下:

image description

根据我的介绍应该可以一步一步拼凑出来,需要源码的同学可以去:
http://download.csdn.net/detail/cuihaoren01/9506615

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值