android圖片瀏覽器(一)——ImageSwitcher和Gallery
主要實現的功能就是瀏覽圖片。
用到的控制元件:ImageSwitcher和Gallery。
這種簡單的圖片瀏覽器google一下有很多,我也是參考別人上寫的。在搜尋的過程中,我發現了一個比較有意思的事情,就是很多部落格裡面的程式碼基本上都是相同的,而且執行起來都有錯誤。呵呵,看來很多童鞋都是直接copy過來,並沒有執行,甚至沒有去仔細看程式碼。
我也是參考別人的部落格寫的,並且把錯誤修正了,然後按照自己的一些想法對它做了一些優化:
1、網上的程式碼基本都是載入進來顯示這樣的頁面:
下面的Gallery不對稱。我做了優化,載入的時候是把左邊黑色的空白也鋪上了。如下:
2、可能這個地方不算是優化,我看別人的程式都是在滑動的時候,ImageSwitcher會不斷的變化,會不會很消耗資源?(只是換個方法實現變化而已,所以算不得優化)。我改成了只有停下來,你點選那一張,ImageSwitcher才會變化。
3、這個地方個人覺得還有有必要改一下的,我是參考了Listview的機制,實現的功能都是讓圖片無限滑動,
這個是在Adapter中這麼寫的:
public int getCount() { return Integer.MAX_VALUE; }
讓它最大值是最大整數,基本上是滑不到盡頭的。這個是很正常的功能,但是每滑動一次就會
這樣會new無數了ImageView物件,完全是沒必要的。ImageView imageview = new ImageView(mContext);
我們可以這樣,反正是迴圈麼,有多少個圖片,就new多少個ImageView就行了。
這個是參考Listview的機制,Listview在往下滑動的時候,item是不斷重用的。
附上原始碼:
xml: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 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圖片瀏覽器(一)——ImageSwitcher和Gallery
主要實現的功能就是瀏覽圖片。 用到的控制元件:ImageSwitcher和Gallery。 這種簡單的圖片瀏覽器google一下有很多,我也是參考別人上寫的。在搜尋的過程中,我發現了一個比較有意思的事情,就是很多部落格裡面的程式碼基本上都是相同的,而且執行起來都有錯誤。呵
Android Camera 系列(一)拍照和錄製視訊
Camera系列文章首發於 我的慕課網,歡迎關注。 概述 Camera 可能是接下來個人想深入學習的課題,準備新起一個系列,從個人的角度總結闡述自己對於 Android Camera 的研究過程,希望也能夠對其他想學習 Camera 的同學一些幫助。 一、
Android 圖片特效(一):色相、飽和度與亮度
平時的圖片在使用了美圖秀秀之後就會呈現不一樣的效果,就像上面的圖片展示的那樣(上圖是一張美圖秀秀的使用截圖)。實際上上面的效果離不開色彩的三要素——色相、飽和度和亮度。人眼看到的任一彩色光都是這三個特性的綜合效果。其中色調與光波的波長有直接關係,亮度
Android內存優化(一)DVM和ART原理初探
java虛擬機 劃分 cimage beef 靜態 由於 jar blank 查找 要學習Android的內存優化,首先要了解Java虛擬機,此前我用了多篇文章來介紹Java虛擬機的知識,就是為了這個系列做鋪墊。在Android開發中我們接觸的是與Java虛擬機類似的Dal
Android 開發:(一)安卓開發環境搭建與配置 (Windows和Mac )以及目錄結構介紹
(一)、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解析ActivityManagerService(一)AMS啟動流程和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: