GridView: A view that shows items in two-dimensional scrolling grid. The items in the grid come from the ListAdapter associated with this view. 简单说,GridView就是我们资源管理器平常见到的一个个文件的icon显示方式。
    上面提及到了,GridView的Item是来自ListAdapter的,所以一般在Activity的onCreate使用GridView的代码:
  1. @Override
  2. public void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.grid_2);
  5. GridView g = (GridView) findViewById(R.id.myGrid);
  6. g.setAdapter(new ImageAdapter(this));
  7. }
    而ImageAdapter一般是extends BaseAdapter。BaseAdapter是implements ListAdapter SpinnerAdapter,但很多时候自定义的Adapter都是override ListAdapter的父类Adapter接口里面的方法:
    int     getCount()                   获取当前Adapter的Items数目
    Object getItem(int position)     获取相应position的Item
    long     getItemId(int position)  获取相应position的Item在List中的row id
    View    getView(int position, View convertView, ViewGroup parent) 获取在指定position所要显示的data的View
 
    这些方法函数和swing的差不多,都是基于MVC。大概原理过程是这样的:程序需要显示GridView,那么要把data一个一个地显示出来是通过一个for循环,首先call Adapter.getCount()得到有多少个data,然后position++地getItem,getView得到要显示的view,这样子逐一地显示出来!
 
下面是官方sample里面的Photo Grid的例子,本人省略了某些代码:
  1. public class ImageAdapter extends BaseAdapter {
  2. public ImageAdapter(Context c) {
  3. mContext = c;
  4. }
  5. public int getCount() {
  6. return mThumbIds.length;
  7. }
  8. public Object getItem(int position) {
  9. return position;
  10. }
  11. public long getItemId(int position) {
  12. return position;
  13. }
  14. public View getView(int position, View convertView, ViewGroup parent) {
  15. ImageView imageView;
  16. if (convertView == null) {
  17. imageView = new ImageView(mContext);
  18. imageView.setLayoutParams(new GridView.LayoutParams(45, 45));//设置ImageView宽高
  19. imageView.setAdjustViewBounds(false);
  20. imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
  21. imageView.setPadding(8, 8, 8, 8);
  22. } else {
  23. imageView = (ImageView) convertView;
  24. }
  25. imageView.setImageResource(mThumbIds[position]);
  26. return imageView;
  27. }
  28. private Context mContext;
  29. private Integer[] mThumbIds = {
  30. R.drawable.sample_thumb_0, R.drawable.sample_thumb_1,
  31. R.drawable.sample_thumb_2, R.drawable.sample_thumb_3,
  32. R.drawable.sample_thumb_4, R.drawable.sample_thumb_5,
  33. R.drawable.sample_thumb_6, R.drawable.sample_thumb_7
  34. };
  35. }
留意getView里面的代码,要判断convertView是否为null,以便重用,减少对象的创建,减少内存占用。
 
XML布局文件内容,原来就只是指明GridView:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <GridView xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/myGrid"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:padding="10dp"
  7. android:verticalSpacing="10dp"
  8. android:horizontalSpacing="10dp"
  9. android:numColumns="auto_fit"
  10. android:columnWidth="60dp"
  11. android:stretchMode="columnWidth"
  12. android:gravity="center"
  13. />
    可以看到getView,和ImageView是重点,影响图片的显示效果。而且发现列数是不确定的,取决于每个ImageView的宽度和屏幕的宽度。接下来看看ImageView。
 
    ImageView:Displays an arbitrary image, such as an icon. The ImageView class can load images from various sources (such as resources or content providers), takes care of computing its measurement from the image so that it can be used in any layout manager, and provides various display options such as scaling and tinting。 ImageView就是用来显示Image,icon的。
    这里我们重点理解ImageView的属性android:scaleType,即ImageView.setScaleType(ImageView.ScaleType)。android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别:
 
CENTER /center  按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
 
CENTER_CROP / centerCrop  按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
 
CENTER_INSIDE / centerInside  将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
 
FIT_CENTER / fitCenter  把图片按比例扩大/缩小到View的宽度,居中显示
 
FIT_END / fitEnd   把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
 
FIT_START / fitStart  把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
 
FIT_XY / fitXY  把图片不按比例扩大/缩小到View的大小显示
 
