Android設(shè)置圖片圓角的方法
Android中經(jīng)常會(huì)遇到對圖片進(jìn)行二次處理,例如加圓角,或者顯示圓形圖片
實(shí)現(xiàn)的效果圖:

方法一:
通過第三方框架Glide實(shí)現(xiàn)圖片顯示有圓角,有三種寫法如下:
1.1、第一種實(shí)現(xiàn):
RequestOptions options = new RequestOptions().error(R.drawable.img_load_failure).bitmapTransform(new RoundedCorners(30));//圖片圓角為30
Glide.with(this).load(URL) //圖片地址
.apply(options)
.into(ImagView);
1.2、第二種實(shí)現(xiàn):
RequestOptions requestOptions = new RequestOptions();
requestOptions.placeholder(R.drawable.ic_launcher_background);
requestOptions.circleCropTransform();
requestOptions.transforms( new RoundedCorners(30));
Glide.with(this).load(URL) //圖片地址
.apply(options)
.into(ImagView);
1.3、第三種實(shí)現(xiàn):
RequestOptions options = new RequestOptions().centerCrop() .transform(new RoundTransform(this,30));
Glide.with(this).load(URL) //圖片地址
.apply(options)
.into(ImagView);
public class RoundTransform extends BitmapTransformation {
private static float radius = 0f;
public RoundTransform(Context context) {
this(context, 4);
}
public RoundTransform(Context context, int dp) {
super(context);
this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
Bitmap bitmap = TransformationUtils.centerCrop(pool, toTransform, outWidth, outHeight);
return roundCrop(pool, bitmap);
}
private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
if (source == null) return null;
Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rectF, radius, radius, paint);
return result;
}
public String getId() {
return getClass().getName() + Math.round(radius);
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {
}
}
方法二:
自定義ImageView:
<ImageView android:id="@+id/iv" android:layout_width="300dp" android:layout_height="300dp" android:layout_centerHorizontal="true" />
ImageView iv = findViewById(R.id.iv); Bitmap bitmap =BitmapFactory.decodeResource(getResources(), R.drawable.fengjing); Bitmap outBitmap =getRoundBitmapByShader(bitmap, 500,300,20, 3); iv.setImageBitmap(outBitmap);
public class RoundRectImageView extends ImageView{
private Paint paint;
public RoundRectImageView(Context context) {
this(context,null);
}
public RoundRectImageView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public RoundRectImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
paint = new Paint();
}
/**
* 繪制圓角矩形圖片
* @author caizhiming
*/
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (null != drawable) {
Bitmap bitmap = getBitmapFromDrawable(drawable);
// Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
Bitmap b = getRoundBitmapByShader(bitmap,getWidth(),getHeight(), 50,0);
final Rect rectSrc = new Rect(0, 0, b.getWidth(), b.getHeight());
final Rect rectDest = new Rect(0,0,getWidth(),getHeight());
paint.reset();
canvas.drawBitmap(b, rectSrc, rectDest, paint);
} else {
super.onDraw(canvas);
}
}
/**
* 把資源圖片轉(zhuǎn)換成Bitmap
* @param drawable
* 資源圖片
* @return 位圖
*/
public static Bitmap getBitmapFromDrawable(Drawable drawable) {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, drawable
.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
//drawable.setBounds(-4, -4, width + 4, height + 4);
drawable.draw(canvas);
return bitmap;
}
public static Bitmap getRoundBitmapByShader(Bitmap bitmap, int outWidth, int outHeight, int radius, int boarder) {
if (bitmap == null) {
return null;
}
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float widthScale = outWidth * 1f / width;
float heightScale = outHeight * 1f / height;
Matrix matrix = new Matrix();
matrix.setScale(widthScale, heightScale);
//創(chuàng)建輸出的bitmap
Bitmap desBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888);
//創(chuàng)建canvas并傳入desBitmap,這樣繪制的內(nèi)容都會(huì)在desBitmap上
Canvas canvas = new Canvas(desBitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
//創(chuàng)建著色器
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//給著色器配置matrix
bitmapShader.setLocalMatrix(matrix);
paint.setShader(bitmapShader);
//創(chuàng)建矩形區(qū)域并且預(yù)留出border
RectF rect = new RectF(boarder, boarder, outWidth - boarder, outHeight - boarder);
//把傳入的bitmap繪制到圓角矩形區(qū)域內(nèi)
canvas.drawRoundRect(rect, radius, radius, paint);
if (boarder > 0) {
//繪制boarder
Paint boarderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
boarderPaint.setColor(Color.GREEN);
boarderPaint.setStyle(Paint.Style.STROKE);
boarderPaint.setStrokeWidth(boarder);
canvas.drawRoundRect(rect, radius, radius, boarderPaint);
}
return desBitmap;
}
}
方法三:
對圖片進(jìn)行處理,此方法還可以加邊框
/**
* 通過BitmapShader實(shí)現(xiàn)圓形邊框
* @param bitmap
* @param outWidth 輸出的圖片寬度
* @param outHeight 輸出的圖片高度
* @param radius 圓角大小
* @param boarder 邊框?qū)挾?
*/
public static Bitmap getRoundBitmapByShader(Bitmap bitmap, int outWidth, int outHeight, int radius, int boarder) {
if (bitmap == null) {
return null;
}
int height = bitmap.getHeight();
int width = bitmap.getWidth();
float widthScale = outWidth * 1f / width;
float heightScale = outHeight * 1f / height;
Matrix matrix = new Matrix();
matrix.setScale(widthScale, heightScale);
//創(chuàng)建輸出的bitmap
Bitmap desBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888);
//創(chuàng)建canvas并傳入desBitmap,這樣繪制的內(nèi)容都會(huì)在desBitmap上
Canvas canvas = new Canvas(desBitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
//創(chuàng)建著色器
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//給著色器配置matrix
bitmapShader.setLocalMatrix(matrix);
paint.setShader(bitmapShader);
//創(chuàng)建矩形區(qū)域并且預(yù)留出border
RectF rect = new RectF(boarder, boarder, outWidth - boarder, outHeight - boarder);
//把傳入的bitmap繪制到圓角矩形區(qū)域內(nèi)
canvas.drawRoundRect(rect, radius, radius, paint);
if (boarder > 0) {
//繪制boarder
Paint boarderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
boarderPaint.setColor(Color.GREEN);
boarderPaint.setStyle(Paint.Style.STROKE);
boarderPaint.setStrokeWidth(boarder);
canvas.drawRoundRect(rect, radius, radius, boarderPaint);
}
return desBitmap;
}
實(shí)現(xiàn)圓形和邊框:
/**
* 通過BitmapShader實(shí)現(xiàn)圓形邊框
* @param bitmap
* @param outWidth 輸出的圖片寬度
* @param outHeight 輸出的圖片高度
* @param boarder 邊框大小
*/
public static Bitmap getCircleBitmapByShader(Bitmap bitmap, int outWidth, int outHeight, int boarder) {
int radius;
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float widthScale = outWidth * 1f / width;
float heightScale = outHeight * 1f / height;
Bitmap desBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888);
if (outHeight > outWidth) {
radius = outWidth / 2;
} else {
radius = outHeight / 2;
}
//創(chuàng)建canvas
Canvas canvas = new Canvas(desBitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
Matrix matrix = new Matrix();
matrix.setScale(widthScale, heightScale);
bitmapShader.setLocalMatrix(matrix);
paint.setShader(bitmapShader);
canvas.drawCircle(outWidth / 2, outHeight / 2, radius - boarder, paint);
if (boarder > 0) {
//繪制boarder
Paint boarderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
boarderPaint.setColor(Color.GREEN);
boarderPaint.setStyle(Paint.Style.STROKE);
boarderPaint.setStrokeWidth(boarder);
canvas.drawCircle(outWidth / 2, outHeight / 2, radius - boarder, boarderPaint);
}
return desBitmap;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android之聯(lián)系人PinnedHeaderListView使用介紹
Android聯(lián)系人中的ListView是做得比較獨(dú)特的,這幾天,我把他提取出來了,寫成一個(gè)簡單的例子,留著備用,感興趣的朋友可以參考下哈2013-06-06
android實(shí)現(xiàn)程序自動(dòng)升級到安裝示例分享(下載android程序安裝包)
這篇文章主要介紹了android實(shí)現(xiàn)下載android程序安裝包自動(dòng)升級的示例,大家參考使用吧2014-01-01
RxJava加Retrofit文件分段上傳實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了RxJava加Retrofit文件分段上傳實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android4.4+ 實(shí)現(xiàn)半透明狀態(tài)欄(Translucent Bars)
這篇文章主要為大家詳細(xì)介紹了Android4.4+ 實(shí)現(xiàn)半透明狀態(tài)欄,對狀態(tài)欄(Status Bar)和下方導(dǎo)航欄(Navigation Bar)進(jìn)行半透明處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Android 圖文詳解Binder進(jìn)程通信底層原理
Android系統(tǒng)中,多進(jìn)程間的通信都是依賴于底層Binder IPC機(jī)制,Binder機(jī)制是一種RPC方案。例如:當(dāng)進(jìn)程A中的Activity與進(jìn)程B中的Service通信時(shí),就使用了binder機(jī)制2021-10-10
詳解Java編程中的反射在Android開發(fā)中的應(yīng)用
這篇文章主要介紹了詳解Java編程中的反射在Android開發(fā)中的應(yīng)用,主要來獲取安卓系統(tǒng)的屬性值,需要的朋友可以參考下2015-07-07
Android多種方式實(shí)現(xiàn)相機(jī)圓形預(yù)覽的示例代碼
這篇文章主要介紹了Android多種方式實(shí)現(xiàn)相機(jī)圓形預(yù)覽的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
android實(shí)現(xiàn)一鍵鎖屏和一鍵卸載的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于android如何實(shí)現(xiàn)一鍵鎖屏和一鍵卸載的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-05-05
Android 關(guān)閉多個(gè)Activity的實(shí)現(xiàn)方法
這篇文章主要介紹了Android 關(guān)閉多個(gè)Activity的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09

