关闭

自定义圆形的Imageview

130人阅读 评论(0) 收藏 举报


import android.annotation.SuppressLint;
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.Rect;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

public class RoundImageView extends ImageView {

    private static final int DEFAULT_BORDER_COLOR = Color.TRANSPARENT;
    private static final int DEFAULT_BORDER_WIDTH = 0;
    private Paint mPaintBitmap = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Paint mPaintBorder = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Bitmap mRawBitmap;
    private BitmapShader mShader;
    private Matrix mMatrix = new Matrix();
    private float mBorderWidth = dip2px(15);
    private int mBorderColor = 0xFF0080FF;

    public RoundImageView(Context context, AttributeSet attrs) {
        super(context, attrs);

        // 取xml文件中设定的参数
        TypedArray ta = context.obtainStyledAttributes(attrs,
                R.styleable.RoundImageView);
        mBorderColor = ta.getColor(R.styleable.RoundImageView_borderColor,
                DEFAULT_BORDER_COLOR);
        mBorderWidth = ta.getDimensionPixelSize(
                R.styleable.RoundImageView_borderWidth,
                dip2px(DEFAULT_BORDER_WIDTH));
        ta.recycle();
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        Bitmap rawBitmap = getBitmap(getDrawable());
        if (rawBitmap != null) {
            int viewWidth = getWidth();
            int viewHeight = getHeight();
            int viewMinSize = Math.min(viewWidth, viewHeight);
            float dstWidth = viewMinSize;
            float dstHeight = viewMinSize;
            if (mShader == null || !rawBitmap.equals(mRawBitmap)) {
                mRawBitmap = rawBitmap;
                mShader = new BitmapShader(mRawBitmap, TileMode.CLAMP,
                        TileMode.CLAMP);
            }
            if (mShader != null) {
                mMatrix.setScale(
                        (dstWidth - mBorderWidth * 2) / rawBitmap.getWidth(),
                        (dstHeight - mBorderWidth * 2) / rawBitmap.getHeight());
                mShader.setLocalMatrix(mMatrix);
            }
            mPaintBitmap.setShader(mShader);
            mPaintBorder.setStyle(Paint.Style.STROKE);
            mPaintBorder.setStrokeWidth(mBorderWidth);
            mPaintBorder.setColor(mBorderColor);
            float radius = viewMinSize / 2.0f;
            canvas.drawCircle(radius, radius, radius - mBorderWidth / 2.0f,
                    mPaintBorder);
            canvas.translate(mBorderWidth, mBorderWidth);
            canvas.drawCircle(radius - mBorderWidth, radius - mBorderWidth,
                    radius - mBorderWidth, mPaintBitmap);
        } else {
            super.onDraw(canvas);
        }
    }

    @SuppressLint("NewApi")
    private Bitmap getBitmap(Drawable drawable) {
        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable) drawable).getBitmap();
        } else if (drawable instanceof ColorDrawable) {
            Rect rect = drawable.getBounds();
            int width = rect.right - rect.left;
            int height = rect.bottom - rect.top;
            int color = ((ColorDrawable) drawable).getColor();
            Bitmap bitmap = Bitmap.createBitmap(width, height,
                    Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            canvas.drawARGB(Color.alpha(color), Color.red(color),
                    Color.green(color), Color.blue(color));
            return bitmap;
        } else {
            return null;
        }
    }

    private int dip2px(int dipVal) {
        float scale = getResources().getDisplayMetrics().density;
        return (int) (dipVal * scale + 0.5f);
    }

}


-----------------------arrt------------------------

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="borderColor" format="color" />
    <attr name="borderWidth" format="dimension" />
 
    <declare-styleable name="RoundImageView">  
        <attr name="borderColor" />
        <attr name="borderWidth" />
    </declare-styleable>
</resources>





----------------------布局中---------------------------

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:snser="http://schemas.android.com/apk/res/com.example.yuekaolianxi2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.yuekaolianxi2.MainActivity" >

    <com.example.yuekaolianxi2.RoundImageView
        android:id="@+id/userImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"
    />

<RelativeLayout/>






0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:410次
    • 积分:34
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:1篇
    • 译文:1篇
    • 评论:0条
    文章存档