MATRIX / matrix 用矩阵来绘制
 
    一开始我不明白MATRIX矩阵,网上搜索后发现原来MATRIX矩阵可以动态缩小放大图片来显示,这里不展开深入的了解,只是贴出相关语句,缩小图片:
  1. //获得Bitmap的高和宽
  2. int bmpWidth=bmp.getWidth();
  3. int bmpHeight=bmp.getHeight();
  4. //设置缩小比例
  5. double scale=0.8;
  6. //计算出这次要缩小的比例
  7. scaleWidth=(float)(scaleWidth*scale);
  8. scaleHeight=(float)(scaleHeight*scale);
  9. //产生resize后的Bitmap对象
  10. Matrix matrix=new Matrix();
  11. matrix.postScale(scaleWidth, scaleHeight);
  12. Bitmap resizeBmp=Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix, true);
 
    应用ImageView的例子很多,看看上次FrameLayout里面的:
  1. <ImageView
  2. android:id="@+id/image"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:scaleType="center"
  6. android:src="@drawable/candle"
  7. />
 
    ** 要注意一点,我发现Drawable文件夹里面的图片命名是不能大写的。

Android UI学习 - GridView和ImageView的使用的更多相关文章

  1. Android UI学习 - ListView (android.R.layout.simple_list_item_1是个什么东西)

    Android UI学习 - ListView -- :: 标签:Android UI 移动开发 ListView ListActivity 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始 ...

  2. Android UI学习前言:Android UI系统的知识结构

    Android UI系统的知识结构如下图所示: 对于 一个GUI系统地使用,首先是由应用程序来控制屏幕上元素的外观和行为,这在各个GUI系统中是不相同的,但是也具有相通性.Android系统在这方面, ...

  3. Android UI学习组件概述

    Android的UI组件繁多,如果学习的时候不能自己总结和分类而是学一个记一个不去思考和学习他们内在的联系那真的是只有做Farmer的命了.为了向注定成为Farmer的命运抗争,在学习Android的 ...

  4. Android UI学习 - FrameLayou和布局优化(viewstub)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://android.blog.51cto.com/268543/308090 Fram ...

  5. Android UI学习 - Tab的学习和使用(转)

      本文是参考Android官方提供的sample里面的ApiDemos的学习总结.   TabActivity   首先Android里面有个名为TabActivity来给我们方便使用.其中有以下可 ...

  6. Android UI学习1:控件和基本事件的响应

    在任何一个 GUI 系统中,控制界面上的控件(通常称为控件)都是一个基本的内容.对于 Android 应用程序,控件称为 View. 在 Android 中,在处理 UI 中的各种元素的时候,两个程序 ...

  7. Android UI 学习 自定义的布局 平滑移动 VelocityTracker()

    /**  * Helper for tracking the velocity of touch events, for implementing  * flinging and other such ...

  8. Android:日常学习笔记(8)———探究UI开发(5)

    Android:日常学习笔记(8)———探究UI开发(5) ListView控件的使用 ListView概述 A view that shows items in a vertically scrol ...

  9. Android开发学习笔记:浅谈GridView

    GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的.主要用于设置Adapter. GridView常用的X ...

随机推荐

  1. [python]随机数

    import random()testlist = [1,3,4,5]a,b = 1,5random().random()() 生成0至1之间的随机浮点数,结果大于等于0.0,小于1.0random. ...

  2. [BZOJ 1058] [ZJOI2007] 报表统计 【平衡树】

    题目链接:BZOJ - 1058 题目分析 这道题看似是需要在序列中插入一些数字,但其实询问的内容只与相邻的元素有关. 那么我们只要对每个位置维护两个数 Ai, Bi, Ai 就是初始序列中 i 这个 ...

  3. SKProductsRequest ios 7不调用delegate

    在iOS7中,内购只能在真机上才会调用 - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProdu ...

  4. Java语言基础(四) String和StringBuffer的区别

    Java提供了两个字符串类:String和StringBuffer. String提供了数值不可变的字符串,而StringBuffer提供的字符串对象可以进行修改. 当知道字符数据要改变的时候就可以使 ...

  5. 单片机Keil软件仿真与调试技巧

    一.引言 单片机软件开发过程中,软件调试遇到的各种问题常令初学者感到不知所措.实际上.各种仿真开发软件的程序调试基本方法和技巧大同小异,掌握正确的程序调试基本技巧.对于排查这些程序错误问题可以起到举一 ...

  6. xcode5 ios7升级后的一系列问题解决

    framework not found IOKit解决办法,打开终端:cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS. ...

  7. 14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器

    14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器 这个章节描述技术关于移动或者复制一些或者所 ...

  8. 别再说“我已经努力了”,你的“努力”一文不值!

    有次,让一个研究生男收集一份资料,快下班了问结果,竟然毛也没有.见我要怒,他慷慨激昂地说:"我已经很努力找了,但真的查不到." 作为主管,"我已经努力"这话我不 ...

  9. Linux Shell编程(16)——循环

    循环就是重复一些命令的代码块,如果条件不满足就退出循环. for loops for arg in [list] 这是一个基本的循环结构.它与C的for结构有很大不同. for arg in [lis ...

  10. 【转】patch命令

    原文网址:http://bbs.chinaunix.net/thread-1945698-1-1.html patch给文件1应用补丁文件变成另外一个文件2(需要先用"diff 文件1 文件 ...