android 通过修改图片像素实现CircleImageView
CircleImageView实现方法有很多种,各有优缺点,因此需要按照不同的场景使用。我们今天使用修改图片像素的方法实现CircleImageView,主要知识点无非是勾股定理和点到圆形的距离。
素材图片:
效果如下:
1、clipPath裁剪画布
该方法支持的最小版本是Android 4.3(API Level 18),方便快捷,但是不支持硬件加,此外也存在Path既有的缺点,不支持抗锯齿。
@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
Paint paint = new Paint();
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pic);
        mPath = new Path();
mPath.addCircle(mBitmap.getWidth() / 2, mBitmap.getHeight() / 2, mBitmap.getWidth() / 2, Path.Direction.CCW);
        canvas.clipPath(mPath);
        canvas.drawBitmap(mBitmap, 0, 0, paint);
    }
2、使用PorterDuffXfermode
PorterDuffXfermode是Android主流的图片合成工具,支持模式多,稳定性强,效果好,质量高,支持抗锯齿备受广大开发者喜爱,可以说是很多应用开发的首选。缺点是难度学习有些高,另外比较占内存。
/**
     * 绘制圆形图片
     *
     */
    @Override  
    protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();  
        if (null != drawable) {  
            Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();  
            Bitmap b = getCircleBitmap(bitmap);  
            final Rect rectSrc = new Rect(0, 0, b.getWidth(), b.getHeight());  
            final Rect rectDest = new Rect(0,0,getWidth(),getHeight());
            paint.reset();  
            canvas.drawBitmap(b, rectSrc, rectDest, paint);
} else {  
            super.onDraw(canvas);  
        }  
    }
/**
     * 获取圆形图片方法
     * @param bitmap
     * @param pixels
     * @return Bitmap
     */
    private Bitmap getCircleBitmap(Bitmap bitmap) {  
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),  
                bitmap.getHeight(), Config.ARGB_8888);  
        Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());  
        paint.setAntiAlias(true);  
        canvas.drawColor(Color.TRANSPARENT);  
        paint.setColor(color);  
        int x = bitmap.getWidth();
canvas.drawCircle(x / 2, x / 2, x / 2, paint);  
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
        canvas.drawBitmap(bitmap, rect, rect, paint);  
        return output;
}  
4、设置画笔Paint的Shader,然后用该画笔绘制圆形图片
该方法是Glide和picasso使用的方法,用法简单便捷,占内占有率处于中等水平。
@Override  
    protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();  
        if (null != drawable) {  
            Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();  
            Bitmap b = transform(bitmap);  
            final Rect rectSrc = new Rect(0, 0, b.getWidth(), b.getHeight());  
            final Rect rectDest = new Rect(0,0,getWidth(),getHeight());
            paint.reset();  
            canvas.drawBitmap(b, rectSrc, rectDest, paint);
} else {  
            super.onDraw(canvas);  
        }  
    }
public Bitmap transform(Bitmap source) {
            int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
            int y = (source.getHeight() - size) / 2;
Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
            if (squaredBitmap != source) {
                source.recycle();
            }
Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());
Canvas canvas = new Canvas(bitmap);
            Paint paint = new Paint();
            BitmapShader shader = new BitmapShader(squaredBitmap,
                    BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
float mScale = (mRadius * 2.0f) / Math.min(bitmap.getHeight(), bitmap.getWidth());
Matrix matrix = new Matrix();
          matrix.setScale(mScale, mScale);
          bitmapShader.setLocalMatrix(matrix);
paint.setShader(shader);
            paint.setAntiAlias(true);
float r www.michenggw.com= size / 2f;
            canvas.drawCircle(r, r, r, paint);
squaredBitmap.recycle();
            return bitmap;
        }
