Android 高级UI设计笔记12:ImageSwitcher图片切换器

1. ImageSwitcher

ImageSwitcher是Android中控制图片展示效果的一个控件,如:幻灯片效果...,颇有感觉啊。做相册一绝

2. 重要方法

 setImageURI(Uri uri):设置图片地址

 setImageResource(int resid):设置图片资源库

 setImageDrawable(Drawable drawable):绘制图片

3. 设置动画效果

imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,
    android.R.anim.fade_in));
imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,
    android.R.anim.fade_out));

 

4. 创建ImageSwitcher是通过工厂来实现的,看下面代码:

imageSwicher.setFactory(this);  

   为了给ViewSwitcher添加多个组件,一般通过调用 ViewSwitcher 的 setFactory(ViewSwitcher.ViewFactory)方法为之设置 ViewFactory, 并由该 ViewFactory 为之创建View即可。

为imageSwitcher设置ViewFactory:

@Override
public View makeView() {
    ImageView imageView = new ImageView(this);
    imageView.setImageResource(arrayPictures[pictureIndex]);
    return imageView;
}  

下面再来看看setFactory()方法的具体代码:

public void setFactory(ViewFactory factory) {
    mFactory = factory;
    obtainView();
    obtainView();
}  

可以看到在setFactory的同时,调用了两遍obtainView()方法,obtainView()方法就是给ImageSwitcher添加子ImageView的,调用两遍就是添加了两个子ImageView

再来看看obtainView()方法的具体代码:

private View obtainView() {
    View child = mFactory.makeView();
    LayoutParams lp = (LayoutParams) child.getLayoutParams();
    if (lp == null) {
        lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
    }
    addView(child, lp);
    return child;
}  

可以看到obtainView()方法的的职责就是:通过makeView()方法创建View,然后把创建出来的View添加到ImageSwitcher上

再来看看下面的方法:

public void setImageResource(int resid)
{
    ImageView image = (ImageView)this.getNextView();
    image.setImageResource(resid);
    showNext();
}  

此方法就是用来显示下一张图片的,我们可以看到这个方法里面调用了getNextView()方法和showNext()方法,那么我们来看看这两个方法的具体代码:

public View getNextView() {
    int which = mWhichChild == 0 ? 1 : 0;
    return getChildAt(which);
}  
public void showNext() {
    setDisplayedChild(mWhichChild + 1);
}  

getNextView()方法是在两个子ImageView之间切换,showNext()方法是负责显示这两个子View中的哪一个

也就是说,现用getNextView()方法得到下一个View,然后重新设置这个View的imageResource,最后通过showNext()方法将下一个View显示出来.

5. 实例:

(1)新建一个Android工程,如下:

(2)来到主布局文件之中activity_main.xml,如下:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     tools:context="com.himi.galleryimageswitcherdemo.MainActivity" >
 7
 8
 9     <ImageSwitcher
10         android:id="@+id/imageSwicher"
11         android:layout_width="fill_parent"
12         android:layout_height="0dip"
13         android:layout_weight="1"
14         android:background="@android:color/white"
15         android:gravity="center" />
16
17 </LinearLayout>

(3)来到MainActivity,如下:

 1 package com.himi.galleryimageswitcherdemo;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.MotionEvent;
 6 import android.view.View;
 7 import android.view.View.OnTouchListener;
 8 import android.view.animation.AnimationUtils;
 9 import android.widget.ImageSwitcher;
10 import android.widget.ImageView;
11 import android.widget.ViewSwitcher.ViewFactory;
12
13 public class MainActivity extends Activity implements ViewFactory,
14  OnTouchListener{
15
16     private ImageSwitcher imageSwicher;
17
18     // 图片数组
19     private int[] arrayPictures = { R.drawable.img1, R.drawable.img2,
20             R.drawable.img3, R.drawable.img4 };
21     // 要显示的图片在图片数组中的Index
22     private int pictureIndex;
23     // 左右滑动时手指按下的X坐标
24     private float touchDownX;
25     // 左右滑动时手指松开的X坐标
26     private float touchUpX;
27
28     @Override
29     public void onCreate(Bundle savedInstanceState) {
30         super.onCreate(savedInstanceState);
31         setContentView(R.layout.activity_main);
32
33         imageSwicher = (ImageSwitcher) findViewById(R.id.imageSwicher);
34
35         // 为ImageSwicher设置Factory,用来为ImageSwicher制造ImageView
36         imageSwicher.setFactory(this);
37         // 设置ImageSwitcher左右滑动事件
38         imageSwicher.setOnTouchListener(this);
39     }
40
41     public View makeView() {
42         ImageView imageView = new ImageView(this);
43         imageView.setImageResource(arrayPictures[pictureIndex]);
44         return imageView;
45     }
46
47     public boolean onTouch(View v, MotionEvent event) {
48         if (event.getAction() == MotionEvent.ACTION_DOWN) {
49             // 取得左右滑动时手指按下的X坐标
50             touchDownX = event.getX();
51             return true;
52         } else if (event.getAction() == MotionEvent.ACTION_UP) {
53             // 取得左右滑动时手指松开的X坐标
54             touchUpX = event.getX();
55             // 从左往右,看前一张
56             if (touchUpX - touchDownX > 100) {
57                 // 取得当前要看的图片的index
58                 pictureIndex = pictureIndex == 0 ? arrayPictures.length - 1
59                         : pictureIndex - 1;
60                 // 设置图片切换的动画
61                 imageSwicher.setInAnimation(AnimationUtils.loadAnimation(this,
62                         android.R.anim.slide_in_left));
63                 imageSwicher.setOutAnimation(AnimationUtils.loadAnimation(this,
64                         android.R.anim.slide_out_right));
65                 // 设置当前要看的图片
66                 imageSwicher.setImageResource(arrayPictures[pictureIndex]);
67                 // 从右往左,看下一张
68             } else if (touchDownX - touchUpX > 100) {
69                 // 取得当前要看的图片的index
70                 pictureIndex = pictureIndex == arrayPictures.length - 1 ? 0
71                         : pictureIndex + 1;
72                 // 设置图片切换的动画
73
74                 imageSwicher.setInAnimation(AnimationUtils.loadAnimation(this,
75                         android.R.anim.fade_out));
76                 imageSwicher.setOutAnimation(AnimationUtils.loadAnimation(this,
77                         android.R.anim.fade_in));
78                 // 设置当前要看的图片
79                 imageSwicher.setImageResource(arrayPictures[pictureIndex]);
80             }
81             return true;
82         }
83         return false;
84     }
85
86 }

