Android系统自带一个GridView和Gallery两个控件,GridView网格显示,Gallery单个浏览,两者结合起来可以真正实现Gallery浏览图片效果。



本示例通过GridView和Gallery两个控件,模仿实现一个完整的仿Gallery图像集的图片浏览效果。效果图如下:



1、GridView

首先,自定义一个GridImageAdapter图片适配器,用于填充GridView控件的图片

public class GridImageAdapter extends BaseAdapter {private Context mContext;Drawable btnDrawable;public GridImageAdapter(Context context) {mContext = context;Resources resources = context.getResources();btnDrawable = resources.getDrawable(R.drawable.bg);}@Overridepublic int getCount() {return ImageSource.mThumbIds.length;}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ImageViewExt imageView;int space;if (convertView == null) {imageView = new ImageViewExt(mContext);if (imageCol == 5) {space = dm.heightPixels / imageCol - 6;imageView.setLayoutParams(new GridView.LayoutParams(space, space));} else {space = dm.widthPixels / imageCol - 6;imageView.setLayoutParams(new GridView.LayoutParams( space, space));}imageView.setAdjustViewBounds(true);imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);// 缩放图片使其长和宽一样 imageView.setPadding(3, 3, 3, 3);} else {imageView = (ImageViewExt) convertView;}imageView.setImageResource(ImageSource.mThumbIds[position]);return imageView;}}
然后,用 GridImageAdapter填充GridView

gridView = (GridView) findViewById(R.id.myGrid);gridImageAdapter = new GridImageAdapter(this);gridView.setAdapter(gridImageAdapter);gridView.setOnItemClickListener(listener); // 设置点击监听事件

最后,设置GridView控件的点击监听事件

AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {Intent intent = new Intent();intent.setClass(GridViewActivity.this, GalleryActivity.class);intent.putExtra("position", position);startActivity(intent);}};

2、Gallery

完成了GridView的图片显示、监听事件后,现在点击图片,会启动一个Activity来显示当前点击的图片,此时显示图片的控件便是Gallery

首先,同GridView一样,自定义一个ImageAdapter图片适配器,用来填充Gallery

public class ImageAdapter extends BaseAdapter {private Context mContext; private int mPos;public ImageAdapter(Context context) {mContext = context;}public void setOwnposition(int ownposition) {this.mPos = ownposition;}public int getOwnposition() {return mPos;}@Overridepublic int getCount() {return ImageSource.mThumbIds.length;}@Overridepublic Object getItem(int position) { mPos=position;return position;}@Overridepublic long getItemId(int position) {mPos=position; return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {mPos=position;ImageView imageview = new ImageView(mContext);imageview.setBackgroundColor(0xFF000000);imageview.setScaleType(ImageView.ScaleType.FIT_CENTER);imageview.setLayoutParams(new myGallery.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));imageview.setImageResource(ImageSource.mThumbIds[position]);return imageview;}}

然后, ImageAdapter填充Gallery

myGallery  galllery = (myGallery) findViewById(R.id.mygallery);Intent intent = getIntent();position = intent.getIntExtra("position", 0);// 获取GridViewActivity传来的图片位置position ImageAdapter imgAdapter=new ImageAdapter(this);galllery.setAdapter(imgAdapter);// 设置图片ImageAdaptergalllery.setSelection(position); // 设置当前显示图片  Animation an= AnimationUtils.loadAnimation(this,R.anim.scale );// Gallery动画 galllery.setAnimation(an); 

此时,如果细心可以注意到,我们的Gallery也是自己定义的myGallery,具体定义如下:

public class myGallery extends Gallery {boolean isFirst = false;boolean isLast = false;public myGallery(Context context) {super(context);}public myGallery(Context context, AttributeSet paramAttributeSet) {super(context, paramAttributeSet);}/** 是否向左滑动(true - 向左滑动; false - 向右滑动) */private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) {return e2.getX() > e1.getX();}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {ImageAdapter ia = (ImageAdapter) this.getAdapter();int p = ia.getOwnposition();// 获取当前图片的positionint count = ia.getCount();// 获取全部图片的总数countint kEvent;if (isScrollingLeft(e1, e2)) {if (p == 0 && isFirst) {Toast.makeText(this.getContext(), "已是第一页", Toast.LENGTH_SHORT).show();} else if (p == 0) {isFirst = true;} else {isLast = false;}kEvent = KeyEvent.KEYCODE_DPAD_LEFT;} else {if (p == count - 1 && isLast) {Toast.makeText(this.getContext(), "已到最后一页", Toast.LENGTH_SHORT).show();} else if (p == count - 1) {isLast = true;} else {isFirst = false;}kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;}onKeyDown(kEvent, null);return true;}}

GalleryActivity的布局文件gallery.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center"    android:orientation="horizontal"    android:padding="10dip" >    <RelativeLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="#000000"        android:padding="2dip" >        <com.homer.gridgallery.myGallery            android:id="@+id/mygallery"            android:layout_width="fill_parent"            android:layout_height="fill_parent"            android:spacing="16dp" />    </RelativeLayout></LinearLayout>


源码下载



参考推荐:

GridView

Grid View tutorial

Gallery

Gallery tutorial

ViewGroup


更多相关文章

  1. Android开发技术周报 Issue#54
  2. Android中clipChildren属性的用法
  3. Android(安卓)TV,机顶盒Gridview 焦点
  4. Android图像处理
  5. Android01————快速入门
  6. Android之自定义checkbox样式
  7. Android(安卓)Touch事件分析
  8. android常用控件(三)- ProgressBar、ListView
  9. Android系统工具之Monkey自动化测试

随机推荐

  1. 可视化工具不知道怎么选?深度评测5大Pytho
  2. 原理+代码|Python实战多元线性回归模型
  3. 原理+代码|Python基于主成分分析的客户信
  4. Python办公自动化 | 从PPT到Word
  5. 十分钟快速了解Pandas的常用操作!
  6. 原理 + 代码|手把手教你用Python实现智能
  7. 分享我学习Pandas使用的资料,可能是新手入
  8. Python+Excel+Word一秒制作百份合同
  9. 微信群总是有人发广告?看我用Python写一个
  10. Python办公自动化|批量提取Excel数据