自定义圆形图

原创 2016年05月30日 19:50:50

首先自定义一个类继成自ImageView

public class RoundImageView extends ImageView {

     /** 图片的类型,圆形or圆角  */  
    private int type;  
    private static final int TYPE_CIRCLE = 0;  
    private static final int TYPE_ROUND = 1;  

    /** 圆角大小的默认值  */  
    private static final int BODER_RADIUS_DEFAULT = 10;  
    /**  * 圆角的大小 */  
    private int mBorderRadius;  

    /**  * 绘图的Paint */  
    private Paint mBitmapPaint;  
    /** * 圆角的半径 */  
    private int mRadius;  
    /** * 3x3 矩阵,主要用于缩小放大 */  
    private Matrix mMatrix;  
    /**  * 渲染图像,使用图像为绘制图形着色 */  
    private BitmapShader mBitmapShader;  
    /** * view的宽度  */  
    private int mWidth;  
    private RectF mRoundRect;  

    public RoundImageView(Context context, AttributeSet attrs)  
    {  
        super(context, attrs);  
        mMatrix = new Matrix();  
        mBitmapPaint = new Paint();  
        mBitmapPaint.setAntiAlias(true);  
        TypedArray a = context.obtainStyledAttributes(attrs,  
                R.styleable.RoundImageView);  
        mBorderRadius = a.getDimensionPixelSize(  
                R.styleable.RoundImageView_borderRadius, (int) TypedValue  
                        .applyDimension(TypedValue.COMPLEX_UNIT_DIP,  
                                BODER_RADIUS_DEFAULT, getResources()  
                                        .getDisplayMetrics()));// 默认为10dp  
        type = a.getInt(R.styleable.RoundImageView_type, TYPE_CIRCLE);// 默认为Circle 
        a.recycle();  
    }  

    @Override  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)  
    {  
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);   
        if (type == TYPE_CIRCLE)  
        {  
            mWidth = Math.min(getMeasuredWidth(), getMeasuredHeight());  
            mRadius = mWidth / 2;  
            setMeasuredDimension(mWidth, mWidth);  
        }  

    }

    private void setUpShader()  
    {  
        Drawable drawable = getDrawable();  
        if (drawable == null)    return;  
        Bitmap bmp = drawableToBitamp(drawable);  
        // 将bmp作为着色器,就是在指定区域内绘制bmp  
        mBitmapShader = new BitmapShader(bmp, TileMode.CLAMP, TileMode.CLAMP);  
        float scale = 1.0f;  
        if (type == TYPE_CIRCLE)  
        {  
            int bSize = Math.min(bmp.getWidth(), bmp.getHeight());  
            scale = mWidth * 1.0f / bSize;  

        } else if (type == TYPE_ROUND)  
        {    
            scale = Math.max(getWidth() * 1.0f / bmp.getWidth(), getHeight()  
                    * 1.0f / bmp.getHeight());  
        }  
        // shader的变换矩阵,我们这里主要用于放大或者缩小  
        mMatrix.setScale(scale, scale);  
        // 设置变换矩阵  
        mBitmapShader.setLocalMatrix(mMatrix);  
        // 设置shader  
        mBitmapPaint.setShader(mBitmapShader);  
    }  

    private Bitmap drawableToBitamp(Drawable drawable)  
    {  
        if (drawable instanceof BitmapDrawable)  
        {  
            BitmapDrawable bd = (BitmapDrawable) drawable;  
            return bd.getBitmap();  
        }  
        int w = drawable.getIntrinsicWidth();  
        int h = drawable.getIntrinsicHeight();  
        Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
        Canvas canvas = new Canvas(bitmap);  
        drawable.setBounds(0, 0, w, h);  
        drawable.draw(canvas);  
        return bitmap;  
    }  

    @Override  
    protected void onDraw(Canvas canvas)  
    {  
        if (getDrawable() == null)  return;  
        setUpShader();  
        if (type == TYPE_ROUND)  
        {  
            canvas.drawRoundRect(mRoundRect, mBorderRadius, mBorderRadius,  
                    mBitmapPaint);  
        } else  
        {  
            canvas.drawCircle(mRadius, mRadius, mRadius, mBitmapPaint);  
        }  
    }  

    @Override  
    protected void onSizeChanged(int w, int h, int oldw, int oldh)  
    {  
        super.onSizeChanged(w, h, oldw, oldh);  
        // 圆角图片的范围  
        if (type == TYPE_ROUND)  
            mRoundRect = new RectF(0, 0, getWidth(), getHeight());  
    }  
}

创建attr.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <attr name="borderRadius" format="dimension" />  
    <attr name="type">  
        <enum name="circle" value="0" />  
        <enum name="round" value="1" />  
    </attr>  
    <declare-styleable name="RoundImageView">  
        <attr name="borderRadius" />  
        <attr name="type" />  
    </declare-styleable>  
</resources>

xml布局里引用

<com.bw.utils.RoundImageView 
        android:id="@+id/img"
        android:layout_width="80dp"
        android:layout_height="80dp"/>

这样就可以直接用了,很简单吧

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android 自定义View实现圆形切图的效果

使用自定义View实现圆形ImageView的效果 目前圆形边框还需要调整,这里有点问题实现思路使用一个Paint,将得到的Bitmap设置成paint的Shader,设置完成后,使用Matrix调...

自定义圆形统计图(静态)

最近项目中有这个需求,将总资产的组成以图形的形态展现出来,所以就写了个自定义View来实现这个需求。     其实试下这个思路还是挺简单的,因为只需要在onDraw方法中使用画笔画出一个又一...

自定义View之继承View(圆形进度图,播放器条形图)

重写View来实现全新的控件在Android中重写View是Android中的难点,但很多特效都是基于自定义View来实现的,下面我们来尝试通过两个例子来学习一下自定义View。

自定义圆形进度条

  • 2016-10-27 16:56
  • 35.33MB
  • 下载

php制作圆形用户头像,思路+自定义封装类源代码

思路 共需要创建3个图像资源 1.底层:最后生成图像的

自定义圆形进度条

  • 2017-02-14 12:12
  • 23.56MB
  • 下载

android自定义圆形头像图片

  • 2016-12-23 14:27
  • 22.39MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)