網站首頁 編程語言 正文
Android 開發中,經常需要對圖片進行二次處理,比如添加圓角效果 或 顯示圓形圖片;
方法一
通過第三方框架 Glide 設置圓角效果;
寫法1:
RequestOptions options = new RequestOptions().error(R.drawable.img_load_failure).bitmapTransform(new RoundedCorners(30));//圖片圓角為30 Glide.with(this).load(URL) //圖片地址 .apply(options) .into(ImagView);
寫法2:
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);
寫法3:
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(); } /** * 繪制圓角矩形圖片 */ @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); } } /** * 把資源圖片轉換成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); //創建輸出的bitmap Bitmap desBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888); //創建canvas并傳入desBitmap,這樣繪制的內容都會在desBitmap上 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 bitmapShader.setLocalMatrix(matrix); paint.setShader(bitmapShader); //創建矩形區域并且預留出border RectF rect = new RectF(boarder, boarder, outWidth - boarder, outHeight - boarder); //把傳入的bitmap繪制到圓角矩形區域內 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; } }
方法三
對圖片進行處理,還可以加邊框;
/** * 通過BitmapShader實現圓形邊框 * @param bitmap * @param outWidth 輸出的圖片寬度 * @param outHeight 輸出的圖片高度 * @param radius 圓角大小 * @param boarder 邊框寬度 */ 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); //創建輸出的bitmap Bitmap desBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888); //創建canvas并傳入desBitmap,這樣繪制的內容都會在desBitmap上 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 bitmapShader.setLocalMatrix(matrix); paint.setShader(bitmapShader); //創建矩形區域并且預留出border RectF rect = new RectF(boarder, boarder, outWidth - boarder, outHeight - boarder); //把傳入的bitmap繪制到圓角矩形區域內 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; }
實現圓形和邊框:
/** * 通過BitmapShader實現圓形邊框 * @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; } //創建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; }
原文鏈接:https://www.cnblogs.com/herokevin/p/15811691.html
相關推薦
- 2022-10-08 Pandas數據分析-pandas數據框的多層索引_python
- 2021-12-13 C語言數據結構與算法之圖的遍歷(一)_C 語言
- 2022-08-19 Mac上Chrome瀏覽器快捷鍵匯總
- 2023-01-21 python中filter函數的用法示例代碼_python
- 2022-12-15 C++進程鏈接工具之通信器詳解_C 語言
- 2023-04-24 Python?相對路徑報錯:"No?such?file?or?directory"'原因及解決方法_
- 2022-09-10 詳解Python腳本如何設置試用期_python
- 2023-07-15 react實現路由懶加載
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支