Android入门第十三篇之Gallery + ImageSwitcher

news/2024/11/9 16:20:03 标签: Android, XML, OS, UP

上次讲了如何使用Gallery控件,这次就讲Gallery 与ImageSwitcher的结合使用,本文实现一个简单的浏览图片的功能。先贴出程序运行截图:

除了Gallery可以拖拉切换图片,我在ImageSwitcher控件加入了setOnTouchListener事件实现,使得ImageSwitcher也可以在拖拉中切换图片。本例子依然使用JAVA的反射机制来自动读取资源中的图片。

 

main.xml的源码如下:

view plain copy to clipboard print ?
  1. <? xml   version = "1.0"   encoding = "utf-8" ?>   
  2. < RelativeLayout   xmlns:android = "http://schemas.android.com/apk/res/android"    
  3.     android:layout_width = "match_parent"    
  4.     android:layout_height = "match_parent" >    
  5.       
  6.     < ImageSwitcher   android:id = "@+id/switcher"   
  7.         android:layout_width = "match_parent"   android:layout_height = "match_parent" />   
  8.       
  9.     < Gallery   android:id = "@+id/gallery"   
  10.         android:background = "#55000000"   
  11.         android:layout_width = "match_parent"   
  12.         android:layout_alignParentBottom = "true"   
  13.         android:layout_alignParentLeft = "true"   
  14.           
  15.         android:gravity = "center_vertical"   
  16.         android:spacing = "16dp"   android:layout_height = "100dp" />   
  17. </ RelativeLayout >   
  18.      
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageSwitcher android:id="@+id/switcher" android:layout_width="match_parent" android:layout_height="match_parent"/> <Gallery android:id="@+id/gallery" android:background="#55000000" android:layout_width="match_parent" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:gravity="center_vertical" android:spacing="16dp" android:layout_height="100dp"/> </RelativeLayout>

 

程序的源码如下:

