java圆形头像上传_Android自定义控件实例,圆形头像(图库 + 裁剪+设置),上传头像显示为圆形,附源码...
**
*圓形ImageView,可設(shè)置最多兩個(gè)寬度不同且顏色不同的圓形邊框。*設(shè)置顏色在xml布局文件中由自定義屬性配置參數(shù)指定*/
public class RoundImageView extendsImageView {private int mBorderThickness = 0;privateContext mContext;private int defaultColor = 0xFFFFFFFF;//如果只有其中一個(gè)有值,則只畫一個(gè)圓形邊框
private int mBorderOutsideColor = 0;private int mBorderInsideColor = 0;//控件默認(rèn)長(zhǎng)、寬
private int defaultWidth = 0;private int defaultHeight = 0;//構(gòu)造方法,參數(shù)上下文
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) {//定義畫兩個(gè)邊框,分別為外圓邊框和內(nèi)圓邊框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - 2 *mBorderThickness;//畫內(nèi)圓
drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor);//畫外圓
drawCircleBorder(canvas, radius + mBorderThickness + mBorderThickness / 2, mBorderOutsideColor);
}else if (mBorderInsideColor != defaultColor && mBorderOutsideColor == defaultColor) {//定義畫一個(gè)邊框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 -mBorderThickness;
drawCircleBorder(canvas, radius+ mBorderThickness / 2, mBorderInsideColor);
}else if (mBorderInsideColor == defaultColor && mBorderOutsideColor != defaultColor) {//定義畫一個(gè)邊框
radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 -mBorderThickness;
drawCircleBorder(canvas, radius+ mBorderThickness / 2, mBorderOutsideColor);
}else {//沒(méi)有邊框
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;//為了防止寬高不相等,造成圓形圖片變形,因此截取長(zhǎng)方形中處于中間位置最大的正方形圖片
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);/*設(shè)置paint的 style 為STROKE:空心*/paint.setStyle(Paint.Style.STROKE);/*設(shè)置paint的外框?qū)挾?/paint.setStrokeWidth(mBorderThickness);
canvas.drawCircle(defaultWidth/ 2, defaultHeight / 2, radius, paint);
}
}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java圆形头像上传_Android自定义控件实例,圆形头像(图库 + 裁剪+设置),上传头像显示为圆形,附源码...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Python】list转str
- 下一篇: 【图像】jpg与jpeg的区别