zoukankan      html  css  js  c++  java
  • 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-]

    1. 利用setTransition
    2. 利用setCustomAnimations
      1. 通过ObjectAnimator自定义动态效果
      2. 程序代码的编写

    利用fragment transaction进行切换,很方便提供切换的效果。

    利用setTransition()

    Pro Android学习笔记(三九):Fragment(4):基础小例子-续的“Step 4:实现showDetail(int index),如何管理fragment”中,介绍了如何在容器FrameLayout中通过fragment管理器,利用fragment transaction实现fragment切换的实现。

    通过setTransition()我们可以设置有限几个切换效果,代码如下:

        protected void addFragmentToStack(int index){  
            DetailFragment detail = DetailFragment.newInstance(index);
            FragmentTransaction ft = getFragmentManager().beginTransaction(); 
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
            ft.replace(R.id.details, detail);        
            ft.addToBackStack("detail"); 
            ft.commit(); 
        }

    代码设置的fade(渐变)效果。

    利用setCustomAnimations()

    通过ObjectAnimator自定义动态效果

    在res/animator中设置两个动态效果,slide_in_left.xml如下。

    <?xml version="1.0" encoding="utf-8"?> 
    <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:interpolator/accelerate_decelerate" 
        android:valueFrom="-1280" 
        android:valueTo="0" 
        android:valueType="floatType" 
        android:propertyName="X" 
        android:duration="2000"  />

    实现自定义动画的类是ObjectAnimator,不仅用于fragment,也可用于view。在xml中,定义了从“from”状态到“to”状态,时间间隔为duration(毫秒),所执行的变化规则称为interpolator。最简单的interpolator是linear,即@android:interpolator/linear,从状态From到to状态是均匀变化。缺省的interpolator是accelerate_decelerate,如本例,在状态变化中先是加速,后是减速,使用户视觉上平滑过渡。此外还有@android:interpolator/bounce为弹跳方式。系统提供的方式可以在源代码/data/res/interpolator中查看。android:propertyName用于动画的维度,在本例中X表示横向,根view的setX()中的参数是float,所以设置valueType为floatType。我们设置可以设置自己的维度。From设置为-1280,因为这个值对于终端设备而言,-1280个像素位可以确保从不可视的位置移入。如果我们没有设置From,系统会根据当前值来设定初始值。

    另一个动态效果文件slide_out_right.xml如下:

    <?xml version="1.0" encoding="utf-8"?> 
    <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:interpolator/accelerate_decelerate" 
        android:valueFrom="0" 
        android:valueTo="1280" 
        android:valueType="floatType" 
        android:propertyName="X" 
        android:duration="2000" />

    在看看其他动态效果。如要设置淡入淡出,维度是对象的透明度,即android:propertyName="alpha",淡入是from(0,不可视)到to(1),淡出是from(1)到to(0)。object animator会找到fragment的root view,然后不断地调用setAlpha()方法,来改变透明度,调用的频率和改变的值由interpolator来决定。

    如果我们要在两个或者两个以上的维度设置变化,可以使用set tag,对应为Android的AnimatorSet类,下面的例子同时设置向下和淡出效果。set有一个属性android:ordering,缺省为together,即各个维度的变化同时发生,还可以设置为sequentially依次发生。

    [html] view plaincopy
     
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <set xmlns:android="http://schemas.android.com/apk/res/android" >  
    3.         <objectAnimator android:interpolator="@android:interpolator/accelerate_cubic"  
    4.             android:valueFrom="1"  
    5.             android:valueTo="0"  
    6.             android:valueType="floatType"  
    7.             android:propertyName="alpha"  
    8.             android:duration="1000"/>  
    9.         <objectAnimator android:interpolator="@android:interpolator/accelerate_cubic"  
    10.             android:valueFrom="0"  
    11.             android:valueTo="1280"  
    12.             android:valueType="floatType"  
    13.             android:propertyName="Y"  
    14.             android:duration="1000"/>  
    15. </set>  

    程序代码的编写

    代码如下:

    protected void addFragmentToStack(int index){  
        DetailFragment detail = DetailFragment.newInstance(index);
        FragmentTransaction ft = getFragmentManager().beginTransaction(); 
        //setCustomAnimations()必须位于replace()之前,否则效果不起所中。它的两个参数分别为enter,exit的效果。系统目前提供两个效果,分别为android.R.animator.fade_in和android.R.animator.fade_out
        ft.setCustomAnimations(R.animator.slide_in_left,R.animator.slide_out_right); 
        ft.addToBackStack("detail");
        ft.replace(R.id.details,"detail"); 
        ft.commit(); 

    注意,进入和退出的两个操作是同时进行的,并非先执行完exit再执行enter。

    本博文涉及的例子代码,可以在Pro Android学习:Fragment中下载。

    相关链接: 我的Android开发相关文章

  • 相关阅读:
    专职DBA-MySQL体系结构与基本管理
    JSON
    MIME类型
    文件上传下载
    response常用的方法
    2020.11.27小记
    HTTP请求状态码
    1561. Maximum Number of Coins You Can Get
    1558. Minimum Numbers of Function Calls to Make Target Array
    1557. Minimum Number of Vertices to Reach All Nodes
  • 原文地址:https://www.cnblogs.com/blongfree/p/5047980.html
Copyright © 2011-2022 走看看