关闭

Android 必知必会-使用 supportV4 的 RoundedBitmapDrawable 实现圆角

标签: android
3300人阅读 评论(1) 收藏 举报
分类:

如果移动端访问不佳,请访问 –> Github版

RoundedBitmapDrawablesupportV4 下的一个类,有了它,显示圆角和圆形图片的情况下就不需要额外的第三方类库了,还能和各种图片加载库配合使用。

背景

今天无意间看到一段实现圆形头像的代码:

RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap);
drawable.setCircular(true);

RoundedBitmapDrawable 这个类顿时就引起我的好奇了,一查发现是 android.support.v4.graphics.drawable.RoundedBitmapDrawable点击此处 可以看到官方的介绍。这个类中的两个方法是今天的主角:

return method
void setCircular(boolean circular) : Sets the image shape to circular.
void setCornerRadius(float cornerRadius) : Sets the corner radius to be applied when drawing the bitmap.

setCircular(boolean circular) : 把图片的形状设为圆形;

setCornerRadius(float cornerRadius) : 设置图片的圆角半径。

这里贴一下源码,更能清晰的知道它的实现:

    /**
     * Sets the image shape to circular.
     * <p>This overwrites any calls made to {@link #setCornerRadius(float)} so far.</p>
     */
    public void setCircular(boolean circular) {
        mIsCircular = circular;
        mApplyGravity = true;
        if (circular) {
            updateCircularCornerRadius();
            mPaint.setShader(mBitmapShader);
            invalidateSelf();
        } else {
            setCornerRadius(0);
        }
    }

    private void updateCircularCornerRadius() {
        final int minCircularSize = Math.min(mBitmapHeight, mBitmapWidth);
        mCornerRadius = minCircularSize / 2;
    }

    /**
     * Sets the corner radius to be applied when drawing the bitmap.
     */
    public void setCornerRadius(float cornerRadius) {
        if (mCornerRadius == cornerRadius) return;

        mIsCircular = false;
        if (isGreaterThanZero(cornerRadius)) {
            mPaint.setShader(mBitmapShader);
        } else {
            mPaint.setShader(null);
        }

        mCornerRadius = cornerRadius;
        invalidateSelf();
    }

至于具体的实现,阅读源码发现官方使用了 BitmapShader 来实现的圆角。

如果你有兴趣研究,更多资料:

实现

先看效果图:

2016-08-25_08104B752A742F5F71AE7F16661CBA2A.jpg

其中第一个图片是圆形,第二个和第三个图片设置了自定义大小的圆角。

xxActivity

private void init() {
        RoundedBitmapDrawable drawableA = RoundedBitmapDrawableFactory.create(getResources(), id2Bitmap(this, R.drawable.icon_avatar));
        drawableA.setCircular(true);
        rbA.setImageDrawable(drawableA);

        RoundedBitmapDrawable drawableB = RoundedBitmapDrawableFactory.create(getResources(), id2Bitmap(this, R.drawable.icon_avatar));
        drawableB.setCornerRadius(30L);
        rbB.setImageDrawable(drawableB);

        RoundedBitmapDrawable drawableC = RoundedBitmapDrawableFactory.create(getResources(), id2Bitmap(this, R.drawable.icon_avatar));
        drawableC.setCornerRadius(60L);
        rbC.setImageDrawable(drawableC);
    }

    public static Bitmap id2Bitmap(Context context, int id) {
        return BitmapFactory.decodeResource(context.getResources(), id);
    }

activity_xx.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    >

    <ImageView
        android:id="@+id/rb_a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <ImageView
        android:id="@+id/rb_b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        />

    <ImageView
        android:id="@+id/rb_c"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        />

</LinearLayout>

代码比较简单,有什么问题欢迎随时和我联系。

总结

一个小小的发现,让我又少使用了一个第三方库,心情大好。另外在此过程中发现的 BitmapShader 是学习自定义 View 的一个不错的切入点,需要再研究研究。

