Android RoundImageView dome

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.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

import com.rongyi.gushenjy.R;

public class RoundImageView extends ImageView {

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 = 1;

private static final int DEFAULT_BORDER_WIDTH = 0;
private static final int DEFAULT_BORDER_COLOR = Color. BLACK ;

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 int mBorderColor = DEFAULT_BORDER_COLOR ;
private int mBorderWidth = DEFAULT_BORDER_WIDTH ;

private Bitmap mBitmap ;
private BitmapShader mBitmapShader ;
private int mBitmapWidth ;
private int mBitmapHeight ;

private float mDrawableRadius ;
private float mBorderRadius ;

private boolean mReady ;
private boolean mSetupPending ;

public RoundImageView(Context context) {
super (context);
}

public RoundImageView(Context context, AttributeSet attrs) {
this (context, attrs, 0);
}

public RoundImageView(Context context, AttributeSet attrs, int defStyle) {
super (context, attrs, defStyle);
super .setScaleType( SCALE_TYPE );

TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable. CircleImageView , defStyle, 0);

mBorderWidth = a.getDimensionPixelSize(
R.styleable. CircleImageView_border_width , DEFAULT_BORDER_WIDTH );
mBorderColor = a.getColor(R.styleable. CircleImageView_border_color ,
DEFAULT_BORDER_COLOR );

a.recycle();

mReady = true ;

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
protected void onDraw(Canvas canvas) {
if (getDrawable() == null ) {
return ;
}

canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius ,
mBitmapPaint );
canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius ,
mBorderPaint );
}

@Override
protected void onSizeChanged( int w, int h, int oldw, int oldh) {
super .onSizeChanged(w, h, oldw, oldh);
setup();
}

public int getBorderColor() {
return mBorderColor ;
}

public void setBorderColor( int borderColor) {
if (borderColor == mBorderColor ) {
return ;
}

mBorderColor = borderColor;
mBorderPaint .setColor( mBorderColor );
invalidate();
}

public int getBorderWidth() {
return mBorderWidth ;
}

public void setBorderWidth( int borderWidth) {
if (borderWidth == mBorderWidth ) {
return ;
}

mBorderWidth = borderWidth;
setup();
}

@Override
public void setImageBitmap(Bitmap bm) {
super .setImageBitmap(bm);
mBitmap = bm;
setup();
}

@Override
public void setImageDrawable(Drawable drawable) {
super .setImageDrawable(drawable);
mBitmap = getBitmapFromDrawable(drawable);
setup();
}

@Override
public void setImageResource( int resId) {
super .setImageResource(resId);
mBitmap = getBitmapFromDrawable(getDrawable());
setup();
}

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 (OutOfMemoryError e) {
return null ;
}
}

private void setup() {
if (! mReady ) {
mSetupPending = true ;
return ;
}

if ( mBitmap == null ) {
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 );

mBitmapHeight = mBitmap .getHeight();
mBitmapWidth = mBitmap .getWidth();

mBorderRect .set(0, 0, getWidth(), getHeight());
mBorderRadius = Math.min(( mBorderRect .height() - mBorderWidth ) / 2,
( mBorderRect .width() - mBorderWidth ) / 2);

mDrawableRect .set( mBorderWidth , mBorderWidth , mBorderRect .width()
- mBorderWidth , mBorderRect .height() - mBorderWidth );
mDrawableRadius = Math.min( mDrawableRect .height() / 2,
mDrawableRect .width() / 2);

updateShaderMatrix();
invalidate();
}

private void updateShaderMatrix() {
float scale;
float dx = 0;
float dy = 0;

mShaderMatrix .set( null );

if ( mBitmapWidth * mDrawableRect .height() > mDrawableRect .width()
* mBitmapHeight ) {
scale = mDrawableRect .height() / ( float ) mBitmapHeight ;
dx = ( mDrawableRect .width() - mBitmapWidth * scale) * 0.5f;
} else {
scale = mDrawableRect .width() / ( float ) mBitmapWidth ;
dy = ( mDrawableRect .height() - mBitmapHeight * scale) * 0.5f;
}

mShaderMatrix .setScale(scale, scale);
mShaderMatrix .postTranslate(( int ) (dx + 0.5f) + mBorderWidth ,
( int ) (dy + 0.5f) + mBorderWidth );

mBitmapShader .setLocalMatrix( mShaderMatrix );
}

}




< LinearLayout xmlns:android = " http://schemas.android.com/apk/res/android "
    xmlns:app = " http://schemas.android.com/apk/res-auto ”//必要
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:background = "@color/whitesmoke"
    android:orientation = "vertical" >

     < com.rongyi.gushenjy.widget.RoundImageView
            android:id = "@+id/user_edit_img"
            android:layout_width = "90dp"
            android:layout_height = "90dp"
            android:layout_gravity = "center_horizontal"
            android:layout_marginTop = "10dp"
            android:background = "@color/transparent"
            android:src = "@color/green"
            app:border_color = "@color/orange”//必要
            app:border_width = “0dp”//必要 />
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值