package com.cisetech.circleviewdemo;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.Xfermode;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.ImageView;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
/**
* author:yinqingy
* date:2016-10-09 21:14
* blog:http://blog.csdn.net/vv_bug
* desc:
*/
public class CricleXfexrmode extends ImageView {
/**
* 默认圆角半径
*/
public static final int DEFAULT_RADIUS = 10;
/**
* 圆形
*/
public static final int TYPE_CIRCLE = 0;
/**
* 圆角
*/
public static final int TYPE_ROUND = 1;
/**
* 图片的类型,圆形or圆角
*/
private int mType = TYPE_CIRCLE;
/**
* 圆角半径
*/
private int mRadius = DEFAULT_RADIUS;
/**
* 弱引用
*/
private WeakReference<Bitmap> mWeakBitmap;
private Paint mPaint;
private Xfermode mXfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
private Bitmap mMaskBitmap;
public CricleXfexrmode(Context context) {
this(context, null);
}
public CricleXfexrmode(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CricleXfexrmode(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
obtainStyleAttr(context, attrs, defStyleAttr);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
}
/**
* 获取attr
*/
private void obtainStyleAttr(Context context, AttributeSet set, int defStyleAttr) {
TypedArray a = context.obtainStyledAttributes(set, R.styleable.CricleXfexrmode, defStyleAttr, 0);
mRadius = a.getDimensionPixelSize(R.styleable.CricleXfexrmode_borderRadius, dp2px(DEFAULT_RADIUS));
mType = a.getInteger(R.styleable.CricleXfexrmode_type, mType);
a.recycle();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
@Override
protected void onDraw(Canvas canvas) {
Bitmap bitmap = mWeakBitmap == null ? null : mWeakBitmap.get();
if (bitmap == null || bitmap.isRecycled()) {
//获取Drawable
Drawable drawable = getDrawable();
if (drawable != null) {
bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Matrix matrix=null;
Canvas dstCanvas = new Canvas(bitmap);
dstCanvas.save();
if (getScaleType()==ScaleType.FIT_XY){
drawable.setBounds(0,0,getWidth(),getHeight());
matrix=null;
}else{
matrix=new Matrix();
getMatric(drawable,matrix);
}
if(matrix!=null){
dstCanvas.concat(matrix);
}
drawable.draw(dstCanvas);
dstCanvas.restore();
if (mMaskBitmap == null || mMaskBitmap.isRecycled()) {
mMaskBitmap = getBitmap();
}
mPaint.reset();
mPaint.setFilterBitmap(false);
mPaint.setXfermode(mXfermode);
dstCanvas.drawBitmap(mMaskBitmap, 0, 0, mPaint);
mPaint.setXfermode(null);
canvas.drawBitmap(bitmap, 0, 0, null);
mWeakBitmap = new WeakReference<Bitmap>(bitmap);
}
} else if (bitmap != null) {
mPaint.setXfermode(null);
canvas.drawBitmap(bitmap, 0.0f, 0.0f, mPaint);
}
}
private Bitmap getBitmap() {
Bitmap bitmap =null;
bitmap= Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.BLACK);
if (TYPE_CIRCLE == mType) {
canvas.drawCircle(canvas.getWidth() / 2, canvas.getHeight() / 2, canvas.getWidth() / 2, paint);
} else {
canvas.drawRoundRect(new RectF(0, 0, canvas.getWidth(), canvas.getHeight()), mRadius, mRadius, paint);
}
return bitmap;
}
@Override
public void invalidate() {
mWeakBitmap = null;
if (mMaskBitmap != null) {
mMaskBitmap.recycle();
mMaskBitmap = null;
}
super.invalidate();
}
/**
* dp2px
* @param value
* @return px
*/
private int dp2px(int value) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, getContext().getResources().getDisplayMetrics());
}
private void getMatric(Drawable drawable, Matrix matrix) {
ScaleType mScaleType = getScaleType();
//获取图片的宽高
int dwidth = drawable.getIntrinsicWidth();
int dheight = drawable.getIntrinsicHeight();
int vwidth =getWidth();
int vheight = getHeight();
if (ScaleType.MATRIX == mScaleType) {
/////
} else if (ScaleType.CENTER_CROP == mScaleType) {
float scale;
float dx = 0, dy = 0;
if (dwidth * vheight > vwidth * dheight) {
scale = (float) vheight / (float) dheight;
dx = (vwidth - dwidth * scale) * 0.5f;
} else {
scale = (float) vwidth / (float) dwidth;
dy = (vheight - dheight * scale) * 0.5f;
}
matrix.setScale(scale, scale);
matrix.postTranslate(Math.round(dx), Math.round(dy));
} else if (ScaleType.CENTER_INSIDE == mScaleType) {
float scale;
float dx;
float dy;
if (dwidth <= vwidth && dheight <= vheight) {
scale = 1.0f;
} else {
scale = Math.min((float) vwidth / (float) dwidth,
(float) vheight / (float) dheight);
}
dx = Math.round((vwidth - dwidth * scale) * 0.5f);
dy = Math.round((vheight - dheight * scale) * 0.5f);
matrix.setScale(scale, scale);
matrix.postTranslate(dx, dy);
} else {
matrix.setRectToRect(new RectF(drawable.getBounds()), new RectF(0, 0, getWidth(), getHeight()), scaleTypeToScaleToFit(mScaleType));
}
}
private Matrix.ScaleToFit scaleTypeToScaleToFit(ScaleType mScaleType) {
Class mClass=ImageView.class;
try {
Method method = mClass.getDeclaredMethod("scaleTypeToScaleToFit", new Class[]{ScaleType.class});
method.setAccessible(true);
if(method!=null){
Matrix.ScaleToFit fit = (Matrix.ScaleToFit) (method.invoke(null, new Object[]{mScaleType}));
return fit;
}
} catch (Exception e) {
e.printStackTrace();
}
return Matrix.ScaleToFit.FILL;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
可以自定义圆角的ImageView ..允许设置scaletype
共42个文件
xml:19个
png:6个
java:5个
需积分: 23 17 下载量 38 浏览量
2017-07-18
20:02:03
上传
评论
收藏 285KB ZIP 举报
温馨提示
原文链接http://blog.csdn.net/vv_bug/article/details/52779425 这个主要是链接介绍的下载的源码。
资源推荐
资源详情
资源评论
收起资源包目录
CircleViewDemo-master.zip (42个子文件)
CircleViewDemo-master
.gitignore 97B
app
.gitignore 7B
build.gradle 1KB
src
androidTest
java
com
cisetech
circleviewdemo
ApplicationTest.java 358B
main
AndroidManifest.xml 701B
res
mipmap-xhdpi
ic_launcher.png 5KB
mipmap-mdpi
ic_launcher.png 2KB
layout
activity_main.xml 2KB
values-w820dp
dimens.xml 358B
mipmap-xxhdpi
ic_launcher.png 8KB
drawable
shape_retangle.xml 603B
shape_circle.xml 243B
fgbfb.png 168KB
mipmap-hdpi
ic_launcher.png 3KB
mipmap-xxxhdpi
ic_launcher.png 10KB
values
strings.xml 77B
attrs.xml 530B
colors.xml 208B
dimens.xml 211B
styles.xml 383B
java
com
cisetech
circleviewdemo
MainActivity.java 340B
CricleXfexrmode.java 7KB
yqy
canvasdemo
RoundImageView.java 7KB
test
java
com
cisetech
circleviewdemo
ExampleUnitTest.java 320B
proguard-rules.pro 646B
settings.gradle 15B
build.gradle 498B
projectFilesBackup
.idea
workspace.xml 217KB
gradlew 5KB
gradlew.bat 2KB
gradle.properties 855B
.idea
misc.xml 3KB
encodings.xml 159B
gradle.xml 705B
copyright
profiles_settings.xml 74B
runConfigurations.xml 564B
dictionaries
Administrator.xml 92B
compiler.xml 686B
.name 14B
modules.xml 365B
gradle
wrapper
gradle-wrapper.properties 239B
gradle-wrapper.jar 52KB
共 42 条
- 1
资源评论
娃哈哈19910206
- 粉丝: 77
- 资源: 32
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功