由于最近小马要使用下Gallery与ImageSwitch实现照片的预览功能,特此找个时间写了个小DEMO测试了下,完整的哦,直接开始,今天好激动呢,吼吼,先分段讲下,最后贴出源代码,看代码之前先往你的模拟器“/sdcard/”下PUSH几张图片哦,作为工程中使用的图片资源,看代码:
- package com.xiaoma.www;
- import android.app.Activity;
- import android.os.Bundle;
- import java.io.File;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.Activity;
- import android.content.Context;
- import android.content.res.Resources;
- import android.content.res.TypedArray;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.net.Uri;
- import android.os.Bundle;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.View;
- import android.view.ViewGroup;
- import android.view.WindowManager;
- import android.view.View.OnClickListener;
- import android.view.animation.Animation;
- import android.view.animation.AnimationUtils;
- import android.widget.AdapterView;
- import android.widget.BaseAdapter;
- import android.widget.Gallery;
- import android.widget.ImageSwitcher;
- import android.widget.ImageView;
- import android.widget.Toast;
- import android.widget.ViewSwitcher;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.Gallery.LayoutParams;
- /**
- * @Title: GalleryAddSDPhotoActivity.java
- * @Package com.xiaoma.www
- * @Description: Gallery与ImageSwitch测试
- * @author MZH
- * @version V2.2
- */
- public class GalleryAddSDPhotoActivity extends Activity implements
- AdapterView.OnItemSelectedListener, ViewSwitcher.ViewFactory {
- private List<String> ImageList;
- private String[] list;
- private ImageSwitcher mSwitcher;
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //去掉状态栏,全屏显示
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
- setContentView(R.layout.main);
- /**
- * 取得SD卡上的图片文件,并将图片完整路径保存到ImageList中,是完整路径哦
- */
- ImageList = getInSDPhoto();
- /**
- * 将取得的路径集合ImageList转换成数组并存入list中
- * List集合中的toArray()方法经常用在集合与数组转换的,吼吼
- */
- list = ImageList.toArray(new String[ImageList.size()]);
- // 设定Switcher
- mSwitcher = (ImageSwitcher) findViewById(R.id.switcher);
- mSwitcher.setFactory(this);
- /**
- * 设定载入Switcher的模式
- * AnimationUtils此类小马我不知道是干吗的,查了源码,用工具,大致意思如果下:
- * Defines common utilities for working with animations
- * 即:定义动画通用的工具类,不懂了一个词一个词的查
- *
- * loadAnimation()此方法见名字就知道是什么意思了
- * Loads an {@link Animation} object from a resource
- * 通过 资源文件载入
- */
- mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,
- //下面这个参数小马看了下源码,他们把这个int值转化成了十六进制载入?小马不明白为这样一定要
- //转换成十六进制啊?看到小马问题的朋友如果知道话请指点一下,小马先谢过
- android.R.anim.fade_in));
- /**
- * 设定输出Switcher的模式
- */
- mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,
- android.R.anim.fade_out));
- mSwitcher.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- Toast.makeText(GalleryAddSDPhotoActivity.this,
- "点击了ImageSwitch中的图片",
- Toast.LENGTH_SHORT).show();
- }
- });
- Gallery g = (Gallery) findViewById(R.id.mygallery);
- /**
- * 添加ImageAdapter并设定给Gallery对象
- */
- g.setAdapter(new ImageAdapter(this, getInSDPhoto()));
- /**
- * 监听器设置
- */
- g.setOnItemSelectedListener(this);
- /* 设定一个itemclickListener事件 */
- g.setOnItemClickListener(new OnItemClickListener() {
- public void onItemClick(AdapterView<?> parent, View v,
- int position, long id) {
- Toast.makeText(GalleryAddSDPhotoActivity.this,
- //注意下小细节 ,position+1如果不用括号的话,定位就错啦,朋友可以取掉试下
- "点击了Gallery画廊中的第 "+(position+1)+"张图片",
- Toast.LENGTH_SHORT).show();
- }
- });
- }
- /**
- * 获取SD卡中图片文件的方法实现
- * @return
- */
- private List<String> getInSDPhoto() {
- /**
- * 设定图片所在路径
- */
- List<String> it = new ArrayList<String>();
- /**
- * 此处小马直接把图片push进了SD卡根路径下,如果朋友们要放到其它文件下,
- * 可先判断下SD卡存在时将路径指定到自己的路径下就可以了,试试吧,吼吼
- */
- File f = new File("/sdcard/");
- File[] files = f.listFiles();
- /**
- * 将所有文件存入ArrayList中,这个地方存的还是文件路径哦
- */
- for (int i = 0; i < files.length; i++) {
- File file = files[i];
- if (getAllImage(file.getPath()))
- it.add(file.getPath());
- }
- return it;
- }
- /**
- * 获取所有图片文件的实现
- * @param fName
- * @return
- */
- private boolean getAllImage(String fName) {
- boolean re;
- /* 取得扩展名 */
- String end = fName
- .substring(fName.lastIndexOf(".") + 1, fName.length())
- .toLowerCase();
- /* 按扩展名的类型决定MimeType */
- if (end.equals("jpg") || end.equals("gif") || end.equals("png")
- || end.equals("jpeg") || end.equals("bmp")) {
- re = true;
- } else {
- re = false;
- }
- return re;
- }
- /**
- * 改写BaseAdapter自定义一ImageAdapter class
- * @Title: ImageAdapter.java
- * @Package com.xiaoma.www
- * @Description: Gallery 适配器实现
- * @author MZH
- * @version V2.2
- */
- //适配器中常用的方法小马就不加注释了
- public class ImageAdapter extends BaseAdapter {
- /* 声明变量 */
- int mGalleryItemBackground;
- private Context mContext;
- private List<String> lis;
- /**
- * ImageAdapter的构造符
- * @param c
- * @param list
- */
- public ImageAdapter(Context context, List<String> list) {
- mContext = context;
- lis = list;
- /*
- * 使用styleable.xml设置Gallery属性
- * 下面TypedArray类小马也不知道是什么,眼馋跟进去看了下,贴下源码
- * /**
- * Container for an array of values that were retrieved with
- * {@link Resources.Theme#obtainStyledAttributes(AttributeSet,
- * int[], int, int)}
- * or {@link Resources#obtainAttributes}. Be
- * sure to call {@link #recycle} when done with them.
- *
- * The indices used to retrieve values from this structure correspond to
- * the positions of the attributes given to obtainStyledAttributes.
- * 看了下,大体意思这句就讲清楚了: Container for an array of values that were retrieved
- * 是说:存放从数组中读取出的值(而且这些值可以反复使用的哦)的容器
- */
- TypedArray a = obtainStyledAttributes(R.styleable.Gallery);
- mGalleryItemBackground = a.getResourceId(
- R.styleable.Gallery_android_galleryItemBackground, 0);
- //让对象的styleable属性能够反复使用
- //源码中:Be sure to call {@link #recycle} when done with them.
- a.recycle();
- }
- public int getCount() {
- return lis.size();
- }
- public Object getItem(int position) {
- return position;
- }
- public long getItemId(int position) {
- return position;
- }
- /* 几定要重写的方法getView,传并几View对象 */
- public View getView(int position, View convertView, ViewGroup parent) {
- ImageView i = new ImageView(mContext);
- //使用图片工厂载入并设置图片
- Bitmap bm = BitmapFactory.decodeFile(lis.get(position).toString());
- i.setImageBitmap(bm);
- /**
- * 设定ImageView宽高,跟了下FIX_XY,竟然是枚举,好激动,小马好久没看到枚举啦
- * 试了下ScaleType中除FIT_XY以外的其它选项,效果图分别如果下:
- */
- i.setScaleType(ImageView.ScaleType.FIT_XY);
贴图小马就一次性贴出来,这样容易看出它们之间的差别:
FIT_XY效果:
FIT_START效果:
FIT_END效果:
FIT_CENTER效果:
CENTER_INSIDE效果:
CENTER_CROP效果:
CENTER效果:
下面来看下半部分代码:
- //重新设定Layout的宽高
- /**
- * 这个地方小马有个疑问,我设置Gallery全屏的时候画面会拉伸,
- * 有什么办法可以不让他拉伸还可以让它全屏啊?指点下小马,谢谢
- * i.setLayoutParams( new Gallery.LayoutParams(
- * WindowManager.LayoutParams.MATCH_PARENT,
- * WindowManager.LayoutParams.MATCH_PARENT));
- */
- i.setLayoutParams(new Gallery.LayoutParams(136, 88));
- // 设定Gallery背景图
- i.setBackgroundResource(mGalleryItemBackground);
- // 传回imageView对象
- return i;
- }
- }
- public void onItemSelected(AdapterView<?> parent, View view, int position,
- long id) {
- String photoURL = list[position];
- Log.i("XiaoMa", String.valueOf(position));
- mSwitcher.setImageURI(Uri.parse(photoURL));
- }
- public void onNothingSelected(AdapterView<?> parent) {
- }
- /**
- * 实现ViewSwitcher.ViewFactory接口必须实现的方法
- */
- public View makeView() {
- ImageView i = new ImageView(this);
- i.setBackgroundColor(0xFF000000);
- i.setScaleType(ImageView.ScaleType.FIT_CENTER);
- i.setLayoutParams(new ImageSwitcher.LayoutParams(
- LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
- return i;
- }
- }
为供朋友们学习交流,如果觉得在这儿看代码不太方便的话,可以下载小马上传的附件,里面是所有代码,在这篇文章中如果看到有地方小马有错误的,请直接批评指正,还有小马在中间提的问题,知情人士请指点下小马,先谢谢啦,吼吼。。O_O
附件:http://down.51cto.com/data/2359572
本文转自华华世界 51CTO博客,原文链接:http://blog.51cto.com/mzh3344258/752580,如需转载请自行联系原作者