前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android自定义控件ImageView实现圆形图片

android自定义控件ImageView实现圆形图片

作者头像
砸漏
发布2020-10-29 19:35:21
1.1K0
发布2020-10-29 19:35:21
举报
文章被收录于专栏:恩蓝脚本

android开发中常常涉及到一种情况,就是将用户上传的图片以圆形样式显示,但是用户上传的图片可以有直角、圆角、正方形等多种不确定样式,这时就用到了自定义ImageView控件,在安卓客户端使接收到的图片全部以圆形样式显示

CircleImageView.java

代码语言:javascript
复制
public class CircleImageView extends ImageView { 
private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP; 
private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888; 
private static final int COLORDRAWABLE_DIMENSION = 2; 
// 圆形边框的厚度默认值。 
// 如果是0,则没有天蓝色渐变的边框。 
private static final int DEFAULT_BORDER_WIDTH = 0; 
private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
private final RectF mDrawableRect = new RectF(); 
private final RectF mBorderRect = new RectF(); 
private final Matrix mShaderMatrix = new Matrix(); 
private final Paint mBitmapPaint = new Paint(); 
private final Paint mBorderPaint = new Paint(); 
private int mBorderColor = DEFAULT_BORDER_COLOR; 
private int mBorderWidth = DEFAULT_BORDER_WIDTH; 
private Bitmap mBitmap; 
private BitmapShader mBitmapShader; 
private int mBitmapWidth; 
private int mBitmapHeight; 
private float mDrawableRadius; 
private float mBorderRadius; 
private boolean mReady; 
private boolean mSetupPending; 
private final Paint mFlagBackgroundPaint = new Paint(); 
private final TextPaint mFlagTextPaint = new TextPaint(); 
private String mFlagText; 
private boolean mShowFlag = false; 
private Rect mFlagTextBounds = new Rect(); 
Shader mSweepGradient = null; 
public CircleImageView(Context context) { 
super(context); 
init(); 
}
public CircleImageView(Context context, AttributeSet attrs) { 
this(context, attrs, 0); 
}
public CircleImageView(Context context, AttributeSet attrs, int defStyle) { 
super(context, attrs, defStyle); 
init(); 
}
private void init() { 
super.setScaleType(SCALE_TYPE); 
mReady = true; 
if (mSetupPending) { 
setup(); 
mSetupPending = false; 
} 
}
@Override
public ScaleType getScaleType() { 
return SCALE_TYPE; 
}
@Override
public void setScaleType(ScaleType scaleType) { 
if (scaleType != SCALE_TYPE) { 
throw new IllegalArgumentException(String.format( 
"ScaleType %s not supported.", scaleType)); 
} 
}
@Override
public void setAdjustViewBounds(boolean adjustViewBounds) { 
if (adjustViewBounds) { 
throw new IllegalArgumentException( 
"adjustViewBounds not supported."); 
} 
}
@Override
protected void onDraw(Canvas canvas) { 
if (getDrawable() == null) { 
return; 
} 
canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, 
mBitmapPaint); 
if (mBorderWidth != 0) { 
canvas.save(); 
canvas.rotate(20, getWidth() / 2, getHeight() / 2); 
canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, 
mBorderPaint); 
canvas.restore(); 
} 
if (mShowFlag && mFlagText != null) { 
canvas.drawArc(mBorderRect, 40, 100, false, mFlagBackgroundPaint); 
mFlagTextPaint.getTextBounds(mFlagText, 0, mFlagText.length(), 
mFlagTextBounds); 
canvas.drawText(mFlagText, getWidth() / 2, 
(float) ((3 + Math.cos((float) (Math.PI * 5 / 18))) 
* getHeight() / 4 + mFlagTextBounds.height() / 3), 
mFlagTextPaint); 
} 
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
super.onSizeChanged(w, h, oldw, oldh); 
setup(); 
}
public int getBorderColor() { 
return mBorderColor; 
}
public void setBorderColor(int borderColor) { 
if (borderColor == mBorderColor) { 
return; 
}
mBorderColor = borderColor; 
mBorderPaint.setColor(mBorderColor); 
invalidate(); 
}
public int getBorderWidth() { 
return mBorderWidth; 
}
/** 
* @param borderWidth 
*  圆形的边框厚度。 
*/
public void setBorderWidth(int borderWidth) { 
if (borderWidth == mBorderWidth) { 
return; 
}
mBorderWidth = borderWidth; 
setup(); 
}
@Override
public void setImageBitmap(Bitmap bm) { 
super.setImageBitmap(bm); 
mBitmap = bm; 
setup(); 
}
@Override
public void setImageDrawable(Drawable drawable) { 
super.setImageDrawable(drawable); 
mBitmap = getBitmapFromDrawable(drawable); 
setup(); 
}
@Override
public void setImageResource(int resId) { 
super.setImageResource(resId); 
mBitmap = getBitmapFromDrawable(getDrawable()); 
setup(); 
}
@Override
public void setImageURI(Uri uri) { 
super.setImageURI(uri); 
mBitmap = getBitmapFromDrawable(getDrawable()); 
setup(); 
}
private Bitmap getBitmapFromDrawable(Drawable drawable) { 
if (drawable == null) { 
return null; 
}
if (drawable instanceof BitmapDrawable) { 
return ((BitmapDrawable) drawable).getBitmap(); 
}
try { 
Bitmap bitmap; 
if (drawable instanceof ColorDrawable) { 
bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, 
COLORDRAWABLE_DIMENSION, BITMAP_CONFIG); 
} else { 
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), 
drawable.getIntrinsicHeight(), BITMAP_CONFIG); 
}
Canvas canvas = new Canvas(bitmap); 
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
drawable.draw(canvas); 
return bitmap; 
} catch (OutOfMemoryError e) { 
return null; 
} 
}
private void setup() { 
if (!mReady) { 
mSetupPending = true; 
return; 
}
if (mBitmap == null) { 
return; 
}
mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, 
Shader.TileMode.CLAMP);
mBitmapPaint.setAntiAlias(true); 
mBitmapPaint.setShader(mBitmapShader);
mBorderPaint.setStyle(Paint.Style.STROKE); 
mBorderPaint.setAntiAlias(true); 
mBorderPaint.setColor(mBorderColor); 
mBorderPaint.setStrokeWidth(mBorderWidth);
mBitmapHeight = mBitmap.getHeight(); 
mBitmapWidth = mBitmap.getWidth();
mBorderRect.set(0, 0, getWidth(), getHeight()); 
mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, 
(mBorderRect.width() - mBorderWidth) / 2);
mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() 
- mBorderWidth, mBorderRect.height() - mBorderWidth); 
mDrawableRadius = Math.min(mDrawableRect.height() / 2, 
mDrawableRect.width() / 2);
mFlagBackgroundPaint.setColor(Color.BLACK & 0x66FFFFFF); 
mFlagBackgroundPaint.setFlags(TextPaint.ANTI_ALIAS_FLAG);
mFlagTextPaint.setFlags(TextPaint.ANTI_ALIAS_FLAG); 
mFlagTextPaint.setTextAlign(Align.CENTER); 
mFlagTextPaint.setColor(Color.WHITE); 
mFlagTextPaint 
.setTextSize(getResources().getDisplayMetrics().density * 18);
mSweepGradient = new SweepGradient(getWidth() / 2, getHeight() / 2, 
new int[] { Color.rgb(255, 255, 255), Color.rgb(1, 209, 255) }, 
null);
mBorderPaint.setShader(mSweepGradient);
updateShaderMatrix(); 
invalidate(); 
}
private void updateShaderMatrix() { 
float scale; 
float dx = 0; 
float dy = 0;
mShaderMatrix.set(null);
if (mBitmapWidth * mDrawableRect.height()   mDrawableRect.width() 
* mBitmapHeight) { 
scale = mDrawableRect.height() / (float) mBitmapHeight; 
dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f; 
} else { 
scale = mDrawableRect.width() / (float) mBitmapWidth; 
dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f; 
}
mShaderMatrix.setScale(scale, scale); 
mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, 
(int) (dy + 0.5f) + mBorderWidth);
mBitmapShader.setLocalMatrix(mShaderMatrix); 
}
public void setShowFlag(boolean show) { 
mShowFlag = show; 
invalidate(); 
}
public void setFlagText(String text) { 
mFlagText = text; 
invalidate(); 
} 
}

activity_main.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"? 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
<com.example.view.CircleImageView
android:layout_width="match_parent"
android:layout_height="match_parent"/ 
</LinearLayout 

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档