1. 程式人生 > >android圖片瀏覽器(一)——ImageSwitcher和Gallery

android圖片瀏覽器(一)——ImageSwitcher和Gallery

主要實現的功能就是瀏覽圖片。

用到的控制元件:ImageSwitcher和Gallery。

這種簡單的圖片瀏覽器google一下有很多,我也是參考別人上寫的。在搜尋的過程中,我發現了一個比較有意思的事情,就是很多部落格裡面的程式碼基本上都是相同的,而且執行起來都有錯誤。呵呵,看來很多童鞋都是直接copy過來,並沒有執行,甚至沒有去仔細看程式碼。

我也是參考別人的部落格寫的,並且把錯誤修正了,然後按照自己的一些想法對它做了一些優化:

1、網上的程式碼基本都是載入進來顯示這樣的頁面:


下面的Gallery不對稱。我做了優化,載入的時候是把左邊黑色的空白也鋪上了。如下:


2、可能這個地方不算是優化,我看別人的程式都是在滑動的時候,ImageSwitcher會不斷的變化,會不會很消耗資源?(只是換個方法實現變化而已,所以算不得優化)。我改成了只有停下來,你點選那一張,ImageSwitcher才會變化。

3、這個地方個人覺得還有有必要改一下的,我是參考了Listview的機制,實現的功能都是讓圖片無限滑動,

這個是在Adapter中這麼寫的:

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

讓它最大值是最大整數,基本上是滑不到盡頭的。

這個是很正常的功能,但是每滑動一次就會

ImageView imageview = new ImageView(mContext);
這樣會new無數了ImageView物件,完全是沒必要的。

我們可以這樣,反正是迴圈麼,有多少個圖片,就new多少個ImageView就行了。

這個是參考Listview的機制,Listview在往下滑動的時候,item是不斷重用的。

附上原始碼:

package net.blogjava.mobile;

import java.util.HashMap;

import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Gallery.LayoutParams;
import android.widget.ViewSwitcher.ViewFactory;

public class Main extends Activity implements OnItemSelectedListener, ViewFactory, OnItemClickListener
{
	private Gallery gallery;
	private ImageSwitcher imageSwitcher;
	private ImageAdapter imageAdapter;
	private int mCurrentPos = -1;// 當前的item
	private HashMap<Integer, ImageView> mViewMap;

	private int[] resIds = new int[]
		{R.drawable.item1 ,R.drawable.item2 ,R.drawable.item3 ,R.drawable.item4 ,R.drawable.item5 ,R.drawable.item6 ,R.drawable.item7 ,R.drawable.item8 ,R.drawable.item9 ,R.drawable.item10 ,R.drawable.item11 ,R.drawable.item12 ,R.drawable.item13 ,R.drawable.item14 ,R.drawable.item15};

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		gallery = (Gallery) findViewById(R.id.gallery);
		imageAdapter = new ImageAdapter(this, resIds.length);
		gallery.setAdapter(imageAdapter);
		gallery.setOnItemSelectedListener(this);
		gallery.setSelection(1);// 設定一載入Activity就顯示的圖片為第二張

		gallery.setOnItemClickListener(this);

		imageSwitcher = (ImageSwitcher) findViewById(R.id.imageswitcher);
		imageSwitcher.setFactory(this);

