日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

ImageLoader displayers 之CircleBitmapDisplayer

發(fā)布時(shí)間:2025/3/21 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ImageLoader displayers 之CircleBitmapDisplayer 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ImageLoader這個(gè)圖片加載器是我經(jīng)常使用額一個(gè)圖片加載器(https://github.com/nostra13/Android-Universal-Image-Loader)

這個(gè)圖片加載器在加載的時(shí)候是支持圖片加載效果的,原本自帶了RoundBitmapDisplayer,圓角圖片顯示器。

但是項(xiàng)目的需要,我要弄一個(gè)圓形的圖片,這樣有兩個(gè)思路,

其一,是弄一個(gè)CircleImageView 直接改寫(xiě)ImageView 以達(dá)到圓形圖片的效果

但是這樣有個(gè)問(wèn)題,就是在列表加載的時(shí)候,這個(gè)圖片是不能緩存的,每次都是用重新切圖

其二,使用ImageLoader的BitmapDisplayer ,這個(gè)出來(lái)的圖片是可以緩存到內(nèi)存中的,所以在列表中加載比較有優(yōu)勢(shì)

?

下面就是實(shí)現(xiàn)這種功能代碼

首先我們要實(shí)現(xiàn)一個(gè)最重要的CircleDrawable,就是靠這個(gè)實(shí)現(xiàn)了圓形的功能

? package auggie.library.displayers;import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.Shader; import android.graphics.drawable.Drawable;/*** Created With Android Studio* User @47* Date 2014-07-28* Time 0:32*/ public class CircleDrawable extends Drawable {public static final String TAG = "CircleDrawable";protected final Paint paint;protected final int margin;protected final BitmapShader bitmapShader;protected float radius;protected Bitmap oBitmap;//原圖public CircleDrawable(Bitmap bitmap){this(bitmap,0);}public CircleDrawable(Bitmap bitmap, int margin) {this.margin = margin;this.oBitmap = bitmap;bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);paint = new Paint();paint.setAntiAlias(true);paint.setShader(bitmapShader);}@Overrideprotected void onBoundsChange(Rect bounds) {super.onBoundsChange(bounds);computeBitmapShaderSize();computeRadius();}@Overridepublic void draw(Canvas canvas) {Rect bounds = getBounds();//畫(huà)一個(gè)圓圈canvas.drawCircle(bounds.width() / 2F,bounds.height() / 2F,radius,paint);}@Overridepublic int getOpacity() {return PixelFormat.TRANSLUCENT;}@Overridepublic void setAlpha(int alpha) {paint.setAlpha(alpha);}@Overridepublic void setColorFilter(ColorFilter cf) {paint.setColorFilter(cf);}/*** 計(jì)算Bitmap shader 大小*/public void computeBitmapShaderSize(){Rect bounds = getBounds();if(bounds == null) return;//選擇縮放比較多的縮放,這樣圖片就不會(huì)有圖片拉伸失衡Matrix matrix = new Matrix();float scaleX = bounds.width() / (float)oBitmap.getWidth();float scaleY = bounds.height() / (float)oBitmap.getHeight();float scale = scaleX > scaleY ? scaleX : scaleY;matrix.postScale(scale,scale);bitmapShader.setLocalMatrix(matrix);}/*** 計(jì)算半徑的大小*/public void computeRadius(){Rect bounds = getBounds();radius = bounds.width() < bounds.height() ?bounds.width() /2F - margin:bounds.height() / 2F - margin;} }

接著就是CircleBitmapDisplayer 這個(gè)外殼

package auggie.library.displayers;import android.graphics.Bitmap;import com.nostra13.universalimageloader.core.assist.LoadedFrom; import com.nostra13.universalimageloader.core.display.BitmapDisplayer; import com.nostra13.universalimageloader.core.imageaware.ImageAware; import com.nostra13.universalimageloader.core.imageaware.ImageViewAware;/*** Created With Android Studio* User @47* Date 2014-07-27* Time 20:55* 顯示原型圖片的ImageLoader使用的顯示器**/ public class CircleBitmapDisplayer implements BitmapDisplayer {protected final int margin ;public CircleBitmapDisplayer() {this(0);}public CircleBitmapDisplayer(int margin) {this.margin = margin;}@Overridepublic void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) {if (!(imageAware instanceof ImageViewAware)) {throw new IllegalArgumentException("ImageAware should wrap ImageView. ImageViewAware is expected.");}imageAware.setImageDrawable(new CircleDrawable(bitmap, margin));}}
這樣著在ImageLoader 那里使用就可以了 package org.hangox.circleimageview;import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.widget.ImageView;import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader;import auggie.library.displayers.CircleBitmapDisplayer;public class MainActivity extends ActionBarActivity {ImageView iViewCircleImageDisplayer;String imageUrl = "http://d.hiphotos.baidu" +".com/image/pic/item/9358d109b3de9c8242a7de176e81800a18d84363.jpg";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iViewCircleImageDisplayer = (ImageView) findViewById(R.id.circle_image_displayer);ImageLoader.getInstance().displayImage(imageUrl,iViewCircleImageDisplayer,options); // BitmapDrawable bitmapDrawable = (BitmapDrawable) getResources().getDrawable(R.drawable.test_personal); // iViewCircleImageDisplayer.setImageDrawable(new CircleDrawable(bitmapDrawable.getBitmap())); }DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisk(true).displayer(new CircleBitmapDisplayer()).build();}

效果圖:

總結(jié):其實(shí)我想想做第一種的,結(jié)果我就做第二種的,發(fā)現(xiàn)第二種可以曲線實(shí)現(xiàn)第一種,就是把ImageView里面的Drawable

替換為CircleBitmapDislplayer ,其實(shí)這個(gè)我是寫(xiě)了的,在分開(kāi)庫(kù)的時(shí)候不知道為什么代碼不見(jiàn)了。。。。。。。。

不過(guò),這個(gè)庫(kù)應(yīng)該會(huì)繼續(xù)更新,可能會(huì)用更多的顯示效果

項(xiàng)目地址:https://github.com/L297084910/CircleImageView

轉(zhuǎn)載于:https://www.cnblogs.com/Jabba93/p/3874359.html

總結(jié)

以上是生活随笔為你收集整理的ImageLoader displayers 之CircleBitmapDisplayer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。