5、修改像素
该方法支持抗锯齿,用法简单,内存占有率同样处于中等水平。
public class CircleImageView extends AppCompatImageView {
public CircleImageView(Context context) {
        this(context,null);
    }
public CircleImageView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
@Override
    public void onDraw(Canvas canvas) {
int width  = getWidth();
        int height = getHeight();
int minSize = Math.min(width,height)/2;
        Drawable drawable www.dasheng178.com= getDrawable();
        if(drawable!=null && minSize!=www.dfgjpt.com0) {
if(Math.min(drawable.getIntrinsicWidth(www.078881.cn/),drawable.getIntrinsicHeight())==0) {
                super.onDraw(canvas);
                return;
            }
int intrinsicWidth = drawable.getIntrinsicWidth();
            int intrinsicHeight = drawable.getIntrinsicHeight();
float R = Math.min(intrinsicWidth,intrinsicHeight)/2;
Bitmap bmp = Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888);
            Canvas targetCanvas = new Canvas(bmp);
drawable.draw(targetCanvas);
for (int y=0;y<intrinsicHeight;y++){
                for (int x=0;www.18037.cnx<intrinsicWidth;x++){
                    if((Math.pow(www.17093.cn x-intrinsicWidth/2,2) + Math.pow(y-intrinsicHeight/2,2))<=Math.pow(R,2)){
                        continue;
                    }
                    bmp.setPixel(x,y, Color.TRANSPARENT);
                }
            }
Matrix imageMatrix = getImageMatrix();
            if(imageMatrix!=null){
                canvas.concat(imageMatrix);
            }
            final int saveCount = canvas.getSaveCount();
            canvas.save();
if (getCropToPadding()) {
                final int scrollX = getScrollX();
                final int scrollY = getScrollY();
                canvas.clipRect(scrollX + getPaddingLeft(), scrollY + getPaddingTop(),
                        scrollX + getRight() - getLeft() - getPaddingRight(),
                        scrollY + getBottom() - getTop() - getPaddingBottom());
            }
canvas.translate(getPaddingLeft(www.60910.cn),getPaddingTop());
DrawFilter drawFilter = canvas.getDrawFilter();
            canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
            canvas.drawBitmap(bmp,0,0,null);
            canvas.setDrawFilter(drawFilter);
canvas.restoreToCount(saveCount);
bmp.recycle();
}else{
            super.onDraw(canvas);
android 通过修改图片像素实现CircleImageView的更多相关文章
- Android动态修改图片颜色的实现方式分析
		
版权声明:本文为博主原创文章,未经博主允许不得转载. 1.修改色相.饱和度.亮度 参看:http://blog.csdn.NET/sjf0115/article/details/7267063 2.使 ...
 - android 之修改图片的某一颜色值
		
首先我们来创建一个叫Image的类,这个类主要用来处理与图有关的一些操作. package org.cn.tools; import java.io.IOException; import java. ...
 - Android 实现对图片 Exif 的修改(Android 自带的方法)
		
很多时候我们都要对我们的图片信息进行一些处理,比如向图片中写入经纬度,拍摄时间,设备信息,作者等等. 这个时候我们就要对我们的图片Exif进行写入信息的操作,当然,我们想知道图片的Exif信息,也可以 ...
 - android 加载图片框架--Glide使用详解
		
一.简介 Glide,一个被google所推荐的图片加载库,作者是bumptech.这个库被广泛运用在google的开源项目中,包括2014年的google I/O大会上发布的官方app.(PS:众所 ...
 - Android开发笔记——图片缓存、手势及OOM分析
		
把图片缓存.手势及OOM三个主题放在一起,是因为在Android应用开发过程中,这三个问题经常是联系在一起的.首先,预览大图需要支持手势缩放,旋转,平移等操作:其次,图片在本地需要进行缓存,避免频繁访 ...
 - Android 圆形/圆角图片的方法
		
Android 圆形/圆角图片的方法 眼下网上有非常多圆角图片的实例,Github上也有一些成熟的项目.之前做项目,为了稳定高效都是选用Github上的项目直接用.但这样的结束也是Android开发必 ...
 - Android微信九宫格图片展示控件
		
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/214 Android微信九宫格图片展示控件 半年前,公司产 ...
 - 利用Photoshop修改图片以达到投稿要求
		
摘自:http://www.dxy.cn/bbs/thread/8602152#8602152 利用Photoshop修改图片以达到投稿要求 软件版本为Photoshop CS V8.0.1(中文版) ...
 - Android中获取图片的宽和高
		
在Android中,我们想获取图片的宽和高应该怎么办?一.正常加载图片的方法下获取宽和高 举一个简单的例子:创建一个图片的副本 //加载原图 Bitmap bmSrc = BitmapFactory. ...
 
随机推荐
- web网站css,js更新后客户浏览器缓存问题,需要刷新才能正常展示的解决办法
			
问题描述 最近将公司官网样式进行了调整,部署到服务器后访问发现页面展示不正常,但是刷新之后就会展示正常. 问题分析 研究之后发现可能的原因有 css文件过大,加载缓慢 本地缓存问题,虽然服务器修改了c ...
 - jmeter分布式压测(多台电脑一起压测)
			
(1)在Windows下运行 操作步骤: 1) 有多台电脑,每台电脑上都有jmeter,而且这几台电脑都互相能ping通. 2) 在我的电脑的jmeter的配置文件bin目录下的jme ...
 - Java 集合的简单理解
			
集合(容器) Java的集合类分别是Collection接口和Map接口派生而来. Collection接口 对于实现Collection接口的子类,都会实现Collection接口中抽象方法,所以他 ...
 - React Native之通知栏消息提示(android)
			
React Native之通知栏消息提示(android) 一,需求分析与概述 1.1,推送作为手机应用的基本功能,是手机应用的重要部分,如果自己实现一套推送系统费时费力,所以大部分的应用都会选择使用 ...
 - jq简单仿上传文件
			
html: <div> <input id="lefile" type="file" style="display:none&quo ...
 - checkbox操作判断  Jquery选择器
			
function checkAll(d){ console.log(d); console.log(d.checked); //注意 这里是d不是$(d) 不是jQuery对象 if(d.checke ...
 - js中this指向、箭头函数
			
普通函数:this指向分为4种情况,1. obj.getName();//指向obj2.getName();//非严格模式下,指向window,严格模式下为undefined3. var a = ne ...
 - python之路--反射
			
一 . isinstance, type, issubclass isinstance 可以判断该对象是否是XXX家族体系中的(只能往上判断) class Base: pass class Foo(B ...
 - 老男孩python学习自修第七天【包与模块】
			
1.如何导入 from package import module module.function() 常用魔术方法 __init__.py 如果某个文件夹下面有该文件,则该文件夹是一个包,否则只是一 ...
 - edge
			
https://www.cnblogs.com/st-leslie/p/6784990.html