1. 程式人生 > >ViewPager+可縮放ImageView的使用

ViewPager+可縮放ImageView的使用

       最近專案遇到一個需求,就是在ViewPager裡面放置圖片,而且每個圖片需要可以縮放的。

       這種需求相對來說不是很難了,因為網上絕對有很多類似的開源,大家拿過來就可以用了。我之前也是這麼做的,直到我發現開源框架沒有提供我需要的那個功能之後,我就放棄了。 之前我是在ViewPager裡面使用PhotoView這個開源框架的。但是他沒有處理圖片縮放與ViewPager的滑動的一個衝突。具體表現就是,當你想縮放圖片的時候,可能會導致ViewPager的滑動。

        這個問題的解決方式其實也很簡單,就是在PhotoView的onTouch裡面判斷,多點時,就不讓滑動即可。可是PhotoView這個框架封裝的很好,他的PhotoView這個類甚至都沒有重寫onTouch方法。我自己重寫了一下,然後在裡面處理,根本沒用。

        然後,我在網上搜了很多資源,都沒有找到很滿意的。然後我看到了http://blog.csdn.net/lmj623565791/article/details/39480503 這個部落格。發現他寫到很詳細,而且程式碼沒有PhotoView這個框架那麼多。而且註釋很清晰。不過不幸的是,他也沒有去解決這個衝突。於是,我在他程式碼的基礎上,加上了這個衝突的解決,於是我的需求搞定了。

       然後額外發現一個問題,就是在多點觸控的時候,有時候會報

java.lang.IllegalArgumentException: pointerIndex out of range

這個異常,又在網上查資料,然後在

http://blog.csdn.net/nnmmbb/article/details/28419779這個部落格看到了解決方案,我就按照他的方式,自己寫一個ViewPager,並在裡面try..catch。然後果然catch到異常了,然後程式就沒有崩潰了。

       總結:實現了ViewPager+可縮放的ImageView。實現,在縮放時,不產生ViewPager的滑動,在縮放時,程式不崩潰。但是其實還有兩個需求沒有解決:就是縮放之後的圖片,在二次顯示的時候,沒有還原到初始大小;圖片只是在初始大小的基礎上進行放大,及放大後的縮小,一開始就縮小還沒有實現。

程式碼和第一個部落格地址的程式碼無差別。就是添加了

int count = event.getPointerCount();
			if (count > 1) {
				// 當滑動時,手指超過一個就不允許ViewPager滑動
				getParent().requestDisallowInterceptTouchEvent(true);
			}

這幾句程式碼,在觸控移動的末尾新增即可。

=========================================================================

一開始就可以縮小,也找到解決方式了,還是在第一個部落格地址的程式碼上,做一點點修改:

		/**
		 * 縮放的範圍控制
		 */
		float smallScale = initScale/2;
		if ((scale < SCALE_MAX && scaleFactor > 1.0f)
				|| (scale > smallScale && scaleFactor < 1.0f)) {
			/**
			 * 最大值最小值判斷
			 */
			if (scaleFactor * scale < smallScale) {
				scaleFactor = smallScale / scale;
			}
			if (scaleFactor * scale > SCALE_MAX) {
				scaleFactor = SCALE_MAX / scale;
			}
			/**
			 * 設定縮放比例
			 */
			mScaleMatrix.postScale(scaleFactor, scaleFactor,
					detector.getFocusX(), detector.getFocusY());
			checkBorderAndCenterWhenScale();
			setImageMatrix(mScaleMatrix);
		}

就是新增一個縮小值,即可。程式碼還是他的程式碼。

###################

縮放的ImageView在ViewPager滑動中的二次還原實現:

1. 要重寫ViewPager的getItemPosition方法,返回return POSITION_NONE;為了銷燬螢幕外的View;

	@Override
	public int getItemPosition(Object object) {
		return POSITION_NONE;
	}

2.設定ViewPager的滑動監聽,在ViewPager的滑動監聽OnPageChangeListener的重寫方法裡面新增如下程式碼:

<p> @Override
  public void onPageScrollStateChanged(int state) {
   if (ViewPager.SCROLL_STATE_IDLE == state ) {
    adapter.notifyDataSetChanged();
   }
  }</p><p> }</p>

。這樣就搞定了ViewPager的縮放ImageView的二次顯示時候的,縮放還原。

######################

相關推薦

ViewPager+ImageView的使用

       最近專案遇到一個需求,就是在ViewPager裡面放置圖片,而且每個圖片需要可以縮放的。        這種需求相對來說不是很難了,因為網上絕對有很多類似的開源,大家拿過來就可以用了。我之前也是這麼做的,直到我發現開源框架沒有提供我需要的那個功能之後,我就放棄

ImageView(可以放大縮小)

由於專案需求的原因,最近一直在研究可縮放性ImageView,用本文來記錄一下最近所學: 該ImageView的實現功能有: 1)初步開啟時,圖片按比例滿屏(填充ImageView)顯示。 2)在放大縮小過程中,可以控制最大放大比例和最小縮小比例。 3)在縮放過程中,若圖片

wpf 顯示遠程圖片的Image

bsp bin eas tel borde med urn art ride using System; using System.Collections.Generic; using System.Linq; using System.Text; using

QT中給各控件增加背景圖片(旋轉)的幾種方法

.net detail eight iou rotate art board 按鈕 previous 1. 給QPushButton 增加背景圖片:背景圖片可根據Button大小自由縮放。 [cpp] view plain copy vo

用d3.js對訊號處理的結果資料作圖,得到互動的動態SVG圖

