动画 -- View动画 -- 特殊使用场景

一、LayoutAnimation

LayoutAnimation是一个View动画,作用于ViewGroup,为ViewGroup指定一个动画,这样当它的子元素出场时都会具有这样的动画效果。
这种效果常用于ListView上,我们时常会看到一种特殊的ListView,它的每个item都以一定的动画的形式出现,它使用的就是LayoutAnimation。

实现:

1. XML实现:
(1) 定义LayoutAnimation

//res/anim/anim_layout.xml

(2) 为子元素指定具体的入场动画

//res/anim/anim_item.xml


    
    

(3) 为ViewGroup指定android:layoutAnimation属性
对ListView来说,这样ListView的item就具有出场动画了,这种方式适用于所有的ViewGroup。


属性:
android:delay:
表示子元素开始动画的时间延迟。比如子元素入场动画的时间周期为300ms,那么0.5表示每个子元素都需要延迟150ms才能播放入场动画。总体来说,第一个子元素延迟150ms开始播放入场动画,第二个子元素延迟300ms开始播放入场动画,依次类推。
android:animationOrder:
表示子元素动画的顺序。有三种选项:normal、reverse、和random,其中normal表示顺序显示,reverse表示逆向显示,random表示随机显示。
android:animation:
为子元素指定具体的入场动画。

2. 代码实现:
通过LayoutAnimationController来实现。

//res/anim/anim_item.xml


    
    


//代码
ListView listView = (ListView)layout.findViewById(R.id.list);
Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_item);
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
listView.setLayoutAnimation(controller);

二、Activity的切换效果

Activity有默认的切换效果,这个效果我们也可以自定义,主要用的overridePendingTransition(int enterAnim, int exitAnim)这个方法,这个方法必须在startActivity(intent)或者finish()之后被调用才能生效。参数如下:
enterAnim:Activity被打开时,所需的动画资源id;
exitAnim:Activity被暂停时,所需的动画资源id。

实现:

1. 当启动一个新Activity时,指定新Activity的切换效果:

Intent intent = new Intent(this, TestActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);

2. 当Activity退出时,指定自己的切换效果:

@Override
public void finish() {
    super.finish();
    overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);
}

三、Fragment的切换效果

Fragment也可以添加切换效果,由于Fragment是在 API 11 中新引入的类,因此为了兼容性我们需要使用 support-v4 这个兼容包,在这种情况下我们可以通过FragmentTransaction中的setCustomAnimations()方法来添加切换效果。
这个切换动画需要是View动画,之所以不能采用属性动画是因为属性动画也是 API 11 新引入的。

例子:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void add(View view){
        getSupportFragmentManager().beginTransaction()
                .setCustomAnimations(R.anim.enter_anim, R.anim.exit_anim)
                .add(R.id.fl_main, new ContentFragment(), null)
                .commit();
    }

    public void remove(View view){
        if(getSupportFragmentManager().findFragmentById(R.id.fl_main) != null) {
            getSupportFragmentManager().beginTransaction()
                    .setCustomAnimations(R.anim.enter_anim, R.anim.exit_anim)
                    .remove(getSupportFragmentManager().findFragmentById(R.id.fl_main))
                    .commit();
        }else{
            Toast.makeText(this, "未找到可移除的指定id的Fragment",Toast.LENGTH_SHORT).show();
        }
    }
}

你可能感兴趣的:(动画 -- View动画 -- 特殊使用场景)