PS:你可以通过下面的方式和我联系

2
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

[Material Design]使用RoundedBitmapDrawable快速生成圆角和圆形图片

在今年I/O大会之前,如果要实现圆角或者圆形图片可以自定义View,比如之前的博文《Android 自定义UI View - 03 圆形图片控件》或者通过一些第三方库来实现,比如下面这个: ...
  • hahashui123
  • hahashui123
  • 2015-07-17 17:02
  • 3436

Android support library支持包常用控件介绍(一)

谷歌官方推出Material Design 设计理念已经有段时间了,为支持更方便的实现Material Design设计效果,官方给出了Android support design library 支...
  • zhangke3016
  • zhangke3016
  • 2016-06-25 00:27
  • 8825

android RoundedBitmapDrawable最简单方式实现圆角图片(一)

一次偶然的机会,让我发现了新大陆RoundedBitmapDrawable,不难看出他的作用是圆角图片。今天来看下史上最简单的方式,为啥说最简单呢,因为系统已经提供了api,你只需一句话调用就完事,你...
  • kieCool
  • kieCool
  • 2017-10-16 17:30
  • 199

【Android】【Drawable】图片圆形化(RoundedBitmapDrawable)

使用到的类: android.support.v4.graphics.drawable.RoundedBitmapDrawable; android.support.v4.graphics.drawa...
  • lotusve
  • lotusve
  • 2015-01-28 18:06
  • 1136

Fragment的用法(建议用support.v4的包,所以导包时认真注意,用getsupport的那个方法)

碎片的简单用法 left_fragmentxml right_fragmentxml activity_mainxml LeftFragment RightFragment MainActivity ...
  • qq_16444837
  • qq_16444837
  • 2015-09-02 21:17
  • 2120

ImageView的圆角或圆形使用原生support v4中的RoundedBitmapDrawable实现

前言之前曾使用Xfermode和BitmapShader实现了ImageView的圆角/圆形的效果。后来无意中在support v4包中,发现了一个类:RoundedBitmapDrawable。原来...
  • yuminfeng728
  • yuminfeng728
  • 2017-01-05 21:32
  • 581

Android Lollipop 新特性 -- Palette RoundedBitmapDrawable

Android Lollipop 新特性 - Palette Palette 可以从一张图片中提取颜色,我们可以把提取的颜色融入到App UI中,可以使UI风格更加美观融洽。比如,我们可以从图片...
  • u010665691
  • u010665691
  • 2015-03-06 08:19
  • 1909

使用RoundedBitmapDrawable快速生成圆角和圆形图片

转自:http://blog.csdn.net/hahashui123/article/details/46929909 在今年I/O大会之前,如果要实现圆角或者圆形图片可以自定义View,...
  • bsmmaoshenbo
  • bsmmaoshenbo
  • 2016-08-25 19:39
  • 443

Android必知必会-使用okhttp的PUT方式上传文件

背景公司的文件上传接口使用PUT协议,之前一直用的都是老项目中的上传类,现在项目中使用了okhttp网络库,就查了下资料,在这里分享一下okhttp使用PUT方式上传文件的代码。
  • ys743276112
  • ys743276112
  • 2016-03-21 12:00
  • 6239

Android必知必会--使用shape制作drawable素材

前言最近看到朋友制作的Android APP使用了极少的图片,但是图形却极其丰富,问了之后得知是使用shape绘制的,有很多优点。 下面是我整理的一些素材:预览下面是图片预览:代码布局文件<Line...
  • ys743276112
  • ys743276112
  • 2015-05-29 13:05
  • 2291
    个人资料
    • 访问:291417次
    • 积分:3447
    • 等级:
    • 排名:第11264名
    • 原创:67篇
    • 转载:8篇
    • 译文:3篇
    • 评论:139条
    博客专栏
    文章分类
    最新评论
    样式调整
    • 1. 优化正文标题区分强度
    • 2. 优化行内代码的显示样式
    • 3. 修复 Safari 浏览器下字体样式错误