1. 程式人生 > >Android開發——使用BitmapRegionDecoder類載入高清巨圖方案

Android開發——使用BitmapRegionDecoder類載入高清巨圖方案

package com.zhy.blogcodes.largeImage.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapRegionDecoder; import android.graphics.Canvas; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import java.io.IOException; import java.io.InputStream; /** * Created by zhy on 15/5/16. */ public class LargeImageView extends View { private BitmapRegionDecoder mDecoder; /** * 圖片的寬度和高度 */ private int mImageWidth, mImageHeight; /** * 繪製的區域 */ private volatile Rect mRect = new Rect(); private MoveGestureDetector mDetector; private static final BitmapFactory.Options options = new BitmapFactory.Options(); static { options.inPreferredConfig = Bitmap.Config.RGB_565; } public void setInputStream(InputStream is) { try { mDecoder = BitmapRegionDecoder.newInstance(is, false); BitmapFactory.Options tmpOptions = new BitmapFactory.Options(); // Grab the bounds for the scene dimensions tmpOptions.inJustDecodeBounds = true; BitmapFactory.decodeStream(is, null, tmpOptions); mImageWidth = tmpOptions.outWidth; mImageHeight = tmpOptions.outHeight; requestLayout(); invalidate(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (is != null) is.close(); } catch (Exception e) { } } } public void init() { mDetector = new MoveGestureDetector(getContext(), new MoveGestureDetector.SimpleMoveGestureDetector() { @Override public boolean onMove(MoveGestureDetector detector) { int moveX = (int) detector.getMoveX(); int moveY = (int) detector.getMoveY(); if (mImageWidth > getWidth()) { mRect.offset(-moveX, 0); checkWidth(); invalidate(); } if (mImageHeight > getHeight()) { mRect.offset(0, -moveY); checkHeight(); invalidate(); } return true; } }); } private void checkWidth() { Rect rect = mRect; int imageWidth = mImageWidth; int imageHeight = mImageHeight; if (rect.right > imageWidth) { rect.right = imageWidth; rect.left = imageWidth - getWidth(); } if (rect.left < 0) { rect.left = 0; rect.right = getWidth(); } } private void checkHeight() { Rect rect = mRect; int imageWidth = mImageWidth; int imageHeight = mImageHeight; if (rect.bottom > imageHeight) { rect.bottom = imageHeight; rect.top = imageHeight - getHeight(); } if (rect.top < 0) { rect.top = 0; rect.bottom = getHeight(); } } public LargeImageView(Context context, AttributeSet attrs) { super(context, attrs); init(); } @Override public boolean onTouchEvent(MotionEvent event) { mDetector.onToucEvent(event); return true; } @Override protected void onDraw(Canvas canvas) { Bitmap bm = mDecoder.decodeRegion(mRect, options); canvas.drawBitmap(bm, 0, 0, null); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width = getMeasuredWidth(); int height = getMeasuredHeight(); int imageWidth = mImageWidth; int imageHeight = mImageHeight; //預設直接顯示圖片的中心區域,可以自己去調節 mRect.left = imageWidth / 2 - width / 2; mRect.top = imageHeight / 2 - height / 2; mRect.right = mRect.left + width; mRect.bottom = mRect.top + height; } }

相關推薦

Android開發——使用BitmapRegionDecoder載入方案

package com.zhy.blogcodes.largeImage.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import a

Android之打造自己載入及瀑布流框架.解決錯位等問題.

    首先看效果圖如下:     本框架支援本地圖片和網路圖片的獲取.採用LruCache演算法,最少使用的最先釋放.有效的避免OOM,專案結構圖:          核心載入類在於ImageLoader.採用了TreadPool去做併發請求.UI處理採用Handler

淺談android載入及圖片壓縮方式(二)

  這一講就是本系列的第二篇,一起來聊下關於android中載入高清大圖的問題,我們都知道如果我們直接載入原圖的話,一個是非常慢,需要等待一定時間,如果沒有在一定的時間內給使用者響應的話,將會極大影響使用者的體驗。另一個是如果你的手機記憶體小的話,可能會直接崩潰。這也就是直

IOS 多個UIImageView 載入時記憶體管理

當我們在某一個View  多個UIImageView,且UIImageView都顯示的是高清大圖,就有可能出現記憶體警告的問題。如果第一次進入這個view,沒有發生記憶體警告,當再次進入這個view,如果上一次的記憶體沒有及時釋放,這一次次的累加,便可導致記憶體崩潰。 1,

Android手機拍照後儲存

Android手機中呼叫系統相機進行拍照的操作很簡單: 1.呼叫系統相機 Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE

runloop實戰應用——載入

問題描述 在用tableVIew或者scrollView載入多張高清大圖的時候,頁面會卡頓。如下圖 原因 runloop在一次渲染中,需要渲染十幾張高清大圖,所以卡主了 解決思路 每次Runloop迴圈,只渲染一張大圖!! 1.

載入

Android 高清載入巨圖方案 拒絕壓縮圖片 一、概述 距離上一篇部落格有段時間沒更新了,主要是最近有些私事導致的,那麼就先來一篇簡單一點的部落格脈動回來。 對於載入圖片,大家都不陌生,一般為了儘可能避免OOM都會按照如下做法: 對於圖片顯示:根據需要顯示圖片控

IOS多個UIImageView載入時記憶體管理

當我們在某一個View  多個UIImageView,且UIImageView都顯示的是高清大圖,就有可能出現記憶體警告的問題。如果第一次進入這個view,沒有發生記憶體警告,當再次進入這個view,如果上一次的記憶體沒有及時釋放,這一次次的累加,便可導致記憶體崩潰。

Android之C面試題①載入方案,拒絕壓縮圖片(BitmapRegionDecoder)

一、概述    對於載入圖片,大家都不陌生,一般為了儘可能避免OOM都會按照如下做法:對於圖片顯示:根據需要顯示圖片控制元件的大小對圖片進行壓縮顯示。如果圖片數量非常多:則會使用LruCache等快取機制,將所有圖片佔據的內容維持在一個範圍內。其實對於圖片載入還有種情況,就是

Android 載入方案 拒絕壓縮圖片 避免oom

一、概述 距離上一篇部落格有段時間沒更新了,主要是最近有些私事導致的,那麼就先來一篇簡單一點的部落格脈動回來。 對於載入圖片,大家都不陌生,一般為了儘可能避免OOM都會按照如下做法: 對於圖片顯示:根據需要顯示圖片控制元件的大小對圖片進行壓縮顯示。如果圖片數量非常多:則會使

Android 載入方案

一、概述 距離上一篇部落格有段時間沒更新了,主要是最近有些私事導致的,那麼就先來一篇簡單一點的部落格脈動回來。 對於載入圖片,大家都不陌生,一般為了儘可能避免OOM都會按照如下做法: 對於圖片顯示:根據需要顯示圖片控制元件的大小對圖片進行壓縮顯示。如果圖片數

Android 開發 Camera的拍照與錄像

har con 無法 函數 個數 管理 enable .html back 前言       在開發Android應用的時候,如果需要調用攝像頭拍照或者錄像,除了通過Intent調用系統現有相機應用進行拍照錄像之外,還可以通過直接調用Camera硬件去去獲取攝像頭進行拍照錄

PHP圖片壓縮無損直接用就ok啦

cti ont extension open () arr from 保存圖片 打開 這個不完全是我自己寫的-_-!,但是好用呀 &lt;?php /** * Created by PhpStorm. * Note:文件介紹 * User: Lynly

android開發--使用webView載入tel協議不會開啟撥號盤解決

在載入url之前進行判斷,url是否是tel協議開頭,然後進行載入,即可開啟撥號盤 mWebView.setWebViewClient(new WebViewClient() {

Android開發之 EditText 上的空按鈕

Android開發時很多時候EditText 輸入框都需要一些 X 一類的清空按鈕,這樣就必須重寫EditText public class UserPwdEditText extends EditText { private final St

Android開發之自定義可空內容的EditText

在開發過程中不可避免的總會遇到比如登入註冊、使用者資訊修改等,這時候又是不可避免的會用到EditText控制元件。這個控制元件的使用頻率雖然幾乎類似我們吃飯用“筷子”的頻率,but能不能用出花樣

Android開發技巧——TextView載入HTML的圖片及程式碼顯示問題

前幾天在做一個Gradle使用者指南的應用程式,使用的是TextView來載入HTML內容(至於為什麼不用WebView,我也沒有認真使用並比較過,也許以後會換吧),其中遇見了一些糾結的問題,所幸主要的問題都一一解決了。 下面說一下遇見的幾個問題及我的解決方法。 TextV

Android開發---AUIL圖片載入框架的使用

AUIL圖片載入框架 使用步驟 注意:要顯示imageloader的圓角效果 imageview必須固定寬高 1.匯入jar包 universal-image-loader.jar 第一個就可以了 2.新增許可權 <uses-permissionandroid:na

Android開發免費庫和工具集合

Android-MultiStateListViewAndroid-ScrollBarPanelDragSortListViewEnhancedListViewHorizontal Variable ListViewListViewAnimationsPagingListViewPlayViewSlideEx

利用圖片區域性解析技術,載入圖片,拒絕壓縮!!!

本篇部落格主要介紹如何使用BitmapRegionDecoder來載入大型圖片,這樣的好處就是不需要對圖片進行壓縮,不會降低圖片顯示的效果,缺點也很明顯,就是不能一次完全顯示出來,一次只能顯示一幅圖片的部分。 先看一下動態效果圖吧: 主佈局檔案: