亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

(原創)Glide圖片加載庫的使用(2)

2019-11-09 14:58:32
字體:
來源:轉載
供稿:網友

Glide是 Google推薦的圖片加載庫,它可以支持來自url,Android資源,文件,Uri中的圖片加載,同時還支持gif圖片的加載,以及各種圖片顯示前的bitmap處理(例如:圓角圖片,圓形圖片,高斯模糊,旋轉,灰度等等),緩存處理,請求優先級處理,動畫處理,縮略圖處理,圖片大小自定義等等.可謂是非常的強大.


1.添加Glide庫

需要在build.gradle中加入依賴,目前最新的版本是3.7.0,Glide庫地址

compile 'com.github.bumptech.glide:glide:3.7.0'11

2.加載網絡圖片

/** * Created by YWH on2017/2/9 */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中 }}1234567891011121314151612345678910111213141516

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); }}12345678910111213141234567891011121314

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); }}123456789101112131415123456789101112131415

5.從Uri中加載

/** * Created by YWH on2017/2/9. */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); }}1234567891011121314151612345678910111213141516

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); }}1234567891011121312345678910111213

效果圖: 這里寫圖片描述


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); }}123456789101112131415123456789101112131415

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); }}123456789101112131415123456789101112131415

另外,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); }}1234567891011121314151612345678910111213141516

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); }}1234567891011121314151617181912345678910111213141516171819

11.緩存策略設置

內存緩存設置,通過skipMemoryCache(boolean)來設置是否需要緩存到內存,默認是會緩存到內存的.

/** * Created by YWH on2017/2/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); 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); }}123456789101112131415161718192021123456789101112131415161718192021

磁盤緩存,磁盤緩存通過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); }}12345678910111213141516171819201234567891011121314151617181920

12.緩存設置

在GlideModule 中,我們可以設置磁盤緩存的位置,磁盤緩存的大小和內存緩存的大小,同時還可以設置圖片的顯示質量.

要是用GlideModule ,需要創建它的實現類,然后在manifests中申明實現類的全類路徑:

<meta-data android:name="com.example.mchenys.httputilsdemo.image.glide.module.SimpleGlideModule" android:value="GlideModule" />123123

GlideModule 的實現類,需要實現applyOptions方法:

/** * 所以你知道要創建一個額外的類去定制 Glide。 * 下一步是要全局的去聲明這個類,讓 Glide 知道它應該在哪里被加載和使用。 * Glide 會掃描 AndroidManifest.xml 為 Glide module 的 meta 聲明。 * 因此,你必須在 AndroidManifest.xml 的 <application> 標簽內去聲明這個SimpleGlideModule。 * Created by YWH on2017/2/9 */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) { }}1234567891011121314151617181920212223242526272829303132333435363738394041424312345678910111213141516171819202122232425262728293031323334353637383940414243

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); } }123456789101112131415161718192021222324252627282930313233343536123456789101112131415161718192021222324252627282930313233343536

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); }}123456789101112131415161718192021123456789101112131415161718192021

通過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); }}1234567891011121314151617181920212223242512345678910111213141516171819202122232425

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); }}1234567891011121312345678910111213

下面貼出常用的幾個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()"; }}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484912345678910111213141516171819202122232425262728293031323334353637383940414243444546474849

圓角處理

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 + ")"; }}1234567891011121314151617181920212223242526272829303132333435363738394041424312345678910111213141516171819202122232425262728293031323334353637383940414243

灰度處理

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()"; }}12345678910111213141516171819202122232425262728293031323334353637383940411234567891011121314151617181920212223242526272829303132333435363738394041

旋轉處理

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; }}123456789101112131415161718192021222324123456789101112131415161718192021222324

高斯模糊處理

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 + ")"; }}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778

網上提供的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); }}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209

RenderScript處理高斯模糊

android4.3之后可使用,需要在build.gradle中配置:

defaultConfig { //BlurTransformation renderscriptTargetApi 23 renderscriptSupportModeEnabled true}123456123456public 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; }}1234567891011121314151617181920212212345678910111213141516171819202122

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>123456789101112123456789101112

使用方式:

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); }}1234567891011121312345678910111213

處理此外,還可以通過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); }}12345678910111213141516171819202122232425262728291234567891011121314151617181920212223242526272829
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品一区二区三区在线| 美女久久久久久久| 91精品国产成人| 亚洲美女久久久| 国产精品天天狠天天看| 日韩av色在线| 中文字幕日本精品| 色爱精品视频一区| 日韩av影视在线| 国产精品电影久久久久电影网| 国产精品h在线观看| 亚洲人成五月天| 久久国产精品99国产精| 中文字幕久热精品在线视频| 91久久精品美女| 国产最新精品视频| 国产成人短视频| 午夜美女久久久久爽久久| 性色av一区二区咪爱| 国产精品久久一区| 成人午夜在线影院| 亚洲成人激情图| 亚洲日本成人网| 亚洲色图18p| 欧美精品aaa| 国外成人性视频| 久久精品影视伊人网| 欧美丰满老妇厨房牲生活| 97视频在线观看免费| 国产亚洲视频中文字幕视频| 亚洲毛片在线免费观看| 久久久久国产精品免费| 91久久精品美女高潮| 91免费人成网站在线观看18| 国产99久久精品一区二区永久免费| 国产亚洲视频在线| 亚洲激情小视频| 色综合久久88色综合天天看泰| 国产精品久久久久久久美男| 美日韩精品免费观看视频| 亚洲人成电影网站色| 亚洲18私人小影院| 成人免费观看a| 欧美精品激情在线观看| 国模精品系列视频| 伊人伊成久久人综合网小说| 91av在线免费观看| 久久av红桃一区二区小说| 91丨九色丨国产在线| 欧美中文字幕在线播放| 国色天香2019中文字幕在线观看| 热久久这里只有| 亚洲欧洲偷拍精品| 欧美小视频在线观看| 亚洲无av在线中文字幕| 国产精品视频中文字幕91| 国产一区二区三区在线观看视频| 91亚洲午夜在线| 综合国产在线视频| 九九久久精品一区| 久青草国产97香蕉在线视频| 亚洲欧美日韩精品久久| 国产日韩欧美视频| 欧美最猛性xxxxx亚洲精品| 久久国产精品视频| 一本色道久久88亚洲综合88| 国产福利精品av综合导导航| 日韩高清中文字幕| 国产精品旅馆在线| 中文字幕少妇一区二区三区| 九九热精品视频国产| 久久好看免费视频| 中文字幕久热精品视频在线| 国产精品偷伦视频免费观看国产| 午夜精品美女自拍福到在线| 精品人伦一区二区三区蜜桃网站| 中文字幕不卡av| 日本午夜精品理论片a级appf发布| 国产精品偷伦视频免费观看国产| 欧美国产日本高清在线| 国产成人精品免费久久久久| 久久综合亚洲社区| 国产精品一区二区性色av| 亚洲石原莉奈一区二区在线观看| 精品久久久一区| 亚洲男人av电影| 国产精品自产拍在线观看| 91欧美视频网站| 91精品国产高清久久久久久久久| 国产精品久久久久久久久久小说| 精品国产一区二区三区久久久| 日韩最新在线视频| 日韩av手机在线看| 5252色成人免费视频| 亚洲美女精品成人在线视频| 中文字幕欧美专区| 日韩精品在线观看网站| 亚洲乱码av中文一区二区| 欧美人与性动交a欧美精品| 亚洲国产精品va| 久久久免费高清电视剧观看| 亚洲日韩中文字幕| 欧美日韩亚洲一区二| 久久精品人人爽| 国产美女主播一区| 国产成人午夜视频网址| 成人午夜一级二级三级| 成人欧美一区二区三区在线湿哒哒| 亚洲女人天堂网| 久99九色视频在线观看| 国产亚洲欧美aaaa| 日韩亚洲第一页| 亚洲伊人第一页| 一道本无吗dⅴd在线播放一区| 成人福利免费观看| 国产精品av免费在线观看| 欧美激情网站在线观看| 久久91精品国产| 亚洲jizzjizz日本少妇| 97精品视频在线观看| 欧美成人自拍视频| 国产精品久久久久免费a∨| 欧美亚洲另类制服自拍| 亚洲网站在线观看| 欧美性精品220| 亚洲3p在线观看| 久久香蕉国产线看观看网| 成人精品视频久久久久| 日韩hd视频在线观看| 亚洲国产精品网站| 欧洲s码亚洲m码精品一区| 一区二区成人av| 欧美激情一区二区久久久| 91精品免费视频| 久久国产天堂福利天堂| 国产精品三级久久久久久电影| 97国产suv精品一区二区62| 欧美色图在线视频| 亚洲www视频| 4438全国亚洲精品在线观看视频| 精品亚洲一区二区三区| 成人激情视频小说免费下载| 色偷偷9999www| 中文字幕成人精品久久不卡| 国产成人极品视频| 影音先锋日韩有码| 欧美精品一区二区免费| 九九热在线精品视频| 亚洲精品视频播放| 国产综合久久久久久| 欧美激情日韩图片| 美女视频久久黄| 一个人www欧美| 国产美女直播视频一区| 亚洲激情第一页| 亚洲一区二区中文字幕| 亚洲国产欧美自拍| 欧美激情亚洲自拍| 亚洲国产天堂久久综合| 欧美性猛交xxxx免费看久久久| 成人久久久久久久| 日韩av一区二区在线观看| 在线性视频日韩欧美| 这里只有精品丝袜|