Android中Gallery和ImageSwitcher同步自动(滚动)播放图片库

Android中使用ImageViewSwitcher实现图片切换轮播导航效果 前面写过了使用ViewFlipper和ViewPager实现屏幕中视图切换的效果(未实现轮播)附超链接: Android中使用ViewFlipper实现屏幕切换 Android中使用ViewPager实现屏幕页面切换和页面轮播效果 今天我们在换一种实现方式ImageViewSwitcher。 ImageSwitcher是Android中控制图片展示效果的一个控件,如:幻灯片效果 阅读详情

             

         本文主要内容是如何让Gallery和ImageSwitcher控件能够同步自动播放图片集 ,看起来较难,然而,实现的方法非常简单,

请跟我慢慢来。总的来说,本文要实现的效果如下图:(截图效果不怎么好)

 

               

       

      本文是建立在以下两篇bolg上的:

 

                 1、Android入门第十二篇之Gallery

                 2、Android 控件之ImageSwitcher图片切换器

 

       如果对Gallery和ImageSwitcher控件不是很熟悉的同学,建议先过去看看,本文并没有怎么讲述控件的使用方法,而是在使用

基础上,搭建我们的技巧。

       接下来,温习巩固这两个控件的知识点,有个知识性的储备。

 

 一、  Gallery的监听事件

 

           Gallery的两个重要监听事件如下:   

                1、OnItemClickListener 监听事件

                     说明:当Gallery中的Item处于选中状态并且被点击触发该事件  ;

                     其监听方法为:

                       public voidonItemClick(AdapterView<?> parent, View view, int position, long id)

 

               2、OnItemSelectedListener  监听事件 

                     说明:当Gallery中的Item处于选中状态时触发该事件

                      其监听方法为:

                        public void onItemSelected(AdapterView<?> parent, View view, int position, long id)

                            说明:当Gallery中的Item处于选中状态时触发该事件

                        public void   onNothingSelected(AdapterView<?> parent)

                           说明:当控件没有任何一项item选中时,触发该方法

 

           两种监听事件的区别在于,Item被选中(selected)的由来。其由来有两种:

                     1、鼠标点击(click)了Item (先click),然后该项selected ;

                     2、代码设置某项Item 选中,例如setSelection(int position)(具体使用见下文) ,然后该项selected .

 

     在情形1时,首先触发OnItemClickListener(先click),接着便是OnItemSelectedListener监听(因为item selected)。当某个Item

  处于选中状态时,如果它是由情形2而来,就不会触发OnItemClickListener监听(没有click),只会触发OnItemSelectedListener监听

(只是selected)。

 

 二、Gallery的setSelection()方法

         方法原型: public void setSelection (int position)

                 说明:使第position处于选中状态。同时触发OnItemSelectedListener监听事件。

         

       PS: 在listView控件中也存在setSelection()是让该行处于屏幕可见状态,不需要手动滑动定位。第一次进入界面时,

   默认显示第一行,于是乎,我们可以手动设置该方法,ListView在显示时,便可主动定位该item了。

 

 

      准备材料已经上齐,相信通过前面的介绍,您一定对Gallery和ImageSwitcher控件很熟悉了,下面准备大餐!

 

          步骤一:开启一个线程,循环遍历图片集的资源id,并且将id发送至Hanlder对象。

          步骤二:Handler接受到当前图片资源的ID,调用setSelection (id)选中它(该Item selected),继而setSelection()

               触发OnItemSelectedListener 事件,执行目标方法,这样我们的目的就达到了。

 

  下面,给出该Demo,希望能帮助大家更好的理解。

 

   1 、 布局文件 main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:text="@string/hello" />
	<ImageSwitcher android:id="@+id/myimgSwitcher" android:layout_gravity="center"
		android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="20dip"></ImageSwitcher>
	<Gallery android:id="@+id/mygallery" android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:background="#8A2BE2"></Gallery>
</LinearLayout>

 

  2 、主文件 MainActivity.java

package com.lover.qinjun;

import java.lang.reflect.Field;
import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ViewSwitcher.ViewFactory;

public class MainActivity extends Activity implements ViewFactory {
	private static String TAG = "Gallery_Auto";
	private static int MSG_UPDATE = 1;

