android自定义一圆角ImageView-圆角图片

public class CircleImageView extendsImageView {

    privatestatic final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;

    privatestatic final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
    privatestatic final int COLORDRAWABLE_DIMENSION = 1;

    privatestatic final int DEFAULT_BORDER_WIDTH = 0;
    privatestatic final int DEFAULT_BORDER_COLOR = Color.BLACK;

    privatefinal RectF mDrawableRect = newRectF();
    privatefinal RectF mBorderRect = newRectF();

    privatefinal Matrix mShaderMatrix = newMatrix();
    privatefinal Paint mBitmapPaint = newPaint();
    privatefinal Paint mBorderPaint = newPaint();

    privateint mBorderColor = DEFAULT_BORDER_COLOR;
    privateint mBorderWidth = DEFAULT_BORDER_WIDTH;

    privateBitmap mBitmap;
    privateBitmapShader mBitmapShader;
    privateint mBitmapWidth;
    privateint mBitmapHeight;

    privatefloat mDrawableRadius;
    privatefloat mBorderRadius;

    privateboolean mReady;
    privateboolean mSetupPending;

    publicCircleImageView(Context context) {
        super(context);

        init();
    }

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

    publicCircleImageView(Context context, AttributeSet attrs, intdefStyle) {
        super(context, attrs, defStyle);

        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();

        init();
    }

    privatevoid init() {
        super.setScaleType(SCALE_TYPE);
        mReady = true;

        if(mSetupPending) {
            setup();
            mSetupPending = false;
        }
    }

    @Override
    publicScaleType getScaleType() {
        returnSCALE_TYPE;
    }

    @Override
    publicvoid setScaleType(ScaleType scaleType) {
        if(scaleType != SCALE_TYPE) {
            thrownew IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
        }
    }

    @Override
    protectedvoid onDraw(Canvas canvas) {
        if(getDrawable() == null) {
            return;
        }

        canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
        if(mBorderWidth != 0) {
            canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
        }
    }

    @Override
    protectedvoid onSizeChanged(intw, inth, intoldw, intoldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        setup();
    }

    publicint getBorderColor() {
        returnmBorderColor;
    }

    publicvoid setBorderColor(intborderColor) {
        if(borderColor == mBorderColor) {
            return;
        }

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

    publicint getBorderWidth() {
        returnmBorderWidth;
    }

    publicvoid setBorderWidth(intborderWidth) {
        if(borderWidth == mBorderWidth) {
            return;
        }

        mBorderWidth = borderWidth;
        setup();
    }

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

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

    @Override
    publicvoid setImageResource(intresId) {
        super.setImageResource(resId);
        mBitmap = getBitmapFromDrawable(getDrawable());
        setup();
    }

    @Override
    publicvoid setImageURI(Uri uri) {
        super.setImageURI(uri);
        mBitmap = getBitmapFromDrawable(getDrawable());
        setup();
    }

    privateBitmap getBitmapFromDrawable(Drawable drawable) {
        if(drawable == null) {
            returnnull;
        }

        if(drawable instanceofBitmapDrawable) {
            return((BitmapDrawable) drawable).getBitmap();
        }

        try{
            Bitmap bitmap;

            if(drawable instanceofColorDrawable) {
                bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
            }else{
                bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
            }

            Canvas canvas = newCanvas(bitmap);
            drawable.setBounds(0,0, canvas.getWidth(), canvas.getHeight());
            drawable.draw(canvas);
            returnbitmap;
        }catch(OutOfMemoryError e) {
            returnnull;
        }
    }

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

        if(mBitmap == null) {
            return;
        }

        mBitmapShader = newBitmapShader(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();
    }

    privatevoid updateShaderMatrix() {
        floatscale;
        floatdx = 0;
        floatdy = 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);
    }

}
时间: 2024-11-09 11:45:50

android自定义一圆角ImageView-圆角图片的相关文章

Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38140505 自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScr

Android 自定义 ViewPager 打造千变万化的图片切换效果

Android 自定义 ViewPager 打造千变万化的图片切换效果 标签: Android自定义ViewPagerJazzyViewPager 目录(?)[+] 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记 得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主界面通通ViewPager,以及图片切换也抛弃了ImageSwitch之类的,开 始让ViewPager来做.时间长了,ViewPa

【Android】Android自定义带board的圆角控件

介绍 圆角控件常用于头像,按钮,图标等,用途十分广泛,而且常常配合board使用. 在IOS中,UIVIew的CALayer层已经提供了圆角和board的方法,所以圆角控件的制作非常简单,只需要类似以下简单代码即可实现: view.layer.cornerRadius = 20; view.layer.borderColor = [UIColor yellowColor].CGColor; view.layer.borderWidth = 10; view.clipsToBounds = YES

android 自定义toast width height 背景图片

Android 自定义toast 宽高大小 背景图片 RelativeLayout layout = (RelativeLayout) getLayoutInflater().inflate(R.layout.layout_custom_toast,null); ((TextView) layout.findViewById(R.id.tvCheckoutWay)).setText("11111"); ((TextView) layout.findViewById(R.id.tvPer

Android控件之ImageView(显示图片的控件)

一.ImageView属性: android:src = "@drawable/ic_launcher"——ImageView的内容图像(可以和android:background = "#00000"同时使用) android:background = "@drawable/ic_launcher"——ImageView的背景图像 android:background = "#00000"——ImageView的RGB颜色

Android自定义View 简单实现多图片选择控件

前言 相信很多朋友在开发中都会遇到图片上传的情况,尤其是多图上传,最 经典的莫过于微信的图片选择了.所有很多情况下会使用到多图选择. 所以就有了这篇文章,今天抽点时间写了个控件. 支持自定义选择图片的样式 支持设置图片选择数量 支持图片预览,删除 支持图片拍照 先来看看效果 实现分析 假如不定义控件,我们要实现这样一个功能,无非是写个GridView在item点击的时候去显示图片进行选择,在返回界面的时候进行GridView的数据刷新.我们把这些逻辑写在我们自定义的GridView中,就成了一个

Android中 在显示ImageView时图片上面和下面都出现一段空白区间的解决办法

开始的时候是在ScrollView中显示ImageView的时候出现这样的问题,以为是要对ScrollView进行设置的,后来发现单独显示一个ImageView的时候也会出现这样的问题,由此才知道是应该对ImageView进行设置啦- 解决办法如下喽- 1.在XML文件中设置: android:adjustViewBounds="true" 2.在Java代码中进行设置: mImageView.setAdjustViewBounds(true);

Android 自定义RecyclerView 实现真正的Gallery效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38173061 ,本文出自:[张鸿洋的博客] 上一篇博客我使用自定义HorizontalScrollView写了一个具有HorizontalScrollView效果和ViewPager特性的横向图片轮播,详见:Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果.其实制作横向滚动的不得不说另一个控件,就是Google

Android 自定义ScrollView ListView 体验各种纵向滑动的需求

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38950509,本文出自[张鸿洋的博客] 1.概述 群里的一个哥们有个需求是这样的:问题:主要功能就是:1.循环的一个滑动:2.每次滑动结束,保持每个Item的完整.然后我当时给他写了个Demo,所有代码都在Activity里面,后期看来其太恶心了,修改也不方便:貌似那哥们还因为那代码修改到12点,大大的赞一下这哥们的毅力,也深表歉意,今天特意把代码抽取成自定义的ScrollVi

Android自定义圆角ImageView

我们经常看到一些app中可以显示圆角图片,比如qq的联系人图标等等,实现圆角图片一种办法是直接使用圆角图片资源,当然如果没有圆角图片资源,我们也可以自己通过程序实现的,下面介绍一个自定义圆角ImageView的方法: package com.yulongfei.imageview; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; impor