本文主要是写关于ImageSwitcher结合Gallery组件如何展示SDCard中的资源图片,相信大家都看过API Demo 中也有关于这个例子的,但API Demo 中的例子是展示工程中Drawable目录下的资源图片,这样调用系统的API比较容易实现,但我们在开发项目过程中,但有些图片还不能完全确定下来,例如需要展示相机拍照的图片,SDCard中某个目录下的资源图片等功能。其实系统中也提供相应的API给我们应用去实现该功能,下面就用异于API Demo中例子方式展示下如何实现该功能。

【1】我们先看下该例子代码的结构图:

下面就直接上各个文件的代码了,不在这里详细解释了,最后会看到实现的效果图的..呵呵

【2】res/layout/main.xml 文件源码:

[html] view
plain
copy

 
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical"
  6. android:background="#55000000" >
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:gravity="center"
  11. android:text="Welcome to Andy.Chen's Blog!"
  12. android:textSize="20sp"/>
  13. <ImageSwitcher
  14. android:id="@+id/switcher"
  15. android:layout_width="wrap_content"
  16. android:layout_height="350dip"
  17. android:layout_alignParentLeft="true"
  18. android:layout_alignParentRight="true" />
  19. <Gallery
  20. android:id="@+id/mygallery"
  21. android:layout_width="fill_parent"
  22. android:layout_height="80dp"
  23. android:layout_alignParentBottom="true"
  24. android:layout_alignParentLeft="true"
  25. android:gravity="center_vertical"
  26. android:spacing="16dp" />
  27. </LinearLayout>

【3】res/values/attrs.xml 文件源码:

[html] view
plain
copy

 
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <declare-styleable name="Gallery">
  4. <attr name="android:galleryItemBackground" />
  5. </declare-styleable>
  6. </resources>

【4】ImageSwitcherAndGalleryDemoActivity.java 源码:(这个类的源码比较多,希望大家耐心看)

