首页 > 代码库 > Android专题5——学习Gallery小结

Android专题5——学习Gallery小结

Context

  1. 这是一个比较复杂的概念,有上下文,句柄,环境变量等多重含义
  2. 目前理解为:指向parent的指针,比如Button btn = new Button(this),这里的this就是一个Context对象,这句代码告诉了这个btn在哪个Activity

res\values\文件夹有什么作用

  • 我们在XML文件一个java代码中都可以用系统定义的属性来修饰View,比如:android:layout_wid="wrap_content"。
  • 上面的android:layout_wid就是一个属性,我们也可以定义我们自己的属性
  • 首先就要现在res\values\新建一个我们自己的XML文件
  • 下面的android:galleryItemBackground就是我们自定义的一个用来修饰Gallery的背景风格

技术分享

 

技术分享

这里的android:galleryItemBackground是一个android以自定义的属性,所以后面没加format

如何使用这个定义的格式呢

技术分享

技术分享

如何循环显示图片

循环显示图像的原理

循环显示有些类似于循环链表,最后一个结点的下一个结点又是第1个结点。循环显示图像也可以模拟这一点。

也许细心的读者从上一节实现的ImageAdapter类中会发现些什么。对!就是getView方法中的position参数和getCount方法的关系。position参数的值是不可能超过getCount方法返回的值的,也就是说,position参数值的范围是0至getCount() - 1。

如果这时Gallery组件正好显示到最后一个图像,position参数值正好为getCount() - 1。那么我们如何再让Gallery显示下一个图像呢?也就是说让position参数值再增1,对!将getCount()方法的返回值也增1。

那么这里还有一个问题,如果position参数值无限地增加,就意味着resIds数组要不断地增大,这样会大大消耗系统的资源。想到这,就需要解决两个问题:既要position不断地增加,又让resIds数组中保存的图像资源ID是有限的,该怎么做呢?对于getCount()方法非常好解决,可以让getCount方法返回一个很大的数,例如,Integer.MAX_VALUE。这时position参数值就可以随着Gallery组件的图像不断向前移动而增大。现在resIds数组只有15个元素,如果position的值超过数组边界,要想继续循环取得数组中的元素(也就是说,当position的值是15时,取resIds数组的第0个元素,是16时取第1个元素),最简单的方法就是取余,代码如下:

resIds[position % resIds.length]

在本节对ImageAdapter类做了如下两个改进:

1. 使getCount方法返回一个很大的值。建议返回Integer.MAX_VALUE。

2. 在getView方法中通过取余来循环取得resIds数组中的图像资源ID。

通过上面两点改进,可以使图像列表在向右移动时会循环显示图像。当然,这种方法从本质上说只是伪循环,也就是说,如果真把图像移动到getCount方法返回的值那里,那也就显示到最后一个图像的。不过在这里getCount方法返回的是Integer.MAX_VALUE,这个值超过了20亿,除非有人真想把图像移动到第20亿的位置,否则Gallery组件看着就是一个循环显示图像的组件。

 1 package com.example.testgallery; 2  3 import android.R.integer; 4 import android.app.Activity; 5 import android.content.Context; 6 import android.content.res.TypedArray; 7 import android.os.Bundle; 8 import android.view.Menu; 9 import android.view.View;10 import android.view.ViewGroup;11 import android.widget.BaseAdapter;12 import android.widget.Gallery;13 import android.widget.ImageView;14 15 public class MainActivity extends Activity {16     private Gallery gallery;17     private int[] imageIds = { R.drawable.item1, R.drawable.item2,18             R.drawable.item3, R.drawable.item4, R.drawable.item5,19             R.drawable.item6, R.drawable.item7, R.drawable.item8,20             R.drawable.item9 };21 22     @Override23     protected void onCreate(Bundle savedInstanceState) {24         super.onCreate(savedInstanceState);25         setContentView(R.layout.activity_main);26         gallery = (Gallery)findViewById(R.id.galley);27         gallery.setAdapter(new ImageAdapter(this));28     }29 30     @Override31     public boolean onCreateOptionsMenu(Menu menu) {32         // Inflate the menu; this adds items to the action bar if it is present.33         getMenuInflater().inflate(R.menu.main, menu);34         return true;35     }36     37     private class ImageAdapter extends BaseAdapter{38         private Context mcontext;39         private int mGalleryItemBackground;40         public ImageAdapter(Context context){41             mcontext = context;42             TypedArray typeArray = obtainStyledAttributes(R.styleable.Gallery);43             mGalleryItemBackground = typeArray.getResourceId( R.styleable.Gallery_android_galleryItemBackground, 0);44         }45         @Override46         public int getCount() {47             return Integer.MAX_VALUE;48         }49         @Override50         public Object getItem(int position) {51             return position;52         }53         @Override54         public long getItemId(int position) {55             return position;56         }57         @Override58         public View getView(int position, View arg1, ViewGroup arg2) {59             ImageView imageView = new ImageView(mcontext);60             imageView.setImageResource(imageIds[position%imageIds.length]);61             imageView.setScaleType(ImageView.ScaleType.FIT_XY);62             imageView.setLayoutParams(new Gallery.LayoutParams(310, 210));63             imageView.setBackgroundResource(mGalleryItemBackground);64             return imageView;65         }66     }67 }

activity_main.xml

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2     xmlns:tools="http://schemas.android.com/tools" 3     android:layout_width="match_parent" 4     android:layout_height="match_parent" 5     android:paddingBottom="@dimen/activity_vertical_margin" 6     android:paddingLeft="@dimen/activity_horizontal_margin" 7     android:paddingRight="@dimen/activity_horizontal_margin" 8     android:paddingTop="@dimen/activity_vertical_margin" 9     tools:context=".MainActivity" >10 11     <Gallery 12         android:id="@+id/galley"13         android:layout_width="fill_parent"14         android:layout_height="wrap_content"/>15 16 </RelativeLayout>

attrs.xml

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>

 

Android专题5——学习Gallery小结