	private int count_drawble = 0;
	private int cur_index = 0;
	private boolean isalive = true; 、//线程循环运行的条件 
	private ImageSwitcher imgSwitcher;
	private Gallery mgallery;
	// 为Gallery控件设置Adapter
	private ImageAdapter imgAdapter = null;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		imgSwitcher = (ImageSwitcher) findViewById(R.id.myimgSwitcher);
		mgallery = (Gallery) findViewById(R.id.mygallery);
		mgallery.setSpacing(3); //设置图片之间的间隔,如果不加设置 ,图片会叠加。设置为0,表示图片之间无间缝。
		// 设置监听事件 --->当Gallery中的Item处于选中并且被点击触发该事件 
		mgallery.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> arg0, View view,
					int position, long arg3) {
				System.out.println("setOnItemClickListener");
//				imgSwitcher.setBackgroundResource(imgAdapter.getResId(position));
			}
		});
		//当Gallery中的Item处于选中并且被点击触发该事件   ,在该监听事件中,保证图片播放的同步性
		mgallery.setOnItemSelectedListener(new OnItemSelectedListener() {
			@Override
			public void onItemSelected(AdapterView<?> arg0, View view,
					int position, long arg3) {
				 System.out.println("setOnItemSelectedListener");
				 //这儿不能通过setImageResource()设置图片 
				 imgSwitcher.setBackgroundResource(imgAdapter.getResId(position));
			}
			@Override
			public void onNothingSelected(AdapterView<?> arg0) {

			}
		});
		//构建适配器,并且分配
		imgAdapter = new ImageAdapter(this);
		mgallery.setAdapter(imgAdapter);
		count_drawble = imgAdapter.getCount();

		// 利用线程来更新 当前欲显示的图片id, 调用handler来选中当前图片
		new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				while (isalive) {
					cur_index = cur_index % count_drawble;  // 图片区间[0,count_drawable)
					Log.i(TAG, "cur_index"+ cur_index +" count_drawble --"+ count_drawble);
					//msg.arg1 = cur_index 
					Message msg = mhandler.obtainMessage(MSG_UPDATE, cur_index,	0);
					mhandler.sendMessage(msg);
					//更新时间间隔为 2s 
					try {
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					cur_index++;  //放置在Thread.sleep(2000) ;防止mhandler处理消息的同步性,导致cur_index>=count_drawble
				}
			}
		}).start();
	}
	//通过handler来更新主界面  mgallery.setSelection(positon),选中第position的图片,然后调用OnItemSelectedListener监听改变图像
	private Handler mhandler = new Handler() {
		public void handleMessage(Message msg) {
			if (msg.what == MSG_UPDATE) {
				Log.i(TAG, "cur_index"+ cur_index);
				mgallery.setSelection(msg.arg1);
				//UI Thread直接更改图片 ,不利用Gallery.OnItemSelectedListener监听更改
				//imgSwitcher.setBackgroundResource(imgAdapter.getResId(msg.arg1));
			}
		}
	};

	public void onDestroy() {
		super.onDestroy();
		isalive = false;
	}

	@Override
	public View makeView() {   //ImageSwitcher的ViewFactory方法
		// TODO Auto-generated method stub
		ImageView img = new ImageView(this);
		return img;
	}

	// 为Gallery控件提供适配器的类
	class ImageAdapter extends BaseAdapter {
		private Context mcontext;
		private ArrayList<Integer> residList = new ArrayList<Integer>(); // 通过放射机制保存所有图片的id

		public ImageAdapter(Context context) {
			mcontext = context;
			// 反射的可重用性更好
			// R.id在R文件中本质上是一个类,我们通过这个R.id.class.getClass().getDeclaredFields()可以找到它的所有属性
			Field[] residFields = R.drawable.class.getDeclaredFields();
			for (Field residField : residFields) {
				// 例如: public static final int icon=0x7f020000;
				// 它的Field表示为 : name= icon ; field.getInt() = 0x7f020000
				if (!"icon".equals(residField.getName())) {
					int resid;
					try {
						resid = residField.getInt(null);// 找到该属性的值
						residList.add(resid);
					} catch (IllegalArgumentException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IllegalAccessException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}

		@Override
		public int getCount() {
			Log.e(TAG, " " + residList.size());
			return residList.size();
		}

		@Override
		public Object getItem(int position) {
			return residList.get(position);
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}
        //得到该图片的res id
		public int getResId(int position) {
			return residList.get(position);
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ImageView img;
			if (convertView == null) {
				img = new ImageView(mcontext);
				img.setScaleType(ImageView.ScaleType.FIT_XY);
				img.setLayoutParams(new Gallery.LayoutParams(100, 100)); // 图片显示宽和长
				img.setImageResource(residList.get(position));
			} else {
				img = (ImageView) convertView;
			}
			return img;
		}

	}
}

 

  

     主要的工程逻辑如上 ,由于采用了放射机制,直接添加图片资源便可成功运行了。

  

       本文源代码地址为:http://download.youkuaiyun.com/detail/qinjuning/3888134

      
android运用gallery浏览图片并自动滑动 android中运用gallery进行图片浏览,并用定时器实现图片的自动滑动浏览。 立即下载

相关推荐

android实现自动滚动的Gallary控件效果

本文实例讲述了android实现自动滚动的Gallary控件。分享给大家供大家参考。具体如下: import java.util.Timer; import java.util.TimerTask; import android.content.Context; import android.os.Handler; import android.util.AttributeSet; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.wid

Android播放循环播放本地图片

ImageSwitcher方便快捷 &lt;ImageSwitcher android:id="@+id/imagSwitcher" android:layout_width="wrap_content" android:layout_height="wrap_content"/&gt; private ImageSwitcher mImagS...

xiyangyang8110的博客 3107

c语言实现语音检测vad_壹鸽技术科普·智能语音客服系统中的前端语音处理技术...

随着智能客服机器人产业的迅速发展,尤其是伴随着人工智能AI的风潮,预计在2020年我国智能客服市场将达到万亿级别。在智能客服机器人领域中对电话信道语音进行端点检测处理的应用正在不断扩展和深化。目前语音端点检测(Voice Active Detection,简称VAD)的主要任务是准确快速判决出待处理的语音信号有话还是无话,作为自动语音识别(Automatic Speech Recognition,...

weixin_36431018的博客 508

Android 实现GIF播放的几种方式

这4种方式都能很好地在手机上运行,但在小米盒子上出现了不同的问题。Glide本身就是很好用的图片框架,但在小米盒子上出现了运行缓慢的问题,一个3秒的GIF图片需要十几秒的时间才能跑完。没有出现运行缓慢的问题,但刷新闪烁比较严重。Movie能正常显示GIF图片,但如果想只运行一次的情况下,很难显示到最后一帧的图片。最大的问题是版本要求太高,需要Android9.0。

假装你是大灰狼的专栏 1万+

自学PCB思路 | PCB设计零基础入门-小白适用(附详细入门经验分享)

本人大一在实践课上就听说PCB,被虎的一楞一楞的,不过现在回看,发现其实并没有相信的那么难!想着把自己这一路摸索的学习路线分享一下,当时我是一边摸索一边上手,一把鼻涕一把泪的过来的。如果你想搞硬件或者需要搞硬件,下面是我的入门学习过程,希望可以帮到你。目录前言选择一款设计软件好的入门课程掌握抄板元件采购焊板子烙铁头热风枪自己半设计明确设计需求全设计最后我并非什么大佬,也没法自己去教大家如何画板。

自动化小秋葵的博客 1万+

从入门到精通:dirmap 高级 Web 目录扫描实战指南

本文提供了一份从环境搭建到高级配置的dirmap Web目录扫描实战指南。详细解析了工具安装、核心配置文件dirmap.conf的深度调优,包括递归扫描、四种扫描模式(字典、爆破、爬虫、Fuzz)的实战应用,并演示了分阶段资产发现的完整工作流程,帮助安全人员高效发现隐藏目录与敏感文件。

rnn9storyteller的博客 481

android 实现图片和视频混合轮播

最近项目中有图片视频轮播的需求,网上扒拉一下发现效果不怎么好,总有这样那样的不满意,只好挖挖脑子自己写了。 实现思路 viewpager中分类显示imageview和videoview。 直接上代码五个类快速实现 1、实体类 public class Advance { public String path;//路径 我使用的是本地绝对路径 public String type;//类型 1、视频 2、图片 public Advance...

a1466850214的博客 6149

i.MX6ULL系统移植 | 使用busybox制作根文件系统(1.29.0)

一. 下载BusyBox BusyBox是一个继承了大量Linux命令核工具的软件,像常用的ls、cp、mv、ifconfig等命令。一般下载BusyBox的源码,然后配置Busybox,选择自己想要的功能,最后编译即可。 BusyBox在官方可以直接下载:https://www.busybox.net/。目前最新是1.35.0,这里我使用1.29.0版本。 axel https://www.busybox.net/downloads/busybox-1.29.0.tar.bz2 下载之后解压: tar

Mculover666的博客(嵌入式) 1145

(Android)实现图片循环播放

很多时候,我们需要展示在客户端展示图片,而且是动态显示,即不停地自行切换图片。下面我们来看一下具体的实现方法。 首先,我们需要在XML文件中配置一下将要播放图片的控件(main.xml): <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.andro...

a853576648的博客 1292

Yocto系列讲解[入门篇] 2 - 演示运行qemux86-64虚拟机

手把手教大家怎么编译Yocto,并运行一个qemux86虚拟机

fulinux的博客 1万+

UG NX二次开发(C++)-库缺少需要的入口点的原因与解决方案

在UG NX二次开发过程中,有时会遇到形形色色的bug,比如有个读者其采用UG NX二次开发(C++)时,遇到“库缺少需要的入口点”这个问题,看了一下他发给我的源代码,感觉有必要讲一下UG NX二次开发(C++)遇到此类问题的可能情况与解决方法。自然,这是博主的经验之谈,有不足之处还请在评论区讨论。

GimiGimmy 2201

Android利用Drawable Animation实现图片动画播放

关注微信号:javalearns   随时随地学Java 或扫一扫 随时随地学Java (目前只能用在View对象上的动画效果的实现有两种,一种就是上一篇的View Animation,即补间动画,剩下的一种,就是这一篇要介绍的,Drawable Animation,即帧动画。在最新版本的API中,出现了一个更加强大的方式,PropertyAnim

683

车辆重识别/再辨识数据集: Vehicle Re-ID Datasets Collection

车辆数据库 1.VERI-Wild: A Large Dataset and a New Method for Vehicle Re-Identification in the Wild (2019-CVPR) 数据库名称:VERI-Wild 论文:链接 数据库描述: 车辆图像由一个包含174个摄像机,拍摄范围覆盖超过200平方公里的市区CCTV系统拍摄。摄像机是24小时连续拍摄30天,其长时间的...

AI炼丹师 6857

【Android 界面效果7】Android中Gallery和ImageSwitcher同步自动(滚动)播放图片库

本文主要内容是如何让Gallery和ImageSwitcher控件能够同步自动播放图片集 ,看起来较难,然而,实现的方法非常简单, 请跟我慢慢来。总的来说,本文要实现的效果如下图:(截图效果不怎么好)                                  本文是建立在以下两篇bolg上的:                    1、Android入门第十二篇之Galler

Geek马走日 514

置顶必读(1) | 滚雪球学Oracle教程导航帖,带你弯道超车(持续更新中)

什么是数据库管理系统(DBMS),Oracle在行业中的领先地位Oracle数据库的市场竞争与主要应用场景Oracle数据库的核心功能模块与未来技术发展趋势约束的高级应用:主键、唯一性、外键设计与管理表分区、视图、同义词与序列的最佳实践PL/SQL编程的设计哲学,如何高效使用Oracle SQL DeveloperPL/SQL代码调试与优化技巧RAC集群中的高可用性设计,负载均衡与并行查询的配置集群中的缓存一致性管理。

**My Coding Family** 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android Gallery和ImageSwitcher同步自动(滚动)播放图片库

本文主要内容是如何让Gallery和ImageSwitcher控件能够同步自动播放图片集 ,看起来较难,然而,实现的方法非常简单, 请跟我慢慢来。总的来说,本文要实现的效果如下图:(截图效果不怎么好)                        本文是建立在以下两篇bolg上的:                  1、Android入门第十二篇之Gallery             ...

weixin_34258078的博客 202

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

结合图库app开发谈谈Glide库使用心得

-- By Denis.zheng Glide 是 Google 官方推荐的一款图片加载库,使用起来也非常的简单便利,Glide 它帮我们完成了很多很重要,但是却通用的功能,例如:图片的加载压缩、展示、加载图片的内存管理等等。 笔者近期在图库项目中也大量使用了Glide来进行图片的加载展示和处理,关于Glide的常规用法,网络上有很多,在这里就不详细讲,本文主要讲下Gallery3.0

maetelibom的博客 855

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android中Gallery画廊效果(自动滚动)

/** * gallery 图片循环播放,自动播放,无惯性(一次滑动一张图) * * @author Feng * */ public class CycleImageActivity extends Activity { public int[] picture = { R.drawable.gallery1,

专注移动互联 1223
上一篇: Android中Parcel的分析以及使用
下一篇: Android中获取应用程序(包)的信息-----PackageManager的使用(一)
qinjuning
博客等级 码龄18年 5288粉丝 43原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值