Glide圖片載入庫的使用
Glide是 Google推薦的圖片載入庫,它可以支援來自url,Android資源,檔案,Uri中的圖片載入,同時還支援gif圖片的載入,以及各種圖片顯示前的bitmap處理(例如:圓角圖片,圓形圖片,高斯模糊,旋轉,灰度等等),快取處理,請求優先順序處理,動畫處理,縮圖處理,圖片大小自定義等等.可謂是非常的強大.
1.新增Glide庫
需要在build.gradle中加入依賴,目前最新的版本是3.7.0,Glide庫地址
compile 'com.github.bumptech.glide:glide:3.7.0'
2.載入網路圖片
/**
* Created by mChenys on 2016/6/6.
*/
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
String url = "http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png";
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(this ).
load(url).
asBitmap(). //強制處理為bitmap
into(targetView);//顯示到目標View中
}
}
3.載入資源圖片
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
int resourceId = R.drawable.test;
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(this).
load(resourceId).
asBitmap().
into(targetView);
}
}
4.載入本地檔案圖片
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
File file = new File(Environment.getExternalStorageDirectory(), "test.jpg");
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(this).
load(file).
asBitmap().
into(targetView);
}
}
5.從Uri中載入
/**
* Created by mChenys on 2016/6/6.
*/
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
Uri uri = Uri.parse("android.resource://" + this.getPackageName() + "/" + R.drawable.test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(this).
load(uri).
asBitmap().
into(targetView);
}
}
6.載入gif圖片
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(this).
load(R.drawable.smail).
asGif().//注意:這裡顯示的指明瞭要載入的是gif圖片,當然即使不指明,glide也會自己判斷.
into(targetView);
}
}
效果圖:
7.設定預設圖片和載入失敗時顯示的圖片
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(this).
load(R.drawable.test).
asBitmap().
placeholder(R.drawable.bg_loading).//載入中顯示的圖片
error(R.drawable.bg_error).//載入失敗時顯示的圖片
into(targetView);
}
}
8.淡入顯示效果
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(this).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).//載入中顯示的圖片
error(R.drawable.bg_error).//載入失敗時顯示的圖片
crossFade().//淡入顯示,注意:如果設定了這個,則必須要去掉asBitmap
into(targetView);
}
}
另外,crossFade還可以接收一個引數來設定淡入顯示效果的持續時間,crossFade(int duration);
如果你想直接顯示圖片,而不是淡入顯示圖片,則可以通過dontAnimate()方法設定.
9.調整圖片畫素大小
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(this).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).//載入中顯示的圖片
error(R.drawable.bg_error).//載入失敗時顯示的圖片
crossFade(1000).//淡入顯示的時間,注意:如果設定了這個,則必須要去掉asBitmap
override(80,80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
into(targetView);
}
}
10.設定CenterCrop,FitCenter
CenterCrop,FitCenter都是對目標圖片進行裁剪,瞭解過ImageView的ScaleType屬性就知道,這2種裁剪方式在ImageView上也是有的,分別對應ImageView的ImageView.ScaleType.CENTER_CROP和mageView.ScaleType.FIT_CENTER的.
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
Glide.with(this).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).//載入中顯示的圖片
error(R.drawable.bg_error).//載入失敗時顯示的圖片
crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
override(80,80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
centerCrop().//中心裁剪,縮放填充至整個ImageView
into(targetView);
}
}
11.快取策略設定
記憶體快取設定,通過skipMemoryCache(boolean)來設定是否需要快取到記憶體,預設是會快取到記憶體的.
/**
* Created by mChenys on 2016/6/6.
*/
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
Glide.with(this).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).//載入中顯示的圖片
error(R.drawable.bg_error).//載入失敗時顯示的圖片
crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
override(80,80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
centerCrop().//中心裁剪,縮放填充至整個ImageView
skipMemoryCache(true).//跳過記憶體快取
into(targetView);
}
}
磁碟快取,磁碟快取通過diskCacheStrategy(DiskCacheStrategy)來設定,DiskCacheStrategy一共有4種模式:
- DiskCacheStrategy.NONE:什麼都不快取
- DiskCacheStrategy.SOURCE:僅快取原圖(全解析度的圖片)
- DiskCacheStrategy.RESULT:僅快取最終的圖片,即修改了尺寸或者轉換後的圖片
- DiskCacheStrategy.ALL:快取所有版本的圖片,預設模式
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
targetView.setScaleType(ImageView.ScaleType.FIT_CENTER);
Glide.with(this).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).//載入中顯示的圖片
error(R.drawable.bg_error).//載入失敗時顯示的圖片
crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
override(80, 80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
centerCrop().//中心裁剪,縮放填充至整個ImageView
skipMemoryCache(true).//跳過記憶體快取
diskCacheStrategy(DiskCacheStrategy.RESULT).//儲存最終圖片
into(targetView);
}
}
12.快取設定
在GlideModule 中,我們可以設定磁碟快取的位置,磁碟快取的大小和記憶體快取的大小,同時還可以設定圖片的顯示質量.
要是用GlideModule ,需要建立它的實現類,然後在manifests中申明實現類的全類路徑:
<meta-data
android:name="com.example.mchenys.httputilsdemo.image.glide.module.SimpleGlideModule"
android:value="GlideModule" />
GlideModule 的實現類,需要實現applyOptions方法:
/**
* 所以你知道要建立一個額外的類去定製 Glide。
* 下一步是要全域性的去宣告這個類,讓 Glide 知道它應該在哪裡被載入和使用。
* Glide 會掃描 AndroidManifest.xml 為 Glide module 的 meta 宣告。
* 因此,你必須在 AndroidManifest.xml 的 <application> 標籤內去宣告這個SimpleGlideModule。
* Created by mChenys on 2016/6/10.
*/
public class SimpleGlideModule implements GlideModule {
public static DiskCache cache;
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// 在 Android 中有兩個主要的方法對圖片進行解碼:ARGB8888 和 RGB565。前者為每個畫素使用了 4 個位元組,
// 後者僅為每個畫素使用了 2 個位元組。ARGB8888 的優勢是影象質量更高以及能儲存一個 alpha 通道。
// Picasso 使用 ARGB8888,Glide 預設使用低質量的 RGB565。
// 對於 Glide 使用者來說:你使用 Glide module 方法去改變解碼規則。
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
//設定快取目錄
File cacheDir = PathUtils.getDiskCacheDir(context, CacheConfig.IMG_DIR);
cache = DiskLruCacheWrapper.get(cacheDir, DiskCache.Factory.DEFAULT_DISK_CACHE_SIZE);// 250 MB
builder.setDiskCache(new DiskCache.Factory() {
@Override
public DiskCache build() {
return cache;
}
});
//設定memory和Bitmap池的大小
MemorySizeCalculator calculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
int defaultBitmapPoolSize = calculator.getBitmapPoolSize();
int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);
int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);
builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize));
builder.setBitmapPool(new LruBitmapPool(customBitmapPoolSize));
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
13.設定圖片請求的優先順序
Glide 可以用 Priority 列舉來設定圖片的載入優先順序,這樣我們就可以針對那些需要顯示的圖片設定高的優先順序了.
Priority 有4種級別:
Priority.LOW
Priority.NORMAL
Priority.HIGH
Priority.IMMEDIATE
例如:
/**
* 高優先順序載入
* @param url
* @param imageView
* @param listener
*/
public static void loadImageWithHighPriority(Object url,ImageView imageView, final LoaderListener listener) {
if (url == null) {
if (listener != null) {
listener.onError();
}
} else {
Glide.with(imageView.getContext()).
load(url).
asBitmap().
priority(Priority.HIGH).//高優先順序
dontAnimate().
listener(new RequestListener<Object, Bitmap>() {
@Override
public boolean onException(Exception e, Object model, Target<Bitmap> target, boolean isFirstResource) {
if (null != listener) {
listener.onError();
}
return false;
}
@Override
public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
if (null != listener) {
listener.onSuccess();
}
return false;
}
}).into(imageView);
}
}
14.設定載入縮圖
通過設定縮圖,我們可以在顯示目標圖片之前先展示一個第解析度或者其他圖片,當全解析度的目標圖片在後臺載入完成後,
Glide會自動切換顯示全畫素的目標圖片.
設定縮圖有2種方式:
通過thumbnail(float)指定0.0f~1.0f的原始影象大小,例如全畫素的大小是500*500,如果設定為thumbnail為0.1f,即目標圖片的10%,顯示的縮圖大小就是50*50;
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(this).
load(R.drawable.test).
placeholder(R.drawable.bg_loading).//載入中顯示的圖片
error(R.drawable.bg_error).//載入失敗時顯示的圖片
crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
override(80, 80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
centerCrop().//中心裁剪,縮放填充至整個ImageView
skipMemoryCache(true).//跳過記憶體快取
diskCacheStrategy(DiskCacheStrategy.RESULT).//儲存最終圖片
thumbnail(0.1f).//10%的原圖大小
into(targetView);
}
}
通過thumbnail(DrawableRequestBuilder)方式來指定縮圖,該縮圖可以使用load的所有方式(網路,檔案,uri,資源)載入.
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
//縮圖請求
DrawableRequestBuilder<String> thumbnailRequest = Glide
.with(this)
.load("http://www.qq745.com/uploads/allimg/141106/1-141106153Q5.png");
Glide.with(this).
load(R.drawable.test).
// placeholder(R.drawable.bg_loading).//載入中顯示的圖片
// error(R.drawable.bg_error).//載入失敗時顯示的圖片
// crossFade(1000).//淡入淡出,注意:如果設定了這個,則必須要去掉asBitmap
override(80, 80).//設定最終顯示的圖片畫素為80*80,注意:這個是畫素,而不是控制元件的寬高
centerCrop().//中心裁剪,縮放填充至整個ImageView
skipMemoryCache(true).//跳過記憶體快取
diskCacheStrategy(DiskCacheStrategy.RESULT).//儲存最終圖片
thumbnail(thumbnailRequest).//設定縮圖
into(targetView);
}
}
15.Transformations Bitmap
在顯示目標圖片之前,我們可以對目標圖片的Bitmap進行相應的處理,例如::圓角圖片,圓形圖片,高斯模糊,旋轉,灰度等等.
只需要實現Transformation介面即可,該介面的transform方法會返回顯示圖片前的Bitmap物件,在該方法中對
Bitmap的任何處理,都會影響到最終的顯示結果.
當然,如果你只是想要對圖片做常規的 bitmap 轉換,你可以繼承抽象類BitmapTransformation,它簡化了Transformation介面的實現,這應該能覆蓋大部分的應用場景了。
使用的時候,通過transform(Transformation… transformations)來設定.例如:
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(this).
load(R.drawable.test).
asBitmap().
transform(new BlurTransformation(this)).//高斯模糊處理
into(targetView);
}
}
下面貼出常用的幾個Bitmap的轉換處理的程式碼,在github上也有glide-transformations-master庫.
圓圖處理
public class CropCircleTransformation implements Transformation<Bitmap> {
private BitmapPool mBitmapPool;
public CropCircleTransformation(Context context) {
this(Glide.get(context).getBitmapPool());
}
public CropCircleTransformation(BitmapPool pool) {
this.mBitmapPool = pool;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
int size = Math.min(source.getWidth(), source.getHeight());
int width = (source.getWidth() - size) / 2;
int height = (source.getHeight() - size) / 2;
Bitmap bitmap = mBitmapPool.get(size, size, Bitmap.Config.ARGB_8888);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
BitmapShader shader =
new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
if (width != 0 || height != 0) {
// source isn't square, move viewport to center
Matrix matrix = new Matrix();
matrix.setTranslate(-width, -height);
shader.setLocalMatrix(matrix);
}
paint.setShader(shader);
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override public String getId() {
return "CropCircleTransformation()";
}
}
圓角處理
public class RoundedCornersTransformation implements Transformation<Bitmap> {
private BitmapPool mBitmapPool;
private int radius;
private int margin;
public RoundedCornersTransformation(Context context, int radius, int margin) {
this(Glide.get(context).getBitmapPool(), radius, margin);
}
public RoundedCornersTransformation(BitmapPool pool, int radius, int margin) {
mBitmapPool = pool;
this.radius = radius;
this.margin = margin;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
int width = source.getWidth();
int height = source.getHeight();
Bitmap bitmap = mBitmapPool.get(width, height, Bitmap.Config.ARGB_8888);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
canvas.drawRoundRect(new RectF(margin, margin, width - margin, height - margin), radius, radius,
paint);
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override public String getId() {
return "RoundedTransformation(radius=" + radius + ", margin=" + margin + ")";
}
}
灰度處理
public class GrayscaleTransformation implements Transformation<Bitmap> {
private BitmapPool mBitmapPool;
public GrayscaleTransformation(Context context) {
this(Glide.get(context).getBitmapPool());
}
public GrayscaleTransformation(BitmapPool pool) {
mBitmapPool = pool;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
int width = source.getWidth();
int height = source.getHeight();
Bitmap.Config config =
source.getConfig() != null ? source.getConfig() : Bitmap.Config.ARGB_8888;
Bitmap bitmap = mBitmapPool.get(width, height, config);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(width, height, config);
}
Canvas canvas = new Canvas(bitmap);
ColorMatrix saturation = new ColorMatrix();
saturation.setSaturation(0f);
Paint paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(saturation));
canvas.drawBitmap(source, 0, 0, paint);
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override public String getId() {
return "GrayscaleTransformation()";
}
}
旋轉處理
public class RotateTransformation extends BitmapTransformation {
private float rotateRotationAngle = 0f;
public RotateTransformation(Context context, float rotateRotationAngle) {
super(context);
this.rotateRotationAngle = rotateRotationAngle;
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
Matrix matrix = new Matrix();
matrix.postRotate(rotateRotationAngle);
return Bitmap.createBitmap(toTransform, 0, 0, toTransform.getWidth(), toTransform.getHeight(), matrix, true);
}
@Override
public String getId() {
return "rotate" + rotateRotationAngle;
}
}
高斯模糊處理
public class BlurTransformation implements Transformation<Bitmap> {
private static int MAX_RADIUS = 25;
private static int DEFAULT_DOWN_SAMPLING = 1;
private Context mContext;
private BitmapPool mBitmapPool;
private int mRadius;
private int mSampling;
public BlurTransformation(Context context) {
this(context, Glide.get(context).getBitmapPool(), MAX_RADIUS, DEFAULT_DOWN_SAMPLING);
}
public BlurTransformation(Context context, BitmapPool pool) {
this(context, pool, MAX_RADIUS, DEFAULT_DOWN_SAMPLING);
}
public BlurTransformation(Context context, BitmapPool pool, int radius) {
this(context, pool, radius, DEFAULT_DOWN_SAMPLING);
}
public BlurTransformation(Context context, int radius) {
this(context, Glide.get(context).getBitmapPool(), radius, DEFAULT_DOWN_SAMPLING);
}
public BlurTransformation(Context context, BitmapPool pool, int radius, int sampling) {
mContext = context;
mBitmapPool = pool;
mRadius = radius;
mSampling = sampling;
}
public BlurTransformation(Context context, int radius, int sampling) {
mContext = context;
mBitmapPool = Glide.get(context).getBitmapPool();
mRadius = radius;
mSampling = sampling;
}
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
int width = source.getWidth();
int height = source.getHeight();
int scaledWidth = width / mSampling;
int scaledHeight = height / mSampling;
Bitmap bitmap = mBitmapPool.get(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(bitmap);
canvas.scale(1 / (float) mSampling, 1 / (float) mSampling);
Paint paint = new Paint();
paint.setFlags(Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(source, 0, 0, paint);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
try {
bitmap = RSBlur.blur(mContext, bitmap, mRadius);
} catch (RSRuntimeException e) {
bitmap = FastBlur.blur(bitmap, mRadius, true);
}
} else {
bitmap = FastBlur.blur(bitmap, mRadius, true);
}
return BitmapResource.obtain(bitmap, mBitmapPool);
}
@Override public String getId() {
return "BlurTransformation(radius=" + mRadius + ", sampling=" + mSampling + ")";
}
}
網上提供的FastBlur,可相容低版本的高斯模糊處理
public class FastBlur {
public static Bitmap blur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) {
Bitmap bitmap;
if (canReuseInBitmap) {
bitmap = sentBitmap;
} else {
bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
}
if (radius < 1) {
return (null);
}
int w = bitmap.getWidth();
int h = bitmap.getHeight();
int[] pix = new int[w * h];
bitmap.getPixels(pix, 0, w, 0, 0, w, h);
int wm = w - 1;
int hm = h - 1;
int wh = w * h;
int div = radius + radius + 1;
int r[] = new int[wh];
int g[] = new int[wh];
int b[] = new int[wh];
int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
int vmin[] = new int[Math.max(w, h)];
int divsum = (div + 1) >> 1;
divsum *= divsum;
int dv[] = new int[256 * divsum];
for (i = 0; i < 256 * divsum; i++) {
dv[i] = (i / divsum);
}
yw = yi = 0;
int[][] stack = new int[div][3];
int stackpointer;
int stackstart;
int[] sir;
int rbs;
int r1 = radius + 1;
int routsum, goutsum, boutsum;
int rinsum, ginsum, binsum;
for (y = 0; y < h; y++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
for (i = -radius; i <= radius; i++) {
p = pix[yi + Math.min(wm, Math.max(i, 0))];
sir = stack[i + radius];
sir[0] = (p & 0xff0000) >> 16;
sir[1] = (p & 0x00ff00) >> 8;
sir[2] = (p & 0x0000ff);
rbs = r1 - Math.abs(i);
rsum += sir[0] * rbs;
gsum += sir[1] * rbs;
bsum += sir[2] * rbs;
if (i > 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
} else {
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
}
}
stackpointer = radius;
for (x = 0; x < w; x++) {
r[yi] = dv[rsum];
g[yi] = dv[gsum];
b[yi] = dv[bsum];
rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;
stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];
routsum -= sir[0];
goutsum -= sir[1];
boutsum -= sir[2];
if (y == 0) {
vmin[x] = Math.min(x + radius + 1, wm);
}
p = pix[yw + vmin[x]];
sir[0] = (p & 0xff0000) >> 16;
sir[1] = (p & 0x00ff00) >> 8;
sir[2] = (p & 0x0000ff);
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
rsum += rinsum;
gsum += ginsum;
bsum += binsum;
stackpointer = (stackpointer + 1) % div;
sir = stack[(stackpointer) % div];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];
yi++;
}
yw += w;
}
for (x = 0; x < w; x++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
yp = -radius * w;
for (i = -radius; i <= radius; i++) {
yi = Math.max(0, yp) + x;
sir = stack[i + radius];
sir[0] = r[yi];
sir[1] = g[yi];
sir[2] = b[yi];
rbs = r1 - Math.abs(i);
rsum += r[yi] * rbs;
gsum += g[yi] * rbs;
bsum += b[yi] * rbs;
if (i > 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
} else {
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
}
if (i < hm) {
yp += w;
}
}
yi = x;
stackpointer = radius;
for (y = 0; y < h; y++) {
// Preserve alpha channel: ( 0xff000000 & pix[yi] )
pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];
rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;
stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];
routsum -= sir[0];
goutsum -= sir[1];
boutsum -= sir[2];
if (x == 0) {
vmin[y] = Math.min(y + r1, hm) * w;
}
p = x + vmin[y];
sir[0] = r[p];
sir[1] = g[p];
sir[2] = b[p];
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
rsum += rinsum;
gsum += ginsum;
bsum += binsum;
stackpointer = (stackpointer + 1) % div;
sir = stack[stackpointer];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];
yi += w;
}
}
bitmap.setPixels(pix, 0, w, 0, 0, w, h);
return (bitmap);
}
}
RenderScript處理高斯模糊
android4.3之後可使用,需要在build.gradle中配置:
defaultConfig {
//BlurTransformation
renderscriptTargetApi 23
renderscriptSupportModeEnabled true
}
public class RSBlur {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public static Bitmap blur(Context context, Bitmap blurredBitmap, int radius) throws RSRuntimeException {
try {
RenderScript rs = RenderScript.create(context);
Allocation input = Allocation.createFromBitmap(rs, blurredBitmap, Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT);
Allocation output = Allocation.createTyped(rs, input.getType());
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
blur.setInput(input);
blur.setRadius(radius);
blur.forEach(output);
output.copyTo(blurredBitmap);
rs.destroy();
} catch (RSRuntimeException e) {
blurredBitmap = FastBlur.blur(blurredBitmap, radius, true);
}
return blurredBitmap;
}
}
16.動畫處理
通過animate()方法可以設定xml檔案定義的4種補間動畫(alpha、scale、translate、rotate)
例如:
res\anim\left_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="-50%p"
android:toXDelta="0"/>
<alpha
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="0.0"
android:toAlpha="1.0"/>
</set>
使用方式:
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
Glide.with(this).
load(R.drawable.test).
asBitmap().
animate(R.anim.left_in).//載入xml檔案定義的動畫
into(targetView);
}
}
處理此外,還可以通過animate指定屬性動畫:
public class TestGlideActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ImageView targetView = (ImageView) findViewById(R.id.iv_target);
ViewPropertyAnimation.Animator animationObject = new ViewPropertyAnimation.Animator() {
@Override
public void animate(View view) {
//設定屬性動畫
ObjectAnimator moveIn = ObjectAnimator.ofFloat(view, "translationX", -500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(view, "rotation", 0f, 360f);
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f, 1f);
ObjectAnimator moveTop = ObjectAnimator.ofFloat(view, "translationY", 0f, -2000, 0f);
AnimatorSet animSet = new AnimatorSet();
//先左進,然後旋轉伴隨淡入效果,最後移動向上
animSet.play(rotate).with(fadeInOut).after(moveIn).before(moveTop);
animSet.setDuration(5000);
animSet.start();
}
};
Glide.with(this).
load(R.drawable.test).
asBitmap().
animate(animationObject).//載入屬性動畫
into(targetView);
}
}
相關推薦
Android Glide圖片載入庫的使用
簡介 Glide是 Google推薦的圖片載入庫,它可以支援來自url,Android資源,檔案,Uri中的圖片載入,同時還支援gif圖片的載入,以及各種圖片顯示前的bitmap處理(例如:圓角圖片,圓形圖片,高斯模糊,旋轉,灰度等等),快取處理,請求優先順序處理,動畫處理,縮圖處理,圖片大小自定義等等
(原創)詳解Glide圖片載入庫常用方法
Glide作為安卓開發常用的圖片載入庫,有許多實用而且強大的功能,那麼,今天就來總結一番,這次把比較常見的都寫出來,但並不是全部哦。 在介紹之前,先來說說什麼是Glide吧: 在泰國舉行的谷歌開發
Glide 圖片載入庫的坑
1:CircleImageView 使用Glide 載入時,設定placeholder,導致圖片不顯示 // 解決:加上.dontAnimate() .placeholder(R.mipmap.mine_placehold)
Glide圖片載入庫的使用
Glide是 Google推薦的圖片載入庫,它可以支援來自url,Android資源,檔案,Uri中的圖片載入,同時還支援gif圖片的載入,以及各種圖片顯示前的bitmap處理(例如:圓角圖片,圓形圖片,高斯模糊,旋轉,灰度等等),快取處理,請求優先順序處理,動
Aandroid 圖片載入庫Glide 實戰(一),初始,載入進階到實踐
原文: http://blog.csdn.net/sk719887916/article/details/39989293 skay初識Glide為何使用 Glide? 有經驗的 Android 開發者可以跳過這節,但對於初學者來說,你可能會問自己為什麼你想要去用 Gl
圖片載入庫Glide——解決圖片錯亂+無法設定tag
今天在寫一個圖片載入類ImageLoader,在使用的時候想用Glide替代我寫的ImageLoader,然後問題就出來了!!! 第一個問題:在使用自己寫的ImageLoader的時候,為了防止item複用導致的圖片錯亂,設定了Tag 如下程式碼
Google推薦的圖片載入庫Glide介紹
在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide 的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會上釋出的官方app。 毫無疑問,這個庫引起了我的興趣。於是我花了一個晚上研究和
Android圖片載入庫:最全面解析Glide用法
前言 上文已經對當今Android主流的圖片載入庫進行了全面介紹 & 對比 如果你還沒閱讀,我建議你先移步這裡進行檢視 今天我們來學習一下其中一個Android主流的圖片載入庫的使用 - Glide 目錄 1. 簡
Android圖片載入庫Picasso和Glide
之前一直使用,沒有仔細的研究過框架,今天開始想對之前用的框架了解一下,後面打算研究一下原始碼。今天做了一個簡單的瞭解,對兩個框架進行對比。 先說說不同之處: 1.大小,Glide是Picasso的三倍左右 2.GIF圖,Glide支援載入GIF圖,
Google推薦的圖片載入庫Glide介紹及使用
在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide 的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會上釋出的官方app。 毫無疑問,這個庫引起了我的興趣。於是我花了一個晚上研究和
Google推薦的圖片載入庫Glide於Picasso比較
在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide 的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會上釋出的官方app。 Glide和Picasso有90%的相似度,準確
FaceBook推出的Android圖片載入庫-Fresco
一次 人員 的人 java代碼 jpeg markdown 開發 改變 水平 歡迎關註ndroid-tech-frontier開源項目,定期翻譯國外Android優質的技術、開源庫、軟件架構設計、測試等文章 原文鏈接:Intro
Android圖片載入庫的理解
前言 這是“基礎自測”系列的第三篇文章,以Android開發需要熟悉的20個技術點為切入點,本篇重點講講Android中的ImageLoader這個庫的一些理解,在Android上最讓人頭疼是從網路中獲取圖片,顯示,回收,任何一個環節有問題都可能直接OOM,當需要載入大量的圖片的時
Fresco圖片載入庫常見問題
1、android.view.InflateException: Binary XML file line #6: Binary XML file line #6: Error inflating c
android圖片載入庫Glide4使用教程(專案中如何快速將Glide3替換成Glide4)
我想大多數人在自己的專案中還是使用Glide3.7.1這個版本吧!不過Glide版本現在已經到4.4.0了! 當我們把Glide3更換成Glide4,會發現大部分地方都報錯了,那麼該怎樣快速替換Glide3為Glide4呢? 下面我們一起來看看怎樣實現Gli
Android圖片載入庫的封裝實戰
重磅更新 || 2017-02-16 使用ImageLoaderUtil實現一個真正意義的圖集功能,持續完善和更新中 重要的東西貼三遍! 2017-05-09 || 優化圓形圖片載入 更新demo 前言 圖片載
開源圖片載入庫universal-image-loader使用
ImageLoader | | - init(ImageLoaderConfiguration) | - isInited() | - displayImage(...) | - loadImage(...)
Android圖片載入庫—Fresco一個強大的圖片載入元件
介紹 Fresco支援Android2.3(API level 9)及其以上系統。 依賴 由於我用的是android studio所以這裡就只是說一下android studio下如何配置,在強大的gradle,只需要一句話搞定,gr
3分鐘全面瞭解Android主流圖片載入庫
前言 圖片載入在 Android開發專案中非常常見,為了降低開發週期和難度,我們經常會選用一些圖片載入的開源庫,而現在圖片載入開源庫越來越多,我們應該選用哪種呢?今天我就給大家分別介紹 & 對比現今主流的圖片載入框架。 目錄
Android-->Facebook圖片載入庫Fresco(愛它的理由)
在Android中,圖片載入框架很多,很多,很多…都是經典,爆款. Fresco 的 Image Pipeline 負責圖片的獲取和管理。圖片可以來自遠端伺服器,本地檔案,或者Content