Download presentation
Presentation is loading. Please wait.
1
第9章 仿画廊视图效果 授课老师:高成珍 QQ号:1281147324 QQ群:287966120、314753495
第9章 仿画廊视图效果 授课老师:高成珍 QQ号: QQ群: 、 网络资源:
2
本章案例效果分析
3
界面分析 该界面包含两部分:上方为用于显示大图的ImageSwitcher,下方为用于显示所有图片缩略图的水平线性布局。由于图片较多,屏幕的宽度无法容纳所有的图片,默认情况下,水平线性布局中超出屏幕边界的控件将无法显示。为了能让所有的图片都可以在屏幕上显示,在此,在水平线性布局外面包裹了一个水平滚动条。通过横向拖动滚动条,即可查看超出屏幕部分的图片。 由于图片控件的多少需要根据图片的个数来确定,图片控件的状态也是根据用户操作来动态变化的,所以不宜在布局文件中添加和指定。因此,布局中LinearLayout的内容暂时为空,仅仅指定了线性布局的方向。
4
ImageSwitcher图片切换器 ImageSwitcher(图片切换器)主要用于图片间的切换,可以显示图片,与ImageView的不同之处在于当切换显示图片时,可以为图片添加进入时和退出时动画。 既然是切换那么肯定是在两个视图之间进行的,ImageSwitcher通过setFactory()方法来创建两个需要切换的视图。该方法需要传递一个ViewFactory类型的参数,该参数是一个工厂接口,专门用于创建控件,该接口内部只有一个makeView()方法,用于返回所创建的控件。实现ViewFactory接口时,必须要实现makeView()方法,作为图片切换器,makeView()方法应该返回能够显示图片的控件,在此为ImageView。在setFactory()方法内部,实际上调用了两次ViewFactory接口的makeView()方法,从而创建了两个ImageView控件进行切换。
5
ImageSwitcher图片切换器 android:outAnimation="@android:anim/fade_out"
在创建ImageSwitcher对象之后,还必须调用它的setFactory()方法对它进行初始化,否则无法实现切换功能。在图片切换时可以为其添加进入时和退出时动画,有两种方式: 1)在布局文件中,为ImageSwitcher标签添加android:inAnimation和android:outAnimation属性分别设置进入时的动画和退出时的动画。既可以引用系统提供的动画,也可以是用户自定义的动画。例如淡入淡出效果设置如下。
6
ImageSwitcher图片切换器 2、在Java代码中,调用ImageSwitcher对象的setInAnimation()和setOutAnimation()方法,将相应的动画资源传递进去即可。例如: mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_in)); mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_out)); 使用AnimationUtils类的loadAnimation()方法创建Animation对象时需指定动画资源,同样可使用自定义或者系统自带的,在android.R类中定义了相应的常量,源文件在SDK目录下的platforms\android-Xx\data\res\anim文件夹中。
7
Java反射机制动态获取资源 在前面图片切换的案例中,我们将所有的图片ID保存在一个数组中,对这个数组进行初始化时,需要将每个图片的ID都添加进去,如果图片较多时,代码比较冗长,特别是新添加图片或对图片名称进行修改时,还需要对程序的源代码进行修改,扩展性和灵活性不太好。 实际上可以通过Java的反射机制动态获取Android中的图片ID。这是因为Android中的图片文件都会在R.drawable类中生成资源ID,并且一个图片的文件对应于R.drawable类的一个成员变量。只需要获取R.drawable类中的所有成员变量,即可获取所有图片的ID,然后对成员变量名进行判断即可获取符合要求的图片。而对于Java反射机制而言,获取成员变量名非常简单。
8
Java反射机制动态获取资源 所谓的反射是指在运行状态中,对于任意一个类,都能够知道这个 类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方 法和属性。Java反射机制的关键就是要得到你所想要探索的类的Class对 象,有了Class对象之后即可以进一步获取该类的成员变量、方法、构造 方法等,Java中反射相关的API存放在java.lang.reflect包下。 本例获取R.drawable类对应的Class对象后,即可调用它的 getFields()方法获得R.drawable类中所有的公共成员变量,调用Field 对象的getName()方法得到成员变量名即图片的文件名,然后判断是否 为需要的图片,如果是,则获取该成员变量的值,即图片的ID。
9
Java反射机制动态获取资源 Java程序中获得Class对象通常有如下三种方式:
1) 使用Class类的forName()静态方法。该方法需要传递一个字符串参数,该字符串为某个类的完整包名+类名; 2) 调用某个类的class属性来获取该类对应的Class对象,本例中使用R.drawable.class将会返回R.drawalbe类对应的Class对象; 3) 调用某个对象的getClass()方法,该方法是java.lang.Object类中的一个方法,所有的类都可以调用该方法,该方法将返回该对象所属类对应的Class对象。
10
课后思考题 做一做 请修改现有程序,在ImageSwitcher控件的 左右添加两个按钮,单击按钮能够浏览上一 张和下一张图片,同时下方的缩略图也会随 之发生变化。
Similar presentations