【移动应用开发技术】怎么在android中通过自定义imageview实现一个圆角图片_第1页
【移动应用开发技术】怎么在android中通过自定义imageview实现一个圆角图片_第2页
【移动应用开发技术】怎么在android中通过自定义imageview实现一个圆角图片_第3页
【移动应用开发技术】怎么在android中通过自定义imageview实现一个圆角图片_第4页
【移动应用开发技术】怎么在android中通过自定义imageview实现一个圆角图片_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】怎么在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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论