zoukankan      html  css  js  c++  java
  • Android笔记之RoundedImageView

    参考项目:GcsSloop/rclayout

    实现1,利用Canvas.clipPath来实现,适用于任何View(无法去除锯齿效果)

    package com.bu_ish.blog;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Path;
    import android.util.AttributeSet;
    
    import androidx.appcompat.widget.AppCompatImageView;
    
    public class RoundedImageView extends AppCompatImageView {
        private int cornerRadius = 12;
        private Path path;
    
        public RoundedImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
            path = new Path();
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            ViewUtils.clipRoundedPathForCanvas(this, canvas, path, cornerRadius);
            super.onDraw(canvas);
        }
    
        public void setCornerRadius(int radius) {
            cornerRadius = radius;
            invalidate();
        }
    }
    package com.bu_ish.blog;
    
    import android.graphics.Canvas;
    import android.graphics.Path;
    import android.view.View;
    
    public class ViewUtils {
        public static void clipRoundedPathForCanvas(View view, Canvas canvas, Path path, int cornerRadius) {
            makePathRounded(view, path, cornerRadius);
            canvas.clipPath(path);
        }
    
        private static void makePathRounded(View view, Path path, int cornerRadius) {
            int width = view.getWidth(), height = view.getHeight();
            path.moveTo(cornerRadius, 0);
            path.lineTo(width - cornerRadius, 0);
            path.quadTo(width, 0, width, cornerRadius);
            path.lineTo(width, height - cornerRadius);
            path.quadTo(width, height, width - cornerRadius, height);
            path.lineTo(cornerRadius, height);
            path.quadTo(0, height, 0, height - cornerRadius);
            path.lineTo(0, cornerRadius);
            path.quadTo(0, 0, cornerRadius, 0);
        }
    }

    实现2,利用Canvas.drawPath实现,可抗锯齿,适用于任何View(但是在AS中无法预览圆角效果)

    package com.bu_ish.blog;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Path;
    import android.graphics.PorterDuff;
    import android.graphics.PorterDuffXfermode;
    import android.graphics.RectF;
    import android.util.AttributeSet;
    
    import androidx.appcompat.widget.AppCompatImageView;
    
    public class RoundedImageView extends AppCompatImageView {
        private final Path roundedPath, pathToDraw;
        private final RectF rect;
        private final Paint paint;
        private int cornerRadius = 50;
    
        public RoundedImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
            roundedPath = new Path();
            pathToDraw = new Path();
            rect = new RectF();
            paint = new Paint();
            initializePaint();
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);
            super.onDraw(canvas);
            addRoundRectToRoundedPath();
            preparePathToDraw();
            canvas.drawPath(pathToDraw, paint);
            canvas.restore();
        }
    
        private void initializePaint() {
            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
            paint.setStyle(Paint.Style.FILL);
            paint.setAntiAlias(true);
        }
    
        private void addRoundRectToRoundedPath() {
            rect.left = 0;
            rect.top = 0;
            rect.right = getWidth();
            rect.bottom = getHeight();
         roundedPath.reset(); roundedPath.addRoundRect(rect, cornerRadius, cornerRadius, Path.Direction.CW); }
    private void preparePathToDraw() { pathToDraw.reset(); pathToDraw.addRect(0, 0, getWidth(), getHeight(), Path.Direction.CW); pathToDraw.op(roundedPath, Path.Op.DIFFERENCE); } public void setCornerRadius(int radius) { cornerRadius = radius; invalidate(); } }

    实现3,使用BitmapShader实现,仅适用于ImageView,参考Demo:https://pan.baidu.com/s/1WFyZkgmwckNSVMqdLLxymw,提取码:nvb8

    一个比较好的开源项目

    vinc3m1/RoundedImageView: A fast ImageView that supports rounded corners, ovals, and circles. 

  • 相关阅读:
    023.抓到“拔粪青年”
    JQuery给元素动态增删类或特性
    HTML元素的基本特性
    ASP.NET MVC中如何在客户端进行必要的判断
    ASP.NET MVC如何在页面加载完成后ajax异步刷新
    C#如何根据DataTable生成泛型List或者动态类型list
    C#sql语句如何使用占位符
    在html借助元素特性存储信息
    ASP.NET MVC中如何以ajax的方式在View和Action中传递数据
    如何根据集合动态构建复选框选择控件
  • 原文地址:https://www.cnblogs.com/buyishi/p/12024105.html
Copyright © 2011-2022 走看看