Android的GridView和Gallery結合Demo
Demo介紹:首頁是一個GridView加載圖片,豎屏時顯示3列圖片,橫屏時顯示4列圖片;並且對圖片進行大小限製和加灰色邊框處理。點擊某一張圖片,會鏈接到Gallery頁麵,由於Android自帶的Gallery控件滑動效果很不好(滑動一次會加載好多張圖片),這裏對Gallery進行了擴展,滑動一次隻加載一張圖片。
Demo效果如下:

1、首頁Activity頁麵,GridViewActivity.java介紹:
public class GridViewActivity extends Activity {
private DisplayMetrics dm;
private GridImageAdapter ia;
private GridView g;
private int imageCol = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
// requestWindowFeature(Window.FEATURE_NO_TITLE);
ia = new GridImageAdapter(this);
setContentView(R.layout.mygridview);
g = (GridView) findViewById(R.id.myGrid);
g.setAdapter(ia);
g.setOnItemClickListener(new OnItemClick(this));
// 得到屏幕的大小
dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
}
/**
* 屏幕切換時進行處理 如果屏幕是豎屏,則顯示3列,如果是橫屏,則顯示4列
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
try {
super.onConfigurationChanged(newConfig);
// 如果屏幕是豎屏,則顯示3列,如果是橫屏,則顯示4列
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
imageCol = 4;
} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
imageCol = 3;
}
g.setNumColumns(imageCol);
g.setAdapter(new ImageAdapter(this));
// ia.notifyDataSetChanged();
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
*
* @author 空山不空 點擊具體的小圖片時,會鏈接到GridViewActivity頁麵,進行加載和展示
*/
public class OnItemClick implements OnItemClickListener {
public OnItemClick(Context c) {
mContext = c;
}
@Override
public void onItemClick(AdapterView aview, View view, int position,
long arg3) {
Intent intent = new Intent();
intent.setClass(GridViewActivity.this, GalleryActivity.class);
intent.putExtra("position", position);
GridViewActivity.this.startActivity(intent);
}
private Context mContext;
}
/**
*
* @author 空山不空 設置GridView的圖片適配器
*/
public class GridImageAdapter extends BaseAdapter {
Drawable btnDrawable;
public GridImageAdapter(Context c) {
mContext = c;
Resources resources = c.getResources();
btnDrawable = resources.getDrawable(R.drawable.bg);
}
public int getCount() {
return ImageSource.mThumbIds.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageViewExt imageView;
if (convertView == null) {
imageView = new ImageViewExt(mContext);
// 如果是橫屏,GridView會展示4列圖片,需要設置圖片的大小
if (imageCol == 4) {
imageView.setLayoutParams(new GridView.LayoutParams(
dm.heightPixels / imageCol - 6, dm.heightPixels
/ imageCol - 6));
} else {// 如果是豎屏,GridView會展示3列圖片,需要設置圖片的大小
imageView.setLayoutParams(new GridView.LayoutParams(
dm.widthPixels / imageCol - 6, dm.widthPixels
/ imageCol - 6));
}
imageView.setAdjustViewBounds(true);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
} else {
imageView = (ImageViewExt) convertView;
}
imageView.setImageResource(ImageSource.mThumbIds[position]);
return imageView;
}
private Context mContext;
}
}
加載GridView頁麵,如果屏幕是豎屏,則顯示3列,如果是橫屏,則顯示4列;並且顯示的圖片加上灰色邊框,這裏在適配器GridImageAdapter的getView方法裏引用了ImageViewExt類來對圖片進行處理,這個類擴展自ImageView;點擊其中的某一張圖片,會跳轉到GalleryActivity頁麵。
2、ImageViewExt.java文件
/**
*
* @author 空山不空
* 擴展ImageView類,將圖片加上邊框,並且設置邊框為灰色
*/
public class ImageViewExt extends ImageView {
//將圖片加灰色的邊框
private int color;
public ImageViewExt(Context context) {
super(context);
// TODO Auto-generated constructor stub
color=Color.GRAY;
}
public ImageViewExt(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
color=Color.GRAY;
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
//畫邊框
Rect rec=canvas.getClipBounds();
rec.bottom--;
rec.right--;
Paint paint=new Paint();
paint.setColor(color);
paint.setStrokeWidth(5);
paint.setStyle(Paint.Style.STROKE);
canvas.drawRect(rec, paint);
}
}
通過重載onDraw方法來畫邊框和設置邊框顏色
3、相冊GalleryActivity.java
/**
*
* @author 空山不空
* Gallery圖片頁麵,通過Intent得到GridView傳過來的圖片位置,加載圖片,再設置適配器
*/
public class GalleryActivity extends Activity {
public int i_position = 0;
private DisplayMetrics dm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.mygallery);
dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
// 獲得Gallery對象
GalleryExt g = (GalleryExt) findViewById(R.id.ga);
//通過Intent得到GridView傳過來的圖片位置
Intent intent = getIntent();
i_position = intent.getIntExtra("position", 0);
// 添加ImageAdapter給Gallery對象
ImageAdapter ia=new ImageAdapter(this);
g.setAdapter(ia);
g.setSelection(i_position);
//加載動畫
Animation an= AnimationUtils.loadAnimation(this,R.anim.scale );
g.setAnimation(an);
}
}
這裏有三點:
(1)、擴展Gallery組件,即GalleryExt控件,設置滑動一次隻加載一張圖片,並且, 如果是第一張圖片時,向左滑動會提示“已到第一頁”,如果是最後一張圖片時,向右滑動會提示“已到第後頁”
(2)、接收GridViewActivity頁麵傳過來的參數position,通過這個參數找到具體的圖片,通過ImageAdapter適配器加載
(3)、ImageAdapter圖片適配器,用來加載圖片
4、GalleryExt.java文件
/**
*
* @author 空山不空
* 擴展Gallery組件,設置滑動一次隻加載一張圖片,並且,
* 如果是第一張圖片時,向左滑動會提示“已到第一頁”
* 如果是最後一張圖片時,向右滑動會提示“已到第後頁”
*/
public class GalleryExt extends Gallery {
boolean is_first=false;
boolean is_last=false;
public GalleryExt(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public GalleryExt(Context context,AttributeSet paramAttributeSet)
{
super(context,paramAttributeSet);
}
private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2)
{
return e2.getX() > e1.getX();
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
//通過重構onFling方法,使Gallery控件滑動一次隻加載一張圖片
//獲取適配器
ImageAdapter ia=(ImageAdapter)this.getAdapter();
//得到當前圖片在圖片資源中的位置
int p=ia.getOwnposition();
//圖片的總數量
int count=ia.getCount();
int kEvent;
if(isScrollingLeft(e1, e2)){
//Check if scrolling left
if(p==0&&is_first){
//在第一頁並且再往左移動的時候,提示
Toast.makeText(this.getContext(), "已到第一頁", Toast.LENGTH_SHORT).show();
}else if(p==0){
//到達第一頁時,把is_first設置為true
is_first=true;
}else{
is_last=false;
}
kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
} else{
//Otherwise scrolling right
if(p==count-1&&is_last){
Toast.makeText(this.getContext(), "已到最後一頁", Toast.LENGTH_SHORT).show();
}else if( p==count-1){
is_last=true;
}else{
is_first=false;
}
kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
}
onKeyDown(kEvent, null);
return true;
}
5、ImageAdapter.java文件
/**
*
* @author 空山不空
* 圖片適配器,用來加載圖片
*/
public class ImageAdapter extends BaseAdapter {
//圖片適配器
// 定義Context
private int ownposition;
public int getOwnposition() {
return ownposition;
}
public void setOwnposition(int ownposition) {
this.ownposition = ownposition;
}
private Context mContext;
// 定義整型數組 即圖片源
// 聲明 ImageAdapter
public ImageAdapter(Context c) {
mContext = c;
}
// 獲取圖片的個數
public int getCount() {
return ImageSource.mThumbIds.length;
}
// 獲取圖片在庫中的位置
public Object getItem(int position) {
ownposition=position;
return position;
}
// 獲取圖片ID
public long getItemId(int position) {
ownposition=position;
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ownposition=position;
ImageView imageview = new ImageView(mContext);
imageview.setBackgroundColor(0xFF000000);
imageview.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageview.setLayoutParams(new GalleryExt.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
imageview.setImageResource(ImageSource.mThumbIds[position]);
// imageview.setAdjustViewBounds(true);
// imageview.setLayoutParams(new GridView.LayoutParams(320, 480));
// imageview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
return imageview;
}
}
6、配置文件
(1)AndroidManifest.xml :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:andro
package="com.ajie"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".GalleryActivity" android:label="@string/title" />
<activity android:name=".GridViewActivity" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
(2)mygridview.xml,即GridView頁麵
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:andro
android:
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:verticalSpacing="6dp"
android:numColumns="3"
android:paddingTop="5dp"
android:stretchMode="columnWidth"
android:gravity="fill_vertical|fill_horizontal"
/>
(3)mygallery.xml,加載圖片頁麵<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:andro
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent" android:gravity="center"
android:padding="10dip">
<RelativeLayout android:layout_width="wrap_content"
android:layout_height="wrap_content" android:padding="2dip"
android:background="#000000">
<com.ajie.GalleryExt android:
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:spacing="16dp" />
</RelativeLayout>
</LinearLayout>
Demo下載地址: gridGalleryDemo.zip下載
最後更新:2017-04-02 17:09:28