java圆形头像上传_Android自定义控件实例,圆形头像(图库 + 裁剪+设置),上传头像显示为圆形,附源码...
**
*圓形ImageView,可設置最多兩個寬度不同且顏色不同的圓形邊框。*設置顏色在xml布局文件中由自定義屬性配置參數指定*/
public class RoundImageView extendsImageView {private int mBorderThickness = 0;privateContext mContext;private int defaultColor = 0xFFFFFFFF;//如果只有其中一個有值,則只畫一個圓形邊框
private int mBorderOutsideColor = 0;private int mBorderInsideColor = 0;//控件默認長、寬
private int defaultWidth = 0;private int defaultHeight = 0;//構造方法,參數上下文
publicRoundImageView(Context context) {super(context);
mContext=context;
}publicRoundImageView(Context context, AttributeSet attrs) {super(context, attrs);
mContext=context;
setCustomAttributes(attrs);
}public RoundImageView(Context context, AttributeSet attrs, intdefStyle) {super(context, attrs, defStyle);
mContext=context;
setCustomAttributes(attrs);
}private voidsetCustomAttributes(AttributeSet attrs) {
TypedArray a=mContext.obtainStyledAttributes(attrs, R.styleable.roundedimageview);
mBorderThickness= a.getDimensionPixelSize(R.styleable.roundedimageview_border_thickness, 0);
mBorderOutsideColor=a.getColor(R.styleable.roundedimageview_border_outside_color, defaultColor);
mBorderInsideColor=a.getColor(R.styleable.roundedimageview_border_inside_color, defaultColor);
}
@Overrideprotected voidonDraw(Canvas canvas) {
Drawable drawable=getDrawable();if (drawable == null) {return;
}if (getWidth() == 0 || getHeight() == 0) {return;
}this.measure(0, 0);if (drawable.getClass() == NinePatchDrawable.class)return;
Bitmap b=((BitmapDrawable) drawable).getBitmap();
Bitmap bitmap= b.copy(Bitmap.Config.ARGB_8888, true);if (defaultWidth == 0) {
defaultWidth=getWidth();
}if (defaultHeight == 0) {
defaultHeight=getHeight();
}int radius = 0;if (mBorderInsideColor != defaultColor && mBorderOutsideColor != defaultColor) {//定義畫兩個邊框,分別為外圓邊框和內圓邊框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - 2 *mBorderThickness;//畫內圓
drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor);//畫外圓
drawCircleBorder(canvas, radius + mBorderThickness + mBorderThickness / 2, mBorderOutsideColor);
}else if (mBorderInsideColor != defaultColor && mBorderOutsideColor == defaultColor) {//定義畫一個邊框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 -mBorderThickness;
drawCircleBorder(canvas, radius+ mBorderThickness / 2, mBorderInsideColor);
}else if (mBorderInsideColor == defaultColor && mBorderOutsideColor != defaultColor) {//定義畫一個邊框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 -mBorderThickness;
drawCircleBorder(canvas, radius+ mBorderThickness / 2, mBorderOutsideColor);
}else {//沒有邊框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2;
}
Bitmap roundBitmap=getCroppedRoundBitmap(bitmap, radius);
canvas.drawBitmap(roundBitmap, defaultWidth/ 2 - radius, defaultHeight / 2 - radius, null);
}/*** 獲取裁剪后的圓形圖片
*
*@param
*/
//radius半徑
public Bitmap getCroppedRoundBitmap(Bitmap bmp, intradius) {
Bitmap scaledSrcBmp;int diameter = radius * 2;//為了防止寬高不相等,造成圓形圖片變形,因此截取長方形中處于中間位置最大的正方形圖片
int bmpWidth =bmp.getWidth();int bmpHeight =bmp.getHeight();int squareWidth = 0, squareHeight = 0;int x = 0, y = 0;
Bitmap squareBitmap;if (bmpHeight > bmpWidth) {//高大于寬
squareWidth = squareHeight =bmpWidth;
x= 0;
y= (bmpHeight - bmpWidth) / 2;//截取正方形圖片
squareBitmap =Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
}else if (bmpHeight < bmpWidth) {//寬大于高
squareWidth = squareHeight =bmpHeight;
x= (bmpWidth - bmpHeight) / 2;
y= 0;
squareBitmap=Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
}else{
squareBitmap=bmp;
}if (squareBitmap.getWidth() != diameter || squareBitmap.getHeight() !=diameter) {
scaledSrcBmp= Bitmap.createScaledBitmap(squareBitmap, diameter, diameter, true);
}else{
scaledSrcBmp=squareBitmap;
}
Bitmap output=Bitmap.createBitmap(scaledSrcBmp.getWidth(),
scaledSrcBmp.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas= newCanvas(output);
Paint paint= newPaint();
Rect rect= new Rect(0, 0, scaledSrcBmp.getWidth(), scaledSrcBmp.getHeight());
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
canvas.drawCircle(scaledSrcBmp.getWidth()/ 2,
scaledSrcBmp.getHeight()/ 2,
scaledSrcBmp.getWidth()/ 2,
paint);
paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);
bmp= null;
squareBitmap= null;
scaledSrcBmp= null;returnoutput;
}/*** 邊緣畫圓*/
private void drawCircleBorder(Canvas canvas, int radius, intcolor) {
Paint paint= newPaint();/*去鋸齒*/paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
paint.setColor(color);/*設置paint的 style 為STROKE:空心*/paint.setStyle(Paint.Style.STROKE);/*設置paint的外框寬度*/paint.setStrokeWidth(mBorderThickness);
canvas.drawCircle(defaultWidth/ 2, defaultHeight / 2, radius, paint);
}
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java圆形头像上传_Android自定义控件实例,圆形头像(图库 + 裁剪+设置),上传头像显示为圆形,附源码...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】list转str
- 下一篇: 【图像】jpg与jpeg的区别