RoundedImageView源码解析(一) 简介

时间:2022-06-18 18:48:27

选择哪一个RoundedImageView类库

我们可以在网上找到很多关于显示圆角的ImageView开源控件,那么我选择的是哪一款呢?

答案是https://github.com/vinc3m1/RoundedImageView

运行效果

RoundedImageView源码解析(一) 简介

为什么是这一款RoundedImageView类库?

这是一款支持圆角,椭圆,圆形的RoundedImageView类库,可以生成ImageView和Drawable。

并且支持ScaleType和TileModes属性。


网上有许多其他的可以实现类似效果的类库,但是这一款是运行效率最高的,原因如下:

  • 没有使用源bitmap的拷贝
  • 没有使用不是硬件加速,非抗锯齿的clipPath
  • 没有使用setXfermode修剪bitmap,从而导致Canvas绘制两遍bitmap

AndroidStudio中引用该类库

在build.gradle中添加如下代码:

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.makeramen:roundedimageview:2.2.1'
}

如何使用

在xml文件中引用:
<com.makeramen.roundedimageview.RoundedImageView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/imageView1"
        android:src="@drawable/photo1"
        android:scaleType="fitCenter"
        app:riv_corner_radius="30dip"
        app:riv_border_width="2dip"
        app:riv_border_color="#333333"
        app:riv_mutate_background="true"
        app:riv_tile_mode="repeat"
        app:riv_oval="true" />

在代码中引用:
RoundedImageView riv = new RoundedImageView(context);
riv.setScaleType(ScaleType.CENTER_CROP);
riv.setCornerRadius((float) 10);
riv.setBorderWidth((float) 2);
riv.setBorderColor(Color.DKGRAY);
riv.mutateBackground(true);
riv.setImageDrawable(drawable);
riv.setBackground(backgroundDrawable);
riv.setOval(true);
riv.setTileModeX(Shader.TileMode.REPEAT);
riv.setTileModeY(Shader.TileMode.REPEAT);

使用Picasso类库加载网络图片,然后用Transformation方法转化
Transformation transformation = new RoundedTransformationBuilder()
          .borderColor(Color.BLACK)
          .borderWidthDp(3)
          .cornerRadiusDp(30)
          .oval(false)
          .build();

Picasso.with(context)
    .load(url)
    .fit()
    .transform(transformation)
    .into(imageView);