视图切换(三)ViewAnimator及其子类

一、回顾帧布局(FrameLayout)

FrameLayout是最简单的布局管理器。FrameLayout只是简单地将子视图放置在布局的边界内,默认位置是左上角,可以通过gravity改变默认。添加多个子视图时,它会把新子视图堆积在前一个子视图的上面。

二、ViewAnimator是一个基类,它继承自FrameLayout,因此它具有FrameLayout的特性——可以将多个View组件“堆叠”在一起。另外,ViewAnimator还可以在View切换的时候表现出动画效果。

ViewAnimator及其子类继承关系如下:

ViewAnimator及其子类的重要使命是增加动画效果,使界面更加酷炫。ViewAnimator有如下XML属性。

三、ViewSwitcher的使用

1、ViewSwitcher是视图切换组件。它继承自FrameLayout,所以可以将多个View层叠在一起,每次只显示一个组件,当程序控制从这些层叠的组件中的一个切换到另一个时,可以为ViewSwitcher指定切换的动画效果。

2、使用ViewSwitcher时,主要是如下两个要点:

a、需要提供一个实现了ViewFactory(接口)的工厂类。在切换视图时,这个工厂类负责提供下一个视图实例。

b、需要切换视图时。

调用ViewSwitcher的setInAnimation和setOutAnimation分别设置新视图进入ViewSwitcher和就视图退出的动画效果。

调用ViewSwitcher的getNextView方法即可获得下一个View的实例(其实就是ViewFactory通过makeView方法创建的那个实例),这时我们可以对这个实例进行操作。

调用ViewSwitcher的showNext或者showPrevious进行视图切换。

3、下面是使用ViewSwitcher进行视图切换的实例(基于前面两篇文章,《Android技术——视图切换(一)》和《Android技术——视图切换(二)》里面的项目添加而来):

/MeiNv_Liulanqi/src/com/example/meinv_liulanqi/ViewSwitcherActivity.java文件:

package com.example.meinv_liulanqi;import com.example.meinv_liulanqi.R;import android.app.Activity;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ViewSwitcher;import android.widget.ViewSwitcher.ViewFactory;public class ViewSwitcherActivity extends Activity{ private int screenNo = -1; private int screenNum; private ViewSwitcher switcher; private int[] img_ids; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_switcher); img_ids = new int[] { R.drawable.linzhiling, R.drawable.liuyan, R.drawable.yangmi }; screenNum = img_ids.length; // 为ViewSwitcher提供视图工厂 switcher = (ViewSwitcher) findViewById(R.id.viewSwitcher); myViewFactory factory = new myViewFactory(this.getLayoutInflater()); switcher.setFactory(factory); // 初始化 getNext(switcher, img_ids); // 进行切换 Button btn_next = (Button) findViewById(R.id.button_next); btn_next.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { getNext(switcher, img_ids); } }); Button btn_prev = (Button) findViewById(R.id.button_prev); btn_prev.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { getPrev(switcher, img_ids); } }); } private void getNext(ViewSwitcher _switcher, int[] _img_ids) { if (screenNo < screenNum – 1) { screenNo++; // 设置视图切换的动画效果 _switcher.setInAnimation(ViewSwitcherActivity.this, R.anim.slide_in_right); _switcher.setOutAnimation(ViewSwitcherActivity.this, R.anim.slide_out_left); // 获取下一个视图的实例 LinearLayout lil = (LinearLayout) _switcher.getNextView(); ImageView img = (ImageView) lil.findViewById(R.id.img_meinv); img.setImageResource(_img_ids[screenNo]); // 切换视图 _switcher.showNext(); } } private void getPrev(ViewSwitcher _switcher, int[] _img_ids) { if (screenNo > 0) { screenNo–; // 设置视图切换的动画效果 _switcher.setInAnimation(ViewSwitcherActivity.this, R.anim.slide_in_lef); _switcher.setOutAnimation(ViewSwitcherActivity.this, R.anim.slide_out_right); // 获取下一个视图的实例 LinearLayout lil = (LinearLayout) _switcher.getNextView(); ImageView img = (ImageView) lil.findViewById(R.id.img_meinv); img.setImageResource(_img_ids[screenNo]); // 切换视图 _switcher.showPrevious(); } } class myViewFactory implements ViewFactory { private LayoutInflater inflater; public myViewFactory(LayoutInflater inf) { inflater = inf; } @Override public View makeView() { // 提供下一个视图的实例 return inflater.inflate(R.layout.fragment_layout, null); } }}

/MeiNv_Liulanqi/res/layout/activity_view_switcher.xml文件:

孤独是为了孤独背后的解脱,孤独的过程,就是一个寻找真爱的过程。

视图切换(三)ViewAnimator及其子类

相关文章:

你感兴趣的文章:

标签云: