Android实现图片设置圆角形式

 更新时间:2021年11月25日 14:23:43   作者:彬sir哥  
这篇文章主要为大家详细介绍了Android实现图片设置圆角形式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android实现图片设置圆角形式的具体代码,供大家参考,具体内容如下

1.自定义的图片圆角形式CircleImageView类

public class CircleImageView extends ImageView {
    private static final Xfermode MASK_XFERMODE;
    private Bitmap mask;
    private Paint paint;
    private int mBorderWidth = 10;
    private int mBorderColor = Color.parseColor("#f2f2f2");
    private boolean useDefaultStyle = false;

    static {
        PorterDuff.Mode localMode = PorterDuff.Mode.DST_IN;
        MASK_XFERMODE = new PorterDuffXfermode(localMode);
    }

    public CircleImageView(Context context) {
        super(context);
    }

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

    public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircularImage);
        mBorderColor = a.getColor(R.styleable.CircularImage_border_color, mBorderColor);
        final int def = (int) (2 * context.getResources().getDisplayMetrics().density + 0.5f);
        mBorderWidth = a.getDimensionPixelOffset(R.styleable.CircularImage_border_width, def);
        a.recycle();
    }

    private void useDefaultStyle(boolean useDefaultStyle) {
        this.useDefaultStyle = useDefaultStyle;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (useDefaultStyle) {
            super.onDraw(canvas);
            return;
        }
        final Drawable localDraw = getDrawable();
        if (localDraw == null) {
            return;
        }
        if (localDraw instanceof NinePatchDrawable) {
            return;
        }
        if (this.paint == null) {
            final Paint localPaint = new Paint();
            localPaint.setFilterBitmap(false);
            localPaint.setAntiAlias(true);
            localPaint.setXfermode(MASK_XFERMODE);
            this.paint = localPaint;
        }
        final int width = getWidth();
        final int height = getHeight();
        /** 保存layer */
        int layer = canvas.saveLayer(0.0F, 0.0F, width, height, null, 31);
        /** 设置drawable的大小 */
        localDraw.setBounds(0, 0, width, height);
        /** 将drawable绑定到bitmap(this.mask)上面(drawable只能通过bitmap显示出来) */
        localDraw.draw(canvas);
        if ((this.mask == null) || (this.mask.isRecycled())) {
            this.mask = createOvalBitmap(width, height);
        }
        /** 将bitmap画到canvas上面 */
        canvas.drawBitmap(this.mask, 0.0F, 0.0F, this.paint);
        /** 将画布复制到layer上 */
        canvas.restoreToCount(layer);
        drawBorder(canvas, width, height);
    }

    /**
     * 绘制圆形边框
     */
    private void drawBorder(Canvas canvas, final int width, final int height) {
        if (mBorderWidth == 0) {
            return;
        }
        final Paint mBorderPaint = new Paint();
        mBorderPaint.setStyle(Paint.Style.STROKE);
        mBorderPaint.setAntiAlias(true);
        mBorderPaint.setColor(mBorderColor);
        mBorderPaint.setStrokeWidth(mBorderWidth);
        canvas.drawCircle(width / 2, height / 2, (width - mBorderWidth) / 2, mBorderPaint);
        canvas = null;
    }

    public Bitmap createOvalBitmap(final int width, final int height) {
        Bitmap.Config localConfig = Bitmap.Config.ARGB_8888;
        Bitmap localBitmap = Bitmap.createBitmap(width, height, localConfig);
        Canvas localCanvas = new Canvas(localBitmap);
        Paint localPaint = new Paint();
        final int padding = (mBorderWidth - 3) > 0 ? mBorderWidth - 3 : 1;
        /**
         * 设置椭圆的大小(因为椭圆的最外边会和border的最外边重合的,如果图片最外边的颜色很深,有看出有棱边的效果,所以为了让体验更加好,
         * 让其缩进padding px)
         */
        RectF localRectF = new RectF(padding, padding, width - padding, height - padding);
        localCanvas.drawOval(localRectF, localPaint);
        return localBitmap;
    }
}

1.1 在values目录下创建一个circle_attr.xml,文件内容:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CircularImage">
        <attr name="border_width" format="dimension" />
        <attr name="border_color" format="color" />
    </declare-styleable>
</resources>

如下图:

2.activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:src="@drawable/ic_sp" />

        <com.demo.test.bitmap.CircleImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginLeft="50dp"
            android:src="@drawable/ic_sp" />
    </LinearLayout>
</LinearLayout>

3.MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

运行后结果:

 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android EditText追加空格、限制字符等方法示例

    Android EditText追加空格、限制字符等方法示例

    这篇文章主要给大家介绍了关于Android EditText追加空格、限制字符等的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Android中ViewPager1和ViewPager2的使用教程

    Android中ViewPager1和ViewPager2的使用教程

    这篇文章主要介绍了Android中ViewPager1和ViewPager2的使用,效果图是结合BottomNavigationView+ViewPager一起使用的,具体实例代码跟随小编一起看看吧
    2021-10-10
  • Android自定义View实现数字雨效果的全过程

    Android自定义View实现数字雨效果的全过程

    小时候看时印象最深的就是数字雨了,导致我现在写代码也要是黑屏,下面这篇文章主要给大家介绍了关于Android自定义View实现数字雨效果的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Android实现密码明密文切换(小眼睛)

    Android实现密码明密文切换(小眼睛)

    这篇文章主要为大家详细介绍了Android实现密码明密文切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Android中的HOOK技术是什么

    Android中的HOOK技术是什么

    最近一段时间在研究Android加壳和脱壳技术,其中涉及到了一些hook技术,于是将自己学习的一些hook技术进行了一下梳理,以便后面回顾和大家学习
    2023-02-02
  • Android实现万能自定义阴影控件实例代码

    Android实现万能自定义阴影控件实例代码

    这篇文章主要给大家介绍了关于Android实现万能自定义阴影控件的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Android实现IM多人员组合的群组头像

    Android实现IM多人员组合的群组头像

    这篇文章主要为大家详细介绍了Android实现IM多人员组合的群组头像,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Flutter本地存储之基本的键值对存储详解

    Flutter本地存储之基本的键值对存储详解

    在原生的 Android 或 iOS 中,都提供了基本的键值对存储方式,在 Flutter 中,提供了 shared_preferences 这个插件来实现本地键值对数据存储,本文就来和大家简单聊聊吧
    2023-03-03
  • android Socket实现简单聊天小程序

    android Socket实现简单聊天小程序

    这篇文章主要为大家详细介绍了android Socket实现简单聊天小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Android自定义View实现气泡动画

    Android自定义View实现气泡动画

    这篇文章主要为大家详细介绍了Android自定义View实现气泡动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04

最新评论