版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在android中通过自定义imageview实现一个圆角图片
怎么在android中通过自定义imageview实现一个圆角图片?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(1)在activity_main.xml文件布局,非常简单<?xml
version="1.0"
encoding="utf-8"?>
<LinearLayout
xmlns:android="/apk/res/android"
xmlns:app="/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.administrator.testz.CircleImageView
android:layout_width="160dp"
android:layout_marginLeft="20dp"
android:layout_marginTop="20dp"
android:layout_height="160dp"
android:layout_centerInParent="true"
android:src="@mipmap/icon"
app:civ_border_width="2dp"
app:civ_border_color="@color/colorAccent"
/>
</LinearLayout>2.1注意添加attrs文件,设置图片的属性,然后在java代码中引用属性,在xml文件使用相关属性<?xml
version="1.0"
encoding="utf-8"?>
<resources>
<declare-styleable
name="CircleImageView">
<attr
name="civ_border_width"
format="dimension"
/>
<attr
name="civ_border_color"
format="color"
/>
<attr
name="civ_border_overlay"
format="boolean"
/>
<attr
name="civ_fill_color"
format="color"
/>
<attr
name="civ_circle_background_color"
format="color"
/>
</declare-styleable>
</resources>(2)MainActivity直接导入上面的布局即可,无需其他操作,如果要写监听或者其他操作,需要特别处理,这里仅仅提供显示(3)开源的工具类,图片圆角转换工具类package
com.example.administrator.testz;
import
android.content.Context;
import
android.content.res.TypedArray;
import
android.graphics.Bitmap;
import
android.graphics.BitmapShader;
import
android.graphics.Canvas;
import
android.graphics.Color;
import
android.graphics.ColorFilter;
import
android.graphics.Matrix;
import
android.graphics.Outline;
import
android.graphics.Paint;
import
android.graphics.Rect;
import
android.graphics.RectF;
import
android.graphics.Shader;
import
android.graphics.drawable.BitmapDrawable;
import
android.graphics.drawable.ColorDrawable;
import
android.graphics.drawable.Drawable;
import
.Uri;
import
android.os.Build;
import
android.support.annotation.ColorInt;
import
android.support.annotation.ColorRes;
import
android.support.annotation.DrawableRes;
import
android.support.annotation.RequiresApi;
import
android.util.AttributeSet;
import
android.view.MotionEvent;
import
android.view.View;
import
android.view.ViewOutlineProvider;
import
android.widget.ImageView;
public
class
CircleImageView
extends
ImageView
{
//参考网址:/hdodenhof/CircleImageView
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;
private
static
final
int
DEFAULT_BORDER_WIDTH
=
0;
private
static
final
int
DEFAULT_BORDER_COLOR
=
Color.BLACK;
private
static
final
int
DEFAULT_CIRCLE_BACKGROUND_COLOR
=
Color.TRANSPARENT;
private
static
final
boolean
DEFAULT_BORDER_OVERLAY
=
false;
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
final
Paint
mCircleBackgroundPaint
=
new
Paint();
private
int
mBorderColor
=
DEFAULT_BORDER_COLOR;
private
int
mBorderWidth
=
DEFAULT_BORDER_WIDTH;
private
int
mCircleBackgroundColor
=
DEFAULT_CIRCLE_BACKGROUND_COLOR;
private
Bitmap
mBitmap;
private
BitmapShader
mBitmapShader;
private
int
mBitmapWidth;
private
int
mBitmapHeight;
private
float
mDrawableRadius;
private
float
mBorderRadius;
private
ColorFilter
mColorFilter;
private
boolean
mReady;
private
boolean
mSetupPending;
private
boolean
mBorderOverlay;
private
boolean
mDisableCircularTransformation;
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);
TypedArray
a
=
context.obtainStyledAttributes(attrs,
R.styleable.CircleImageView,
defStyle,
0);
mBorderWidth
=
a.getDimensionPixelSize(R.styleable.CircleImageView_civ_border_width,
DEFAULT_BORDER_WIDTH);
mBorderColor
=
a.getColor(R.styleable.CircleImageView_civ_border_color,
DEFAULT_BORDER_COLOR);
mBorderOverlay
=
a.getBoolean(R.styleable.CircleImageView_civ_border_overlay,
DEFAULT_BORDER_OVERLAY);
//
Look
for
deprecated
civ_fill_color
if
civ_circle_background_color
is
not
set
if
(a.hasValue(R.styleable.CircleImageView_civ_circle_background_color))
{
mCircleBackgroundColor
=
a.getColor(R.styleable.CircleImageView_civ_circle_background_color,
DEFAULT_CIRCLE_BACKGROUND_COLOR);
}
else
if
(a.hasValue(R.styleable.CircleImageView_civ_fill_color))
{
mCircleBackgroundColor
=
a.getColor(R.styleable.CircleImageView_civ_fill_color,
DEFAULT_CIRCLE_BACKGROUND_COLOR);
}
a.recycle();
init();
}
private
void
init()
{
super.setScaleType(SCALE_TYPE);
mReady
=
true;
if
(Build.VERSION.SDK_INT
>=
Build.VERSION_CODES.LOLLIPOP)
{
setOutlineProvider(new
OutlineProvider());
}
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
(mDisableCircularTransformation)
{
super.onDraw(canvas);
return;
}
if
(mBitmap
==
null)
{
return;
}
if
(mCircleBackgroundColor
!=
Color.TRANSPARENT)
{
canvas.drawCircle(mDrawableRect.centerX(),
mDrawableRect.centerY(),
mDrawableRadius,
mCircleBackgroundPaint);
}
canvas.drawCircle(mDrawableRect.centerX(),
mDrawableRect.centerY(),
mDrawableRadius,
mBitmapPaint);
if
(mBorderWidth
>
0)
{
canvas.drawCircle(mBorderRect.centerX(),
mBorderRect.centerY(),
mBorderRadius,
mBorderPaint);
}
}
@Override
protected
void
onSizeChanged(int
w,
int
h,
int
oldw,
int
oldh)
{
super.onSizeChanged(w,
h,
oldw,
oldh);
setup();
}
@Override
public
void
setPadding(int
left,
int
top,
int
right,
int
bottom)
{
super.setPadding(left,
top,
right,
bottom);
setup();
}
@Override
public
void
setPaddingRelative(int
start,
int
top,
int
end,
int
bottom)
{
super.setPaddingRelative(start,
top,
end,
bottom);
setup();
}
public
int
getBorderColor()
{
return
mBorderColor;
}
public
void
setBorderColor(@ColorInt
int
borderColor)
{
if
(borderColor
==
mBorderColor)
{
return;
}
mBorderColor
=
borderColor;
mBorderPaint.setColor(mBorderColor);
invalidate();
}
/**
*
@deprecated
Use
{@link
#setBorderColor(int)}
instead
*/
@Deprecated
public
void
setBorderColorResource(@ColorRes
int
borderColorRes)
{
setBorderColor(getContext().getResources().getColor(borderColorRes));
}
public
int
getCircleBackgroundColor()
{
return
mCircleBackgroundColor;
}
public
void
setCircleBackgroundColor(@ColorInt
int
circleBackgroundColor)
{
if
(circleBackgroundColor
==
mCircleBackgroundColor)
{
return;
}
mCircleBackgroundColor
=
circleBackgroundColor;
mCircleBackgroundPaint.setColor(circleBackgroundColor);
invalidate();
}
public
void
setCircleBackgroundColorResource(@ColorRes
int
circleBackgroundRes)
{
setCircleBackgroundColor(getContext().getResources().getColor(circleBackgroundRes));
}
/**
*
Return
the
color
drawn
behind
the
circle-shaped
drawable.
*
*
@return
The
color
drawn
behind
the
drawable
*
*
@deprecated
Use
{@link
#getCircleBackgroundColor()}
instead.
*/
@Deprecated
public
int
getFillColor()
{
return
getCircleBackgroundColor();
}
/**
*
Set
a
color
to
be
drawn
behind
the
circle-shaped
drawable.
Note
that
*
this
has
no
effect
if
the
drawable
is
opaque
or
no
drawable
is
set.
*
*
@param
fillColor
The
color
to
be
drawn
behind
the
drawable
*
*
@deprecated
Use
{@link
#setCircleBackgroundColor(int)}
instead.
*/
@Deprecated
public
void
setFillColor(@ColorInt
int
fillColor)
{
setCircleBackgroundColor(fillColor);
}
/**
*
Set
a
color
to
be
drawn
behind
the
circle-shaped
drawable.
Note
that
*
this
has
no
effect
if
the
drawable
is
opaque
or
no
drawable
is
set.
*
*
@param
fillColorRes
The
color
resource
to
be
resolved
to
a
color
and
*
drawn
behind
the
drawable
*
*
@deprecated
Use
{@link
#setCircleBackgroundColorResource(int)}
instead.
*/
@Deprecated
public
void
setFillColorResource(@ColorRes
int
fillColorRes)
{
setCircleBackgroundColorResource(fillColorRes);
}
public
int
getBorderWidth()
{
return
mBorderWidth;
}
public
void
setBorderWidth(int
borderWidth)
{
if
(borderWidth
==
mBorderWidth)
{
return;
}
mBorderWidth
=
borderWidth;
setup();
}
public
boolean
isBorderOverlay()
{
return
mBorderOverlay;
}
public
void
setBorderOverlay(boolean
borderOverlay)
{
if
(borderOverlay
==
mBorderOverlay)
{
return;
}
mBorderOverlay
=
borderOverlay;
setup();
}
public
boolean
isDisableCircularTransformation()
{
return
mDisableCircularTransformation;
}
public
void
setDisableCircularTransformation(boolean
disableCircularTransformation)
{
if
(mDisableCircularTransformation
==
disableCircularTransformation)
{
return;
}
mDisableCircularTransformation
=
disableCircularTransformation;
initializeBitmap();
}
@Override
public
void
setImageBitmap(Bitmap
bm)
{
super.setImageBitmap(bm);
initializeBitmap();
}
@Override
public
void
setImageDrawable(Drawable
drawable)
{
super.setImageDrawable(drawable);
initializeBitmap();
}
@Override
public
void
setImageResource(@DrawableRes
int
resId)
{
super.setImageResource(resId);
initializeBitmap();
}
@Override
public
void
setImageURI(Uri
uri)
{
super.setImageURI(uri);
initializeBitmap();
}
@Override
public
void
setColorFilter(ColorFilter
cf)
{
if
(cf
==
mColorFilter)
{
return;
}
mColorFilter
=
cf;
applyColorFilter();
invalidate();
}
@Override
public
ColorFilter
getColorFilter()
{
return
mColorFilter;
}
private
void
applyColorFilter()
{
if
(mBitmapPaint
!=
null)
{
mBitmapPaint.setColorFilter(mColorFilter);
}
}
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
(Exception
e)
{
e.printStackTrace();
return
null;
}
}
private
void
initializeBitmap()
{
if
(mDisableCircularTransformation)
{
mBitmap
=
null;
}
else
{
mBitmap
=
getBitmapFromDrawable(getDrawable());
}
setup();
}
private
void
setup()
{
if
(!mReady)
{
mSetupPending
=
true;
return;
}
if
(getWidth()
==
0
&&
getHeight()
==
0)
{
return;
}
if
(mBitmap
==
null)
{
invalidate();
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);
mCircleBackgroundPaint.setStyle(Paint.Style.FILL);
mCircleBackgroundPaint.setAntiAlias(true);
mCircleBackgroundPaint.setColor(mCircleBackgroundColor);
mBitmapHeight
=
mBitmap.getHeight();
mBitmapWidth
=
mBitmap.getWidth();
mBorderRect.set(calculateBounds());
mBorderRadius
=
Math.min((mBorderRect.height()
-
mBorderWidth)
/
2.0f,
(mBorderRect.width()
-
mBorderWidth)
/
2.0f);
mDrawableRect.set(mBorderRect);
if
(!mBorderOverlay
&&
mBorderWidth
>
0)
{
mDrawableRect.inset(mBorderWidth
-
1.0f,
mBorderWidth
-
1.0f);
}
mDrawableRadius
=
Math.min(mDrawableRect.height()
/
2.0f,
mDrawableRect.width()
/
2.0f);
applyColorFilter();
updateShaderMatrix();
invalidate();
}
private
RectF
calculateBounds()
{
int
availableWidth
=
getWidth()
-
getPaddingLeft()
-
getPaddingRight();
int
availableHeight
=
getHeight()
-
getPaddingTop()
-
getPaddingBottom();
int
sideLength
=
Math.min(availableWidth,
availableHeight);
float
left
=
getPaddingLeft()
+
(availableWidth
-
sideLength)
/
2f;
float
top
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 患者观察和巡视管理制度
- 康复用品管理制度
- 2022年三年级语文下册第六单元主题阅读+答题技巧(含答案、解析)部编版
- 【假期阅读技能提升训练】小学语文三年级下册阅读技能提升内文阅读第5讲-附答案.部编版
- 2024年张家口办理客运从业资格证2024年试题
- 2024年巴中申请客运从业资格证考试题和答案
- 2024年武威道路客运输从业资格证理论考试答案
- 2024年天水道路旅客运输驾驶员从业资格考试试题及答案
- 历史-浙江省湖州、衢州、丽水2024年11月三地市高三教学质量检测试卷试题和答案
- 吉首大学《国际商务礼仪》2021-2022学年第一学期期末试卷
- 八年级物理上册 第四章 第五节《光的色散》说课稿 (新版)新人教版
- 新《劳动法》知识学习考试题库200题(含答案)
- 铭记历史 勿忘国耻九一八事变教育主题班会课件
- 中药蒲公英培训课件
- 2024-2030年中国帆船行业市场深度调研及发展趋势与投资前景研究报告
- 2021年新版《思想道德与法治》第六章课件-学习法治思想提升法治素养
- 2024年全国安康杯安全知识竞赛题库及答案(共239题)
- 2024年新《公司法》主要修订内容解读
- 走进摄影智慧树知到答案2024年海南软件职业技术学院
- 小学六年级数学方程应用题100道附答案(完整版)
- 2024云南黄金集团招聘高校毕业生72人(高频重点提升专题训练)共500题附带答案详解
评论
0/150
提交评论