布署程序到手机上,如下:

滑动之后跳转到下一张图片,如下:

时间: 2024-08-09 06:17:42

Android 高级UI设计笔记12:ImageSwitcher图片切换器的相关文章

Android 高级UI设计笔记11:Gallery(画廊控件)之Gallery基本使用

1. 这里要向大家介绍Android控件Gallery(画廊控件) Gallery控件主要用于横向显示图像列表,不过按常规做法.Gallery组件只能有限地显示指定的图像.也就是说,如果为Gallery组件指定了10张图像,那么当Gallery组件显示到第10张时,就不会再继续显示了. 2. Gallery基本用法: 步骤如下: (1)首先我们新建一个Android工程,工程目录如下: (2)activity_main.xml(主布局文件),如下: 在activity_main.xml添加Ima

Android 高级UI设计笔记22:Android 指示引导页(带圆点)

1. 引导页: 我们在安装某个软件首次运行时,大部分都会有一个引导页的提示,介绍软件新功能的加入或者使用说明等,支持滑动且下面会有几个圆点,显示共有多少页和当前图片的位置,类似如下效果: 2. 引导页具体实现功能如下: 可以左右滑动图片. 图片的索引圆点显示,看出当前图片所在的位置和图片的数量. 可任意左右滑动. 图片的索引圆点带有动画效果. 最后一页显示按钮,点击进入应用. 3. 引导页实现逻辑过程: 利用ViewPager实现用户引导界面. 在这里,我们需要用到google提到的一个支持包—

Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件

1. 引言: RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一下观察者模式. 2. 最终目的 模拟ListView的setOnItemClickListener()方法,调用者只须调用类似于setOnItemClickListener的东西就能获得被点击item的相关数据.   3. 原理 为RecyclerView的每个子item设置setOnClickLi

Android 高级UI设计笔记06:仿微信图片选择器

仿微信图片选择器: 一.项目整体分析: 1. Android加载图片的3个目标: (1)尽可能的去避免内存溢出. a. 根据图片的显示大小去压缩图片 b. 使用缓存对我们图片进行管理(LruCache) (2)用户操作UI控件必须充分的流畅. a. getView里面尽可能不去做耗时的操作(异步加载 + 回调显示) (3)用户预期显示的图片尽可能的快(图片的加载策略的选择,一般选择是LIFO). a. LIFO 2. 定义一个Imageloader完成上面1中的3个目标: Imageloader

Android 高级UI设计笔记18:实现圆角图片

1. 下面我们看看微信首页,也就是聊天界面,如下: 上面的listView里的item中联系人的头像是圆角的 2. 下面分析一个Github的经典: (1)Github库地址: https://github.com/siyamed/android-shape-imageview (2)使用方法: >1. 添加依赖: 在build.gradle(Module:app)下添加: compile 'com.github.siyamed:android-shape-imageview:[email pr

Android 高级UI设计笔记19:PopupWindow使用详解

1. PopupWindow使用 PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的. 2. PopupWindow使用的案例: (1)首先是我们弹出框的布局设计,如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.

Android 高级UI设计笔记09:Android如何实现无限滚动列表

ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验. 对于ListView和GridView一个共同基本要求是:当用户向下滚动时可以动态加载数据支持无限滚动.下面教你如何在自己的应用中实现这个特性. 具体流程如下: (1)我们需要的一个主要组件是InfiniteScrollListener类,它实现了OnScrollListener接口.让我们直接

Android 高级UI设计笔记08:Android开发者常用的7款Android UI组件(转载)

Android开发是目前最热门的移动开发技术之一,随着开发者的不断努力和Android社区的进步,Android开发技术已经日趋成熟,当然,在Android开源社区中也涌现了很多不错的开源UI项目,它们可以帮助Android开发者更方便快捷地完成想要的功能.本文是Android系列的第一篇,主要是向大家推荐一些常用的Android UI组件,它们都是开源的. 1.图表引擎 -  AChartEngine AChartEngine是一款基于Android的图表绘制引擎,它为Android开发者提供

Android 高级UI设计笔记24:Android 夜间模式之 WebView 实现白天 / 夜间阅读模式 (使用JavaScript)

1. 问题引入: 前面我们是使用方法 降低屏幕亮度(不常用) 和 替换theme,两者都是针对Activity的背景进行白天.夜间模式的交换,但是如果我们显示的是Html的内容,这个时候改怎么办? 分析:首先加载Html页面肯定是要用到WebView的,通过loadUrl的方法可以把html页面显示到webView,我们知道Android可以与JavaScript进行交互,就是说可以在JavaScript中调用Android的代码,也可以在Android中调用JavaScript代码. 所以就有