[html] view
plain
copy

 
  1. package com.andyidea.imagedemo;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import android.app.Activity;
  6. import android.content.Context;
  7. import android.content.res.TypedArray;
  8. import android.graphics.Bitmap;
  9. import android.graphics.BitmapFactory;
  10. import android.net.Uri;
  11. import android.os.Bundle;
  12. import android.os.Environment;
  13. import android.util.Log;
  14. import android.view.View;
  15. import android.view.View.OnClickListener;
  16. import android.view.ViewGroup;
  17. import android.view.animation.AnimationUtils;
  18. import android.widget.AdapterView;
  19. import android.widget.AdapterView.OnItemClickListener;
  20. import android.widget.AdapterView.OnItemSelectedListener;
  21. import android.widget.BaseAdapter;
  22. import android.widget.Gallery;
  23. import android.widget.Gallery.LayoutParams;
  24. import android.widget.ImageSwitcher;
  25. import android.widget.ImageView;
  26. import android.widget.Toast;
  27. import android.widget.ViewSwitcher.ViewFactory;
  28. /**
  29. * ImageSwitcher和Gallery如何展示SD卡中的资源图片
  30. * @author Andy.Chen
  31. * @email:Chenjunjun.ZJ@gmail.com
  32. */
  33. public class ImageSwitcherAndGalleryDemoActivity extends Activity
  34. implements OnItemSelectedListener,ViewFactory{
  35. private List<String> imagePathList;
  36. private String[] list;
  37. private ImageSwitcher mSwitcher;
  38. private Gallery mGallery;
  39. /** Called when the activity is first created. */
  40. @Override
  41. public void onCreate(Bundle savedInstanceState) {
  42. super.onCreate(savedInstanceState);
  43. setContentView(R.layout.main);
  44. imagePathList=getImagePathFromSD();
  45. list = imagePathList.toArray(new String[imagePathList.size()]);
  46. /* 设定Switcher */
  47. mSwitcher = (ImageSwitcher) findViewById(R.id.switcher);
  48. mSwitcher.setFactory(this);
  49. /* 设定载入Switcher的模式 */
  50. mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,
  51. android.R.anim.fade_in));
  52. /* 设定输出Switcher的模式 */
  53. mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,
  54. android.R.anim.fade_out));
  55. mSwitcher.setOnClickListener(new OnClickListener() {
  56. public void onClick(View v) {
  57. Toast.makeText(ImageSwitcherAndGalleryDemoActivity.this, "你点击了ImageSwitch上的图片",
  58. Toast.LENGTH_SHORT).show();
  59. }
  60. });
  61. mGallery = (Gallery) findViewById(R.id.mygallery);
  62. /* 新增几ImageAdapter并设定给Gallery对象 */
  63. mGallery.setAdapter(new ImageAdapter(this, getImagePathFromSD()));
  64. mGallery.setOnItemSelectedListener(this);
  65. /* 设定一个itemclickListener事件 */
  66. mGallery.setOnItemClickListener(new OnItemClickListener() {
  67. public void onItemClick(AdapterView<?> parent, View v,
  68. int position, long id) {
  69. Toast.makeText(ImageSwitcherAndGalleryDemoActivity.this, "你点击了Gallery上的图片",
  70. Toast.LENGTH_SHORT).show();
  71. }
  72. });
  73. }
  74. /** 从SD卡中获取资源图片的路径 */
  75. private List<String> getImagePathFromSD() {
  76. /* 设定目前所在路径 */
  77. List<String> it = new ArrayList<String>();
  78. //根据自己的需求读取SDCard中的资源图片的路径
  79. String imagePath = Environment.getExternalStorageDirectory().toString()+"/hknational/image";
  80. File mFile = new File(imagePath);
  81. File[] files = mFile.listFiles();
  82. /* 将所有文件存入ArrayList中 */
  83. for (int i = 0; i < files.length; i++) {
  84. File file = files[i];
  85. if (checkIsImageFile(file.getPath()))
  86. it.add(file.getPath());
  87. }
  88. return it;
  89. }
  90. /** 判断是否相应的图片格式  */
  91. private boolean checkIsImageFile(String fName) {
  92. boolean isImageFormat;
  93. /* 取得扩展名 */
  94. String end = fName
  95. .substring(fName.lastIndexOf(".") + 1, fName.length())
  96. .toLowerCase();
  97. /* 按扩展名的类型决定MimeType */
  98. if (end.equals("jpg") || end.equals("gif") || end.equals("png")
  99. || end.equals("jpeg") || end.equals("bmp")) {
  100. isImageFormat = true;
  101. } else {
  102. isImageFormat = false;
  103. }
  104. return isImageFormat;
  105. }
  106. /* 改写BaseAdapter自定义一ImageAdapter class */
  107. public class ImageAdapter extends BaseAdapter {
  108. /* 声明变量 */
  109. int mGalleryItemBackground;
  110. private Context mContext;
  111. private List<String> lis;
  112. /* ImageAdapter的构造符 */
  113. public ImageAdapter(Context c, List<String> li) {
  114. mContext = c;
  115. lis = li;
  116. /*
  117. * 使用res/values/attrs.xml中的<declare-styleable>定义 的Gallery属性.
  118. */
  119. TypedArray mTypeArray = obtainStyledAttributes(R.styleable.Gallery);
  120. /* 取得Gallery属性的Index id */
  121. mGalleryItemBackground = mTypeArray.getResourceId(
  122. R.styleable.Gallery_android_galleryItemBackground, 0);
  123. /* 让对象的styleable属性能够反复使用 */
  124. mTypeArray.recycle();
  125. }
  126. /* 重写的方法getCount,传回图片数目 */
  127. public int getCount() {
  128. return lis.size();
  129. }
  130. /* 重写的方法getItem,传回position */
  131. public Object getItem(int position) {
  132. return position;
  133. }
  134. /* 重写的方法getItemId,传并position */
  135. public long getItemId(int position) {
  136. return position;
  137. }
  138. /* 重写方法getView,传并几View对象 */
  139. public View getView(int position, View convertView, ViewGroup parent) {
  140. /* 产生ImageView对象 */
  141. ImageView i = new ImageView(mContext);
  142. /* 设定图片给imageView对象 */
  143. Bitmap bm = BitmapFactory.decodeFile(lis.get(position).toString());
  144. i.setImageBitmap(bm);
  145. /* 重新设定图片的宽高 */
  146. i.setScaleType(ImageView.ScaleType.FIT_XY);
  147. /* 重新设定Layout的宽高 */
  148. i.setLayoutParams(new Gallery.LayoutParams(136, 88));
  149. /* 设定Gallery背景图 */
  150. i.setBackgroundResource(mGalleryItemBackground);
  151. /* 传回imageView对象 */
  152. return i;
  153. }
  154. }
  155. @Override
  156. public View makeView() {
  157. ImageView iv = new ImageView(this);
  158. iv.setBackgroundColor(0xFF000000);
  159. iv.setScaleType(ImageView.ScaleType.FIT_CENTER);
  160. iv.setLayoutParams(new ImageSwitcher.LayoutParams(
  161. LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
  162. return iv;
  163. }
  164. @Override
  165. public void onItemSelected(AdapterView<?> parent, View view, int position,
  166. long id) {
  167. // TODO Auto-generated method stub
  168. String photoURL = list[position];
  169. Log.i("A", String.valueOf(position));
  170. mSwitcher.setImageURI(Uri.parse(photoURL));
  171. }
  172. @Override
  173. public void onNothingSelected(AdapterView<?> parent) {
  174. // TODO Auto-generated method stub
  175. }
  176. }

【5】程序运行效果图如下:

        

至此大功告成了!

【Android 界面效果30】Android中ImageSwitcher结合Gallery展示SD卡中的资源图片的更多相关文章

  1. 转-Android 之 使用File类在SD卡中读取数据文件

    如果需要在程序中使用sdcard进行数据的存储,那么需要在AndroidMainfset.xml文件中 进行权限的配置: Java代码:   <!-- 在sd中创建和删除文件的权限 --> ...

  2. Android 5.1.1在外置SD卡中创建文件夹

    Android 4.4之后WRITE_MEDIA_STORAGE 权限仅提供给系统应用,不再授予第三方App,WRITE_EXTERNAL_STORAGE 权限,仅仅用于授权用户写 primary e ...

  3. Android中使用SQLiteOpenHelper管理SD卡中的数据库

    使用Android中自带的SQLiteOpenHelper可以完成数据库的创建与管理,但有两点局限: (1)数据库创建在内存卡中,大小受限,创建位置位于/data/data/应用程序名/databas ...

  4. android 读取sd卡中的图片

    一.获取读取SD卡的权限 <!--在SDCard中创建与删除文件权限  -->    <uses-permission android:name="android.perm ...

  5. Android 将文件保存到SD卡中

    ①写文件到sd卡中需要获得权限,在AndroidManifest.xml中添加如下权限: <uses-permission android:name="android.permissi ...

  6. android保存文件到SD卡中

    想把文件保存到SD卡中,一定要知道SD卡的路径,有人说可以用File explore来查看,这种方法不太好,因为随着android版本的升级,SD卡的路径可能会发生改变.在1.6的时候SD的路径是/s ...

  7. Android获取SD卡中选中图片的路径(URL)

    最近在做一个图片上传的功能,需要提供上传图片在SD卡中的路径,在网上看了些例子,改改调试成功,代码很简单.其布局文件如下: [html]  view plain copy   <?xml ver ...

  8. android打开存储卡(TF卡\SD卡)中的sqlite文件

    android的SDK直接支持sqlite3的API.   打开SD卡上面的sqlite数据库,不需要SQLiteOpenHelper的继承类.只需要,SQLiteDatabase中的一些静态方法.如 ...

  9. Android中播放本地SD卡中歌曲须要的加入的权限

    使用MediaPlayer播放本地Mp3文件时.须要注意的訪问路径的问题以及訪问权限的问题. 1.訪问路径:/storage/emulated/0 此路径即为手机的根路径,能够通过下载ES文件浏览器软 ...

随机推荐

  1. 修改hosts文件解决OneDrive被墙的问题

    增加如下内容就可以了.如果不知道修改hosts文件的具体方法请自行百度. 134.170.108.26 onedrive.live.com 134.170.108.152 skyapi.onedriv ...

  2. Codeforces 118 D. Caesar's Legions (dp)

    题目链接:http://codeforces.com/contest/118/problem/D 有n个步兵和m个骑兵要排成一排,其中连续的步兵不能超过k1个,连续的骑兵不能超过k2个. dp[i][ ...

  3. HDU1002大数加法

    大数加法 c++版: #include <map> #include <set> #include <stack> #include <queue> # ...

  4. HNC-全局联想脉络

    全局联想脉络—语义块 和句类 一个语义块包含 核心部分 和说明部分. 语义块分为: 主语义块:有 4 种:特征E.作用者A.对象B.内容C 辅语义块:有 7 种:条件.手段.工具.途径.参照.因.果. ...

  5. myeclipse中working Sets

    最近myeclipse中的项目太多了,看起来老不爽,查找还不方便,发现这个working Sets还是挺好用的 接下来的步骤,太简单了有木有,就不写了         0.0

  6. js 如何验证字符串里是否包含汉字?

    1.用正则表达式判断<input  type="text" id="name" placeholder="请输入用户名" value= ...

  7. java正则表达式语法详解及其使用代码实例

    原文地址 译者序(下载代码) 正则表达式善于处理文本,对匹配.搜索和替换等操作都有意想不到的作用.正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率. ...

  8. git filename to long问题解决

    在.git/config 下面编辑 [core] longpaths = true

  9. 解决Unable to connect to a repository at URL 禁止访问 (forbidden)

    连接SVN报如下错误. Unable to connect to a repository at URL 禁止访问 (forbidden) 1.         右键点击本地副本,TortoiseSV ...

  10. C#利用SharpZipLib解压或压缩文件夹实例操作

    最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享. 这里主要解决文件夹包含文件夹的解压缩问题. )下载SharpZipLib.dll,在http://www.icsharpcode. ...