• 在android中画圆形图片的几种办法


    在开发中常常会有一些需求,比方显示头像,显示一些特殊的需求,将图片显示成圆角或者圆形或者其它的一些形状。

    可是往往我们手上的图片或者从server获取到的图片都是方形的。这时候就须要我们自己进行处理,将图片处理成所须要的形状。正如茴香豆的的“茴”写法大于一种。经过我的研究。画出特殊图片的方法也不是一种,我发现了三种。且听我一一道来。

    使用Xfermode 两图相交方式

    通过查找资料发现android中能够设置画笔的Xfermode即相交模式,从而设置两张图相交之后的显示方式。详细模式见下图,源代码能够去android apidemo。(SRC 为我们要画到目标图上的图即原图,DST为目标图)


    由上图能够看到,假设我们须要画一个圆形的图,能够在画布上面先画一个跟目标大小一样的圆,然后xfermode选择SRC_IN,再讲我们的头像或者其它图画上去就能够了。相同也能够先画我们的图,再画圆,只是xfermode要选择DST_IN。两种都能够实现我们须要的效果。演示样例代码例如以下:

    Paint p = new Paint();
    p.setAntiAlias(true); //去锯齿
    p.setColor(Color.BLACK);
    p.setStyle(Paint.Style.STROKE);
    Canvas canvas = new Canvas(bitmap);  //bitmap就是我们原来的图,比方头像
    p.setXfermode(new PorterDuffXfermode(Mode.DST_IN));  //由于我们先画了图所以DST_IN
    int radius = bitmap.getWidth; //如果图片是正方形的
    canvas.drawCircle(radius, radius, radius, p); //r=radius, 圆心(r,r)

    以上就是简单的演示样例,依据以上的16种模式你事实上还能够做出很多其它效果。另外,仅仅要你给一张相交图。那张图形状什么样,我们的图就能够显示成什么样。

    通过裁剪画布区域实现指定形状的图形

    Android中Canvas提供了ClipPath, ClipRect, ClipRegion 等方法来裁剪,通过Path, Rect ,Region 的不同组合,Android差点儿能够支持随意形状的裁剪区域。

    因此,我们差点儿能够获取随意形状的区域,然后在这个区域上绘图,就能够获得,我们要的图片了。直接看演示样例。

    int radius = src.getWidth() / 2; //src为我们要画上去的图,跟上一个演示样例中的bitmap一样。

    Bitmap dest = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(dest); Paint paint = new Paint(); paint.setColor(Color.BLACK); paint.setAntiAlias(true); Path path = new Path(); path.addCircle(radius, radius, radius, Path.Direction.CW); c.clipPath(path); //裁剪区域 c.drawBitmap(src, 0, 0, paint);  //把图画上去

    使用BitmapShader

    直接先看演示样例

    int radius = src.getWidth() / 2;
    BitmapShader bitmapShader = new BitmapShader(src, Shader.TileMode.REPEAT,
                    Shader.TileMode.REPEAT);
    Bitmap dest = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(dest);
    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setShader(bitmapShader);
    c.drawCircle(radius,radius, radius, paint);

    Shader就是画笔的渲染器,本质上这中方法事实上是画圆,可是渲染採用了我们的图片,然后就能够获得指定的形状了。可是我认为。这个不适合画非常复杂的图形,可是在内存消耗上,应该比第一种小非常多。同一时候呢,设置Shader.TileMode.MIRROR,还能够实现镜面效果,也是极好的。

    上面就是实现的三种方法,三种方法都能够画许多的形状,当然遇到很很很很复杂的情况,我是建议使用第一种。这时候能够让美工给一张末班形状图。省自己去代码绘制了。

    大家依据自己的需求选择。

    在github上面CustomShapeImageView就是用了我们所说的第一种方法绘制。RoundedImageView 和CircleImageView则使用bitmapshader完毕,当然可能另一些其它的控件,或许还有其它的一些实现方法,假设你知道。能够回复告诉我^_^。

    原文地址:http://blog.isming.me/2014/09/19/draw-circle-image-in-android/,转载请注明出处。

  • 相关阅读:
    前缀和与差分
    可行!解决bitmap缩放失真问题
    Android 中的 File renameTo() 使用
    XMPP 中客户端断线及网络异常处理
    webview 离线缓存,html5游戏适用
    Mac os x下配置 Android ndk 开发环境
    从外企到国企的工作环境改变
    微软SQL Server数据库SQL语句导入导出大全,包括与其他数据库和文件的数据的导入导出
    人生第一职业:我当了人民教师
    JOIN 分为内连接,外连接(左外连接,右外连接,全外连接)
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7293822.html
Copyright © 2020-2023  润新知