d3.js 有何用 D3.js is a JavaScript library for manipulating documents based on data. D3 helps you bring data to life using HTML, SVG, and CSS. D3’s

【筆記】浮動屬性float的應用07——浮動的首字下沉(所有步驟組合在一起)

第1步 - 從一段文字開始 在本練習中,我們希望強制將一個下降帽放在一段文字旁邊。我們還希望丟棄上限是可擴充套件的,無論使用者的預設字型大小如何 - 這意味著所有測量都將以ems或百分比表示。從一段簡單的文字開始。 第2步 - 在第一個字母周圍新增一個範圍 將規則應用於第一個字母有兩種方

【筆記】浮動屬性float的應用07——浮動的首字下沉

第1步 - 從一段文字開始 在本練習中,我們希望強制將一個下降帽放在一段文字旁邊。我們還希望丟棄上限是可擴充套件的,無論使用者的預設字型大小如何 - 這意味著所有測量都將以ems或百分比表示。從一段簡單的文字開始。 程式碼如下所示: <!DOCTYPE html> <h

Highcharts 時間序列,的圖表

一 程式碼 <html> <head> <meta charset="UTF-8" /> <title>Highcharts 時間序列,可縮放的圖表</title> <script src="http://apps.

svg:xml標記的向量圖形

2013-07-17 abloz.com 2013.7.17 SVG是scalable vectory graphic. html5可以用此畫圖。 複製下述指令碼,存為html檔案,用chrome開啟,可以看到用xml標記

WPF中的無邊框透明窗體

WPF中的無邊框透明窗體,由於沒有邊並且透明,窗體無法進行縮放操作,今天來講解如何解決這個問題。 先說一下思路,我們先手為該窗體新增4個邊,4個角用於縮放操作,然後再為他們寫事件,完成拖放操作。 xaml程式碼: <Windowx:Class="

Android仿微信朋友圈高清圖檢視控制元件、雙擊、移動

該庫支援和包含的功能: 1.圖片支援手勢操作, 可縮放、雙擊、移動 2.圖片載入時的進度條, 支援自定義 該庫的效果圖如下: 本地相簿圖片效果圖: 點選預覽大圖的效果 本想直接新增gradle依賴庫,不巧的是,之前版本已作廢,待現在版本穩定後,

SVG(向量圖形)繪製工具Method Draw

給大家介紹一個製作svg的工具 當我們在網頁上要繪製一個非常複雜的svg圖片的時候 可以藉助於Method Draw工具進行繪製 繪製完畢後可以匯出為程式碼拷貝到我們的專案當中 不需要下載,這是一個網頁工具 工具地址:傳送門 雖然這個網頁bug很多

Android中自定義點選ImageView

我們平時在開發中,有時候需要在點選控制元件後有一個縮放效果,當然,有些朋友會講這很簡單啊,在資原始檔中給兩個不同的背景,用selecter作為切換,可以達到需要的效果,或者用動畫,這也很好的實現需求。但是,今天我們要做的這個點選縮放控制元件不單單是縮放那麼簡單,

Andrid5.0新特性——SVG(向量圖)

SVG一種用於描述影象的標記語言。類似HTML。 SVG嚴格遵從XML語法,並用文字格式的描述性語言來描述影象內容,因此是一種和影象解析度無關的向量圖形格式。 標準制定開發歷史 2001年9月4日,釋出SVG 1.0。 2003年1月4日,釋出S

Glide網路圖片滑動檢視,(PhotoView example)

需求是,介面中拿到的圖片地址List進行滑動檢視,並且可對圖進行縮放檢視,單張圖片載入使用Glide 實現: 使用 ViewPager滑動載入Fragment,Fragment佈局是一個PhotoView(extends ImageView)進行圖片載入和載入後的縮放 首先

利用canvas製作圖片(和平移)+相框+文字

前言:   公司一個售前問我能不能用H5做一個手機拍照,給相片新增相框和新增文字上傳到伺服器的功能,我當時一琢磨覺得可行,就利用空餘時間做了一個demo,去掉了拍照和上傳,如果以後有機會,會給補上,當然對於開發過webApp的朋友來做到這個很簡單。下面來看程式碼 1,思路  首先我們需要準備

、滑動顯示的折線圖

最近,遇到這樣一個問題,將一組日期和數字為資料來源的資料畫成折線圖。 折線圖可以左右滑動,可以縮放,同時點選檢視的時候可以定位到最近的一個數據點 處理這個我覺得有如下三個難點 一、資料來源資料不連續,需要自己計算生成連續資料來源 二、如何實現

QT中給各控制元件增加背景圖片(旋轉)的幾種方法

1. 給QPushButton 增加背景圖片:背景圖片可根據Button大小自由縮放。 void setButtonBackImage(QPushButton *button,QString image,int sizeW, int sizeH) { //163

[HTML5-SVG]Html5的向量圖形例項SVG

可縮放向量圖形(Scalable Vector Graphics,SVG)是基於可擴充套件標記語言(XML),用於描述二維向量圖形的一種圖形格式。SVG由W3C制定,是一個開放標準。 SVG嚴格遵從XML語法,並用文字格式的描述性語言來描述影象內容,因此是一種和影象解析度無

WPF 仿QQ無邊框窗體(自動隱藏//最大化不覆蓋工作列)

今天做一個綜合案例,WPF的仿QQ窗體,貼邊自動隱藏,無邊框窗體,可拖拽實現縮放,最大化不覆蓋工作列。 無邊框窗體縮放,上一篇文章已經介紹了,不過今天使用的方法更簡單,不會佔用檢視的資源,純程式碼完成。 使用事件: OnMouseLeftButtonDown(),OnMou