		// 設定動畫效果 淡入淡出
		imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
		imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
	}

	public class ImageAdapter extends BaseAdapter
	{
		int mGalleryItemBackground;
		private Context mContext;
		private int mCount;// 一共多少個item

		public ImageAdapter(Context context, int count)
		{
			mContext = context;
			mCount = count;
			mViewMap = new HashMap<Integer, ImageView>(count);
			TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);
			// 設定邊框的樣式
			mGalleryItemBackground = typedArray.getResourceId(R.styleable.Gallery_android_galleryItemBackground, 0);
		}

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

		public Object getItem(int position)
		{
			return position;
		}

		public long getItemId(int position)
		{
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent)
		{
			ImageView imageview = mViewMap.get(position % mCount);
			if (imageview == null)
			{
				imageview = new ImageView(mContext);
				imageview.setImageResource(resIds[position % resIds.length]);
				imageview.setScaleType(ImageView.ScaleType.FIT_XY);
				imageview.setLayoutParams(new Gallery.LayoutParams(136, 88));
				imageview.setBackgroundResource(mGalleryItemBackground);
			}
			return imageview;
		}
	}

	// 滑動Gallery的時候,ImageView不斷顯示當前的item
	@Override
	public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
	{
		// imageSwitcher.setImageResource(resIds[position % resIds.length]);
	}

	// 設定點選Gallery的時候才切換到該圖片
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position, long id)
	{
		if (mCurrentPos == position)
		{
			// 如果在顯示當前圖片,再點選,就不再載入。
			return;
		}
		mCurrentPos = position;
		imageSwitcher.setImageResource(resIds[position % resIds.length]);
	}

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

	@Override
	public View makeView()
	{
		ImageView imageView = new ImageView(this);
		imageView.setBackgroundColor(0xFF000000);
		imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
		imageView.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

		return imageView;
	}

}
xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	 android:layout_width="match_parent"
	android:layout_height="match_parent">

	<ImageSwitcher android:id="@+id/imageswitcher"
		android:layout_width="match_parent" android:layout_height="match_parent"
		
		/>
	<Galleryandroid:id="@+id/gallery" android:layout_width="match_parent"
		android:layout_height="wrap_content" android:layout_alignParentBottom="true"
		android:layout_alignParentLeft="true" android:gravity="center_vertical"
		android:background="#55000000"
		/>

</RelativeLayout>

如果有理解失誤的地方,歡迎指正    - _ *


相關推薦

android圖片瀏覽器——ImageSwitcherGallery

主要實現的功能就是瀏覽圖片。 用到的控制元件:ImageSwitcher和Gallery。 這種簡單的圖片瀏覽器google一下有很多,我也是參考別人上寫的。在搜尋的過程中,我發現了一個比較有意思的事情,就是很多部落格裡面的程式碼基本上都是相同的,而且執行起來都有錯誤。呵

Android Camera 系列拍照錄製視訊

Camera系列文章首發於 我的慕課網,歡迎關注。 概述 Camera 可能是接下來個人想深入學習的課題,準備新起一個系列,從個人的角度總結闡述自己對於 Android Camera 的研究過程,希望也能夠對其他想學習 Camera 的同學一些幫助。 一、

Android 圖片特效:色相、飽和度與亮度

    平時的圖片在使用了美圖秀秀之後就會呈現不一樣的效果,就像上面的圖片展示的那樣(上圖是一張美圖秀秀的使用截圖)。實際上上面的效果離不開色彩的三要素——色相、飽和度和亮度。人眼看到的任一彩色光都是這三個特性的綜合效果。其中色調與光波的波長有直接關係,亮度

Android內存優化DVMART原理初探

java虛擬機 劃分 cimage beef 靜態 由於 jar blank 查找 要學習Android的內存優化,首先要了解Java虛擬機,此前我用了多篇文章來介紹Java虛擬機的知識,就是為了這個系列做鋪墊。在Android開發中我們接觸的是與Java虛擬機類似的Dal

Android 開發:安卓開發環境搭建與配置 (WindowsMac )以及目錄結構介紹

(一)、windows版 一. 開發工具: 1.Android Studio:(http://www.androiddevtools.cn/) 2.Genymotion(虛擬機器):(http://www.genymotion.net/) (二)、Mac版 一

Android輸入系統輸入事件傳遞流程InputManagerService的誕生

本文首發於微信公眾號「劉望舒」 原文連結 : Android輸入系統的事件傳遞流程和IMS的誕生 相關文章 解析WMS系列 View體系系列 前言 很多同學可能會認為輸入系統是不是和View的事件分發有些關聯,確實是有些關聯,只不過View事件分發只能算是輸入系統事件傳遞的一部分。這個系列講的

android記錄筆記記憶體洩露各種效能優化

該篇筆記來自於平時學習時,對各種學習資源的整合,如有冒犯敬請諒解,整理的不好,還望指出錯誤,主要用於查詢與記錄 一、記憶體洩露 針對記憶體洩露我認為要知道下面三點: 第一:要弄清楚記憶體洩露與記憶體溢位的區別 第二:要弄清楚常規的記憶體分析方法,重點掌握Leakcanary的使用

史上最詳細的Android Studio系列教程--下載安裝

背景 相信大家對Android Studio已經不陌生了,Android Studio是Google於2013 I/O大會針對Android開發推出的新的開發工具,目前很多開源專案都已經在採用,Google的更新速度也很快,明顯能感覺到這是Android開發的未來,那

Android動畫解析-----逐幀動畫補間動畫

今天專案又用到了動畫,發現之前掌握的那些又遺忘了不少,趁著有時間,再重新捋順一邊。 Android中的動畫分為 逐幀動畫,補間動畫,屬性動畫 三種. 逐幀動畫(Frame Animation) 逐幀動畫:就像GIF圖片一樣,通過一系列的Drawab

Android解析ActivityManagerServiceAMS啟動流程AMS家族

前言 此前在Android系統啟動流程、應用程序以及深入四大元件這三個系列文章中,都提及到了AMS,但都沒有系統的來講解它,本文就以AMS為主來進行講解,其中會有一些知識點與這些系列文章有所重合,這裡會儘量做到詳盡講解。閱讀此文章前,最好閱讀相關文章中

Android面試題——Activity的生命週期啟動模式

引言 這份面試題系列文章旨在查漏補缺,通過常見的面試題發現自己在Android基礎知識上的遺漏和欠缺,驗證所學是否紮實。 這是系列的第一章,後面我會根據安卓知識模組分類併網羅分析各種常見面試題。 面試題: Activity的生命週期 答

Android相機開發之預覽拍照檢視圖片基本功能的實現

前言         接觸Android開發有一段時間了。一開始時純粹是出於自己的興趣,空閒時寫幾個小軟體自娛自樂。剛好暑假時老闆佈置的任務跟Android相關,所以這段時間又繼續進行了Android的開發學習。現在的Android開發水平僅屬於

iOS圖片處理呼叫系統相機相簿獲取圖片,給相機新增自定義覆蓋物

[摘要:起首,拍照或從相簿挑選照片須要應用 UIImagePickerController,應用時須要增加兩個協定 #import UIKit/UIKit.h @interface ViewContr

[轉]設計模式--單例模式懶漢式餓漢式

打印 是否 調用構造 餓漢 一段 tools 會有 輸出結果 java 單例模式是設計模式中比較簡單的一種。適合於一個類只有一個實例的情況,比如窗口管理器,打印緩沖池和文件系統, 它們都是原型的例子。典型的情況是,那些對象的類型被遍及一個軟件系統的不同對象訪問,因此需要一個

Android 插件之類加載器

load ron 概念 基本概念 android oid ont 基本上 style 1、類加載器基本概念   類加載器(class loader)用來加載 Java 類到 Java 虛擬機中。一般來說,Java 虛擬機使用 Java 類的方式如下:Java 源程序(.j

Qt5.9.1結合REF開發基於chorm的瀏覽器

編譯 ++ mar 建立 eat generate sha 設計 source 下載cef3的源碼 cef簡介   嵌入式Chromium框架(簡稱CEF) 是一個由Marshall Greenblatt在2008建立的開源項目,它主要目的是開發一個基於Google Chr

docker安裝必要的配置。

cgroup deb secure expec dex store div post oca Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制

自動化運維工具Ansible實戰簡介部署

Ansible 自動化運維 一、Ansible的介紹 Ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點。實現了批量系統配置、批量程序部署、批量運行命令等功能。Ansible是基於模塊工作的,本身沒

Android View動畫 --- scale

for -- 縮放 記錄 1.0 使用 tco 關於 mod 在我們做apk開發的過程中,如果要吸引用戶,就需要要做出來一個非常炫的界面,當然動畫是必不可少的,接下來就記錄和學習動畫相關…… 接下來就把平時的一些東西,慢慢的上傳上來,做一下記錄和保存 今天要講解的第一個

Android系統架構

查詢 核心 手機 例如 ava 模塊 api 操作系統 運行   一、Android系統版本簡介   Android操作系統已占據了手機操作系統的大半壁江山,截至本文寫作時,Android操作系統系統版本及其詳細信息,已發生了變化,具體信息見下表,當然也可以訪問https: