1. 程式人生 > >Android 滑動效果入門篇(二)—— Gallery

Android 滑動效果入門篇(二)—— Gallery

水平居中 developer ngs Coding android 能夠 source contex load

Gallery 是Android官方提供的一個View容器類,繼承於AbsSpinner類,用於實現頁面滑動效果。

技術分享圖片技術分享圖片

從上面的繼承關系可以看出,AbsSpinner類繼承自AdapterView,因此我們可以自定義實現Adapter,來填充Gallery容器的數據。

本示例通過自己實現一個Adapter,來填充Gallery容器的圖片數據,首先看效果:

技術分享圖片

Activity

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import
android.widget.Gallery; import android.widget.Toast; public class GalleryActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Gallery gallery = (Gallery) findViewById(R.id.gallery); gallery.setAdapter(new
ImageAdapter(this)); // gallery添加ImageAdapter圖片資源 gallery.setOnItemClickListener(listener); // gallery設置點擊圖片資源的事件 } AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long
id)
{ Toast.makeText(GalleryActivity.this, "圖片 " + (position + 1), Toast.LENGTH_SHORT).show(); } }; }

ImageAdapter.java

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
	private Context mContext;
	
	//  圖片數組源
	private Integer[] imgs = { R.drawable.img1, R.drawable.img2,
			R.drawable.img3, R.drawable.img4, R.drawable.img5,
			R.drawable.img6, R.drawable.img7};

	public ImageAdapter(Context c) {
		mContext = c;
	}

	@Override
	public int getCount() {
		return imgs.length;
	}

	// 獲取圖片位置
	@Override
	public Object getItem(int position) {
		return imgs[position];
	}

	// 獲取圖片ID
	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ImageView imageview = new ImageView(mContext);

		imageview.setImageResource(imgs[position]);
		imageview.setLayoutParams(new Gallery.LayoutParams(240, 120));		// 設置布局 圖片120×120顯示
		imageview.setScaleType(ImageView.ScaleType.CENTER);				// 設置顯示比例類型(不縮放)
		return imageview;
	}
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    
    <!-- 文字居中顯示  android:gravity -->
    <!-- 控件居中顯示  android:layout_gravity -->
    
    <TextView 
        android:id="@+id/tv"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"                
        android:layout_gravity="center"         
        android:layout_marginTop="50dip"
        android:textColor="#ffff0000"
        android:textSize="30sp"
        android:text="Gallery Test"/>
    
    <Gallery 
    android:id="@+id/gallery"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dip"
    android:layout_below="@id/tv" />
    
</RelativeLayout>

源碼下載


示例分析:

1、ImageAdapter中,是繼承BaseAdapter自定義實現的,重載了BaseAdapter的幾個虛方法,其中重要的有兩個

getCount(): 返回資源的大小(總長度)

getView(int position, View convertView, ViewGroup parent) : 返回當前顯示的資源(獲取焦點)

2、GalleryActivity中,通過gallery.setAdapter(imgAdapter); 設置資源,然後設置gallery的點擊監聽事件。

3、main.xml中,是布局文件,顯示一個TextView和Gallery,RelativeLayout是相對布局

總體來說,Gallery 上述的示例很簡單,結構比較清晰,能夠滿足基本的應用。

Gallery 高級應用

上面的示例,僅僅是最簡單的Gallery應用,如果我們想做的更酷、更炫的效果:

1、Gallery 圖片顯示能夠循環播放,即向右滑到左側第一張圖片後,需要接著顯示最後一張圖片;向左滑到最後一張圖片後,需要接著顯示第一張圖片,往復不間斷顯示的循環效果。

2、選中圖片高亮,未選中圖片陰影,更加突出當前獲取焦點的選中圖片

3、區分“點擊”與“選中”圖片事件的區別和適用場景

技術分享圖片

效果1 —— 高亮顯示

沒有選中,在GalleryActivity中,設置gallery.setUnselectedAlpha(0.3f); 透明度為0.3

選中,在ImageAdapter的getView(int position, View convertView, ViewGroup parent)中,設置imageview.setBackgroundColor(Color.alpha(1)); 背景色為1

效果2 —— 循環播放

原理:Gallery循環播放的原理,跟循環鏈表的思想一樣,首尾item連接都是通過“取余”實現

修改1、ImageAdapter中的getCount() 方法中,修改返回值為無窮大 return Integer.MAX_VALUE;

修改2、ImageAdapter中的getView(int position, View convertView, ViewGroup parent)方法中,設置imageview.setImageResource(imgs[position % imgs.length]); 取余

修改3、GalleryActivity中,設置gallery.setSelection(imgAdapter.imgs.length * 100); 使gallery顯示圖片的位置從中間開始顯示(即imgAdapter.imgs.length * 100)

修改解釋:

修改1,主要是為了是循環接近無限往復循環,使position無限大,循環在實踐應用上不容易結束(理論上會結束,即2^31-1約20億次循環後)

修改2,通過取余,使圖片能夠重復利用並顯示

修改3,由於起始位置如果是0,則向右滑動左側將無法循環(此時左側將為-1,超出了imgs[]數組的下邊界),因此開始應設置起始位置為imgAdapter.imgs.length的整數倍

效果3 —— “點擊”和“選中”事件

1、點擊事件OnItemClickListener,是需要用手點擊才觸發,滑動時不觸發

2、選中事件OnItemSelectedListener,是當圖片滑到屏幕正中,則視為自動選中,在滑動的過程中會觸發

適用場景:

1、點擊事件OnItemClickListener,是在確定要選中該項時,才點擊進行邏輯處理

2、選中事件OnItemSelectedListener,可以用來提醒用戶,當前獲取焦點的項,如果確認為該項則需要點擊OnItemClickListener後,進行下一步的邏輯處理

高級應用完整代碼:

Activity

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Gallery;
import android.widget.Toast;

public class GalleryActivity extends Activity {
	
	private ImageAdapter imgAdapter = null;			// 聲明圖片資源對象
	private Gallery gallery = null;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		gallery = (Gallery) findViewById(R.id.gallery);
		imgAdapter = new ImageAdapter(this);
		gallery.setAdapter(imgAdapter); 					// 設置圖片資源
		gallery.setGravity(Gravity.CENTER_HORIZONTAL);		// 設置水平居中顯示
		gallery.setSelection(imgAdapter.imgs.length * 100);		// 設置起始圖片顯示位置(可以用來制作gallery循環顯示效果)
		
		gallery.setOnItemClickListener(clickListener); 			// 設置點擊圖片的監聽事件(需要用手點擊才觸發,滑動時不觸發)
		gallery.setOnItemSelectedListener(selectedListener);		// 設置選中圖片的監聽事件(當圖片滑到屏幕正中,則視為自動選中)
		gallery.setUnselectedAlpha(0.3f);					// 設置未選中圖片的透明度
		gallery.setSpacing(40);							// 設置圖片之間的間距
	}
	
	// 點擊圖片的監聽事件
	AdapterView.OnItemClickListener clickListener = new AdapterView.OnItemClickListener() {
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
			Toast.makeText(GalleryActivity.this, "點擊圖片 " + (position + 1), 100).show();
		}
	};
	
	// 選中圖片的監聽事件
	AdapterView.OnItemSelectedListener selectedListener = new AdapterView.OnItemSelectedListener() {
		@Override
		public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
			Toast.makeText(GalleryActivity.this, "選中圖片 " + (position + 1), 20).show();
		}

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


ImageAdapter.java

import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
	private Context mContext;
	
	//  圖片數組源
	public Integer[] imgs = { R.drawable.img1, R.drawable.img2,
			R.drawable.img3, R.drawable.img4, R.drawable.img5,
			R.drawable.img6, R.drawable.img7};

	public ImageAdapter(Context c) {
		mContext = c;
	}

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

	// 獲取圖片位置
	@Override
	public Object getItem(int position) {
		return imgs[position];
	}

	// 獲取圖片ID
	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ImageView imageview = new ImageView(mContext);

		imageview.setImageResource(imgs[position % imgs.length]);
		imageview.setLayoutParams(new Gallery.LayoutParams(200, 94));		// 設置布局 圖片120×120顯示
		imageview.setScaleType(ImageView.ScaleType.CENTER);				// 設置顯示比例類型
		imageview.setBackgroundColor(Color.alpha(1));
		return imageview;
	}
}

源碼下載

技術分享圖片技術分享圖片

參考推薦:

Gallery

Gallery tutorial

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

Android 滑動效果入門篇(二)—— Gallery