view plain copy to clipboard print ?
  1. package  com.testImageView;  
  2. import  java.lang.reflect.Field;  
  3. import  java.util.ArrayList;  
  4. import  android.app.Activity;  
  5. import  android.content.Context;  
  6. import  android.os.Bundle;  
  7. import  android.view.MotionEvent;  
  8. import  android.view.View;  
  9. import  android.view.View.OnTouchListener;  
  10. import  android.view.ViewGroup;  
  11. import  android.view.animation.AnimationUtils;  
  12. import  android.widget.AdapterView;  
  13. import  android.widget.BaseAdapter;  
  14. import  android.widget.Gallery;  
  15. import  android.widget.ImageSwitcher;  
  16. import  android.widget.ImageView;  
  17. import  android.widget.AdapterView.OnItemSelectedListener;  
  18. import  android.widget.Gallery.LayoutParams;  
  19. import  android.widget.ViewSwitcher.ViewFactory;  
  20. public   class  testImageView  extends  Activity  implements  ViewFactory {  
  21.     private  ImageSwitcher is;  
  22.     private  Gallery gallery;  
  23.     private   int  downX,upX;  
  24.     private  ArrayList<Integer> imgList= new  ArrayList<Integer>(); //图像ID   
  25.       
  26.     @Override   
  27.     protected   void  onCreate(Bundle savedInstanceState) {  
  28.         // TODO Auto-generated method stub   
  29.         super .onCreate(savedInstanceState);  
  30.         setContentView(R.layout.main);  
  31.         //用反射机制来获取资源中的图片ID   
  32.         Field[] fields = R.drawable.class .getDeclaredFields();  
  33.         for  (Field field : fields)  
  34.         {  
  35.             if  (! "icon" .equals(field.getName())) //除了icon之外的图片   
  36.             {     
  37.                 int  index =  0 ;  
  38.                 try  {  
  39.                     index = field.getInt(R.drawable.class );  
  40.                 } catch  (IllegalArgumentException e) {  
  41.                     // TODO Auto-generated catch block   
  42.                     e.printStackTrace();  
  43.                 } catch  (IllegalAccessException e) {  
  44.                     // TODO Auto-generated catch block   
  45.                     e.printStackTrace();  
  46.                 }  
  47.                 //保存图片ID   
  48.                 imgList.add(index);  
  49.             }  
  50.         }  
  51.           
  52.         //设置ImageSwitcher控件   
  53.         is = (ImageSwitcher) findViewById(R.id.switcher);  
  54.         is.setFactory(this );  
  55.         is.setInAnimation(AnimationUtils.loadAnimation(this ,  
  56.                 android.R.anim.fade_in));  
  57.         is.setOutAnimation(AnimationUtils.loadAnimation(this ,  
  58.                 android.R.anim.fade_out));  
  59.         is.setOnTouchListener(new  OnTouchListener(){  
  60.             /*  
  61.              * 在ImageSwitcher控件上滑动可以切换图片  
  62.              */   
  63.             @Override   
  64.             public   boolean  onTouch(View v, MotionEvent event) {  
  65.                 if (event.getAction()==MotionEvent.ACTION_DOWN)  
  66.                 {  
  67.                     downX=(int ) event.getX(); //取得按下时的坐标   
  68.                     return   true ;  
  69.                 }  
  70.                 else   if (event.getAction()==MotionEvent.ACTION_UP)  
  71.                 {  
  72.                     upX=(int ) event.getX(); //取得松开时的坐标   
  73.                     int  index= 0 ;  
  74.                     if (upX-downX> 100 ) //从左拖到右,即看前一张   
  75.                     {  
  76.                         //如果是第一,则去到尾部   
  77.                         if (gallery.getSelectedItemPosition()== 0 )  
  78.                            index=gallery.getCount()-1 ;  
  79.                         else   
  80.                             index=gallery.getSelectedItemPosition()-1 ;  
  81.                     }  
  82.                     else   if (downX-upX> 100 ) //从右拖到左,即看后一张   
  83.                     {  
  84.                         //如果是最后,则去到第一   
  85.                         if (gallery.getSelectedItemPosition()==(gallery.getCount()- 1 ))  
  86.                             index=0 ;  
  87.                         else   
  88.                             index=gallery.getSelectedItemPosition()+1 ;  
  89.                     }  
  90.                     //改变gallery图片所选,自动触发ImageSwitcher的setOnItemSelectedListener   
  91.                     gallery.setSelection(index, true );  
  92.                     return   true ;  
  93.                 }  
  94.                 return   false ;  
  95.             }  
  96.               
  97.         });  
  98.           
  99.         //设置gallery控件   
  100.         gallery = (Gallery) findViewById(R.id.gallery);  
  101.         gallery.setAdapter(new  ImageAdapter( this ));  
  102.         gallery.setOnItemSelectedListener(new  OnItemSelectedListener(){  
  103.             @Override   
  104.             public   void  onItemSelected(AdapterView<?> arg0, View arg1,  
  105.                     int  position,  long  arg3) {  
  106.                 is.setImageResource(imgList.get(position));  
  107.             }  
  108.             @Override   
  109.             public   void  onNothingSelected(AdapterView<?> arg0) {  
  110.                 // TODO Auto-generated method stub   
  111.             }  
  112.               
  113.         });  
  114.     }  
  115.     //设置ImgaeSwitcher   
  116.     @Override   
  117.     public  View makeView() {  
  118.         ImageView i = new  ImageView( this );  
  119.         i.setBackgroundColor(0xFF000000 );  
  120.         i.setScaleType(ImageView.ScaleType.CENTER);//居中   
  121.         i.setLayoutParams(new  ImageSwitcher.LayoutParams( //自适应图片大小   
  122.                 LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));  
  123.         return  i;  
  124.     }  
  125.     public   class  ImageAdapter  extends  BaseAdapter {  
  126.         public  ImageAdapter(Context c) {  
  127.             mContext = c;  
  128.         }  
  129.         public   int  getCount() {  
  130.             return  imgList.size();  
  131.         }  
  132.         public  Object getItem( int  position) {  
  133.             return  position;  
  134.         }  
  135.         public   long  getItemId( int  position) {  
  136.             return  position;  
  137.         }  
  138.         public  View getView( int  position, View convertView, ViewGroup parent) {  
  139.             ImageView i = new  ImageView(mContext);  
  140.             i.setImageResource(imgList.get(position));  
  141.             i.setAdjustViewBounds(true );  
  142.             i.setLayoutParams(new  Gallery.LayoutParams(  
  143.                     LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));  
  144.             return  i;  
  145.         }  
  146.         private  Context mContext;  
  147.     }  
  148.   


http://www.niftyadmin.cn/n/1003464.html

相关文章

手把手教你安装mysql主从复制

现状描述今天个人办公电脑更换好后&#xff0c;也陆陆续续的进行数据拷贝的工作。上午下载好VMwareworkstation后&#xff0c;就用光盘安装了下Centos6.2&#xff0c;具体安装步骤这里就不一一赘述了。然后考虑到以后会用好几台做集群实验和测试&#xff0c;安装好后&#xff0…

【深度强化学习】6. Q-Learning技巧及其改进方案

【DataWhale打卡】第四次任务&#xff0c;主要是重新学习一下李宏毅的Q-learning部分的知识&#xff0c;推导很多。之前看的时候就是简单过了一遍&#xff0c;很多细节没有清楚。这篇笔记包括了李宏毅深度强化学习三个视频长度的内容。 文章目录1. 概念/解释2. Value Function3…

WIKIOI – 1012 最大公约数和最小公倍数问题

题目描述 Description 输入二个正整数x0,y0(2<x0<100000,2<y0<1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整数 2.要求P,Q以x0为最大公约数,以y0为最小公倍数. 试求:满足条件的所有可能的两个正整数的个数. 输入描述 Input Description 二个正整数x0,y…

Android MediaScanner 详尽分析

MediaScanner分析 一 MediaScannerService 多媒体扫描是从MediaScannerService开始的。这是一个单独的package。位于 packages/providers/MediaProvider&#xff1a;含以下java文件 l MediaProvider.java l MediaScannerReceiver.java l MediaScannerService.java l Med…

Struts2漏洞分析之Ognl表达式特性引发的新思路

一、摘要在Ognl表达式中&#xff0c;会将被括号“()”包含的变量内容当做Ognl表达式执行。Ognl表达式的这一特性&#xff0c;引发出一种新的***思路。通过将恶意代码存储到变量中&#xff0c;然后在调用Ognl表达式的函数中使用这个变量来执行恶意的代码&#xff0c;从而实现***…

【深度强化学习】7. 稀疏奖励和模仿学习

【DataWhale打卡】李宏毅老师视频中的最后两部分&#xff0c;sparse reward和imitation learning。 文章目录1. Sparse Reward1.1 Reward Shaping1.2 Curriculum Learning1.3 Hierarchical RL2. Imitation Learning2.1 Behavior Cloning2.2 Inverse Reinforcement Learning3. 参…

ftp文件传输协议及基于openssl对ftp进行认证功能

一、linux中常见的三种文件服务 FTP&#xff1a; File Transfer Protocol 文件传输协议 NFS&#xff1a;Network File System&#xff08;RPC&#xff1a;Remote Procedure Call 远程过程调用&#xff09; 网络文件系统 Samba&#xff1a;CIFS/SMB ftp主要监听在tcp的21号端口&…

简明Python3教程 5.第一步

介绍 我们现在来看看如何在Python中运行传统的”Hello world”程序。这会教你如何写、保存以及运行Python程序。 有两种办法来运行您的Python程序——使用交互式的解释器提示符或者源代码文件。我们现在来分别看一看这两种方法。 使用解释器提示符 在命令提示符中输入python来…