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 保存圖片 打開 這個不完全是我自己寫的-_-!,但是好用呀 <?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來載入大型圖片,這樣的好處就是不需要對圖片進行壓縮,不會降低圖片顯示的效果,缺點也很明顯,就是不能一次完全顯示出來,一次只能顯示一幅圖片的部分。 先看一下動態效果圖吧: 主佈局檔案: