android图片浏览器(一)——ImageSwitcher和Gallery

主要实现的功能就是浏览图片。

用到的控件:ImageSwitcher和Gallery。


这种简单的图片浏览器google一下有很多,我也是参考别人上写的。在搜索的过程中,我发现了一个比较有意思的事情,就是很多博客里面的代码基本上都是相同的,而且运行起来都有错误。呵呵,看来很多童鞋都是直接copy过来,并没有运行,甚至没有去仔细看代码。

我也是参考别人的博客写的,并且把错误修正了,然后按照自己的一些想法对它做了一些优化:

1、网上的代码基本都是加载进来显示这样的页面:



下面的Gallery不对称。我做了优化,加载的时候是把左边黑色的空白也铺上了。如下:




2、可能这个地方不算是优化,我看别人的程序都是在滑动的时候,ImageSwitcher会不断的变化,会不会很消耗资源?(只是换个方法实现变化而已,所以算不得优化)。我改成了只有停下来,你点击那一张,ImageSwitcher才会变化。


3、这个地方个人觉得还有有必要改一下的,我是参考了Listview的机制,实现的功能都是让图片无限滑动,

这个是在Adapter中这么写的:

		public int getCount()
		{
			return Integer.MAX_VALUE;
		}

让它最大值是最大整数,基本上是滑不到尽头的。

这个是很正常的功能,但是每滑动一次就会

ImageView imageview = new ImageView(mContext);
这样会new无数了ImageView对象,完全是没必要的。


我们可以这样,反正是循环么,有多少个图片,就new多少个ImageView就行了。

这个是参考Listview的机制,Listview在往下滑动的时候,item是不断重用的。


附上源码:

package net.blogjava.mobile;

import java.util.HashMap;

import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Gallery.LayoutParams;
import android.widget.ViewSwitcher.ViewFactory;

public class Main extends Activity implements OnItemSelectedListener, ViewFactory, OnItemClickListener
{
	private Gallery gallery;
	private ImageSwitcher imageSwitcher;
	private ImageAdapter imageAdapter;
	private int mCurrentPos = -1;// 当前的item
	private HashMap<Integer, ImageView> mViewMap;

	private int[] resIds = new int[]
		{R.drawable.item1 ,R.drawable.item2 ,R.drawable.item3 ,R.drawable.item4 ,R.drawable.item5 ,R.drawable.item6 ,R.drawable.item7 ,R.drawable.item8 ,R.drawable.item9 ,R.drawable.item10 ,R.drawable.item11 ,R.drawable.item12 ,R.drawable.item13 ,R.drawable.item14 ,R.drawable.item15};

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		gallery = (Gallery) findViewById(R.id.gallery);
		imageAdapter = new ImageAdapter(this, resIds.length);
		gallery.setAdapter(imageAdapter);
		gallery.setOnItemSelectedListener(this);
		gallery.setSelection(1);// 设置一加载Activity就显示的图片为第二张

		gallery.setOnItemClickListener(this);

		imageSwitcher = (ImageSwitcher) findViewById(R.id.imageswitcher);
		imageSwitcher.setFactory(this);

		// 设置动画效果 淡入淡出
		imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
		imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
	}

	public class ImageAdapter extends BaseAdapter
	{
		int mGalleryItemBackground;
		private Context mContext;
		private int mCount;// 一共多少个item

		public ImageAdapter(Context context, int count)
		{
			mContext = context;
			mCount = count;
			mViewMap = new HashMap<Integer, ImageView>(count);
			TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);
			// 设置边框的样式
			mGalleryItemBackground = typedArray.getResourceId(R.styleable.Gallery_android_galleryItemBackground, 0);
		}

		public int getCount()
		{
			return Integer.MAX_VALUE;
		}

		public Object getItem(int position)
		{
			return position;
		}

		public long getItemId(int position)
		{
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent)
		{
			ImageView imageview = mViewMap.get(position % mCount);
			if (imageview == null)
			{
				imageview = new ImageView(mContext);
				imageview.setImageResource(resIds[position % resIds.length]);
				imageview.setScaleType(ImageView.ScaleType.FIT_XY);
				imageview.setLayoutParams(new Gallery.LayoutParams(136, 88));
				imageview.setBackgroundResource(mGalleryItemBackground);
			}
			return imageview;
		}
	}

	// 滑动Gallery的时候,ImageView不断显示当前的item
	@Override
	public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
	{
		// imageSwitcher.setImageResource(resIds[position % resIds.length]);
	}

	// 设置点击Gallery的时候才切换到该图片
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position, long id)
	{
		if (mCurrentPos == position)
		{
			// 如果在显示当前图片,再点击,就不再加载。
			return;
		}
		mCurrentPos = position;
		imageSwitcher.setImageResource(resIds[position % resIds.length]);
	}

	@Override
	public void onNothingSelected(AdapterView<?> parent)
	{
	}

	@Override
	public View makeView()
	{
		ImageView imageView = new ImageView(this);
		imageView.setBackgroundColor(0xFF000000);
		imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
		imageView.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

		return imageView;
	}

}
xml:

<?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/imageswitcher"
		android:layout_width="match_parent" android:layout_height="match_parent"
		
		/>
	<Galleryandroid:id="@+id/gallery" android:layout_width="match_parent"
		android:layout_height="wrap_content" android:layout_alignParentBottom="true"
		android:layout_alignParentLeft="true" android:gravity="center_vertical"
		android:background="#55000000"
		/>

</RelativeLayout>


如果有理解失误的地方,欢迎指正    - _ *





  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
Android中,可以使用GalleryImageSwitcher来实现可左右循环滑动的图片浏览器。 首先,在布局文件中添加一个Gallery和一个ImageSwitcher: ``` <Gallery android:id="@+id/gallery" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:gravity="center_vertical" /> <ImageSwitcher android:id="@+id/imageSwitcher" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@id/gallery" /> ``` 然后,在Java代码中,需要为Gallery设置一个Adapter,并为ImageSwitcher设置一个ViewFactory。代码如下: ``` public class MainActivity extends AppCompatActivity { private Gallery mGallery; private ImageSwitcher mImageSwitcher; private int[] mImageIds = new int[]{R.drawable.image1, R.drawable.image2, R.drawable.image3}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mGallery = (Gallery) findViewById(R.id.gallery); mImageSwitcher = (ImageSwitcher) findViewById(R.id.imageSwitcher); mGallery.setAdapter(new ImageAdapter(this)); mImageSwitcher.setFactory(new ViewFactory() { @Override public View makeView() { ImageView imageView = new ImageView(MainActivity.this); imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); return imageView; } }); mGallery.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { mImageSwitcher.setImageResource(mImageIds[position % mImageIds.length]); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } private class ImageAdapter extends BaseAdapter { private Context mContext; public ImageAdapter(Context context) { mContext = context; } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); imageView.setLayoutParams(new Gallery.LayoutParams(200, 200)); imageView.setScaleType(ImageView.ScaleType.FIT_XY); } else { imageView = (ImageView) convertView; } imageView.setImageResource(mImageIds[position % mImageIds.length]); return imageView; } } } ``` 这里的关键是设置Gallery的Adapter为一个无限循环的Adapter,以及在Gallery的OnItemSelectedListener中更新ImageSwitcher图片资源。同时,ImageAdapter负责为Gallery提供每个Item的View。 这样,我们就可以实现一个左右循环滑动的图片浏览器了。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值