Android圆形图像的实现。

实现方法主要是重写ImageView,然后在布局中进行调用。
看看效果:
圆形图像
代码如下(流行拿来主义,最核心的也是拿来):

public class RingsImgageView extends ImageView {
    private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;

    private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
    private static final int COLORDRAWABLE_DIMENSION = 1;

    private static final int DEFAULT_BORDER_WIDTH = 0;
    private static final int DEFAULT_BORDER_COLOR = Color.BLACK;

    private final RectF mDrawableRect = new RectF();
    private final RectF mBorderRect = new RectF();

    private final Matrix mShaderMatrix = new Matrix();
    private final Paint mBitmapPaint = new Paint();
    private final Paint mBorderPaint = new Paint();

    private int mBorderColor = DEFAULT_BORDER_COLOR;
    private int mBorderWidth = DEFAULT_BORDER_WIDTH;

    private Bitmap mBitmap;
    private BitmapShader mBitmapShader;
    private int mBitmapWidth;
    private int mBitmapHeight;

    private float mDrawableRadius;
    private float mBorderRadius;

    private boolean mReady;
    private boolean mSetupPending;

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

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

    public RingsImgageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        super.setScaleType(SCALE_TYPE);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RingsImageView, defStyle, 0);

        mBorderWidth = a.getDimensionPixelSize(R.styleable.RingsImageView_border_width, DEFAULT_BORDER_WIDTH);
        mBorderColor = a.getColor(R.styleable.RingsImageView_border_color, DEFAULT_BORDER_COLOR);

        a.recycle();

        mReady = true;

        if (mSetupPending) {
            setup();
            mSetupPending = false;
        }
    }

    @Override
    public ScaleType getScaleType() {
        return SCALE_TYPE;
    }

    @Override
    public void setScaleType(ScaleType scaleType) {
        if (scaleType != SCALE_TYPE) {
            throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (getDrawable() == null) {
            return;
        }

        canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        setup();
    }


    public int getBorderColor() {
        return mBorderColor;
    }

    public void setBorderColor(int borderColor) {
        if (borderColor == mBorderColor) {
            return;
        }

        mBorderColor = borderColor;
        mBorderPaint.setColor(mBorderColor);
        invalidate();
    }

    public int getBorderWidth() {
        return mBorderWidth;
    }

    public void setBorderWidth(int borderWidth) {
        if (borderWidth == mBorderWidth) {
            return;
        }

        mBorderWidth = borderWidth;
        setup();
    }

    @Override
    public void setImageBitmap(Bitmap bm) {
        super.setImageBitmap(bm);
        mBitmap = bm;
        setup();
    }

    @Override
    public void setImageDrawable(Drawable drawable) {
        super.setImageDrawable(drawable);
        mBitmap = getBitmapFromDrawable(drawable);
        setup();
    }

    @Override
    public void setImageResource(int resId) {
        super.setImageResource(resId);
        mBitmap = getBitmapFromDrawable(getDrawable());
        setup();
    }

    private Bitmap getBitmapFromDrawable(Drawable drawable) {
        if (drawable == null) {
            return null;
        }

        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable) drawable).getBitmap();
        }

        try {
            Bitmap bitmap;

            if (drawable instanceof ColorDrawable) {
                bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
            } else {
                bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
            }

            Canvas canvas = new Canvas(bitmap);
            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
            drawable.draw(canvas);
            return bitmap;
        } catch (OutOfMemoryError e) {
            return null;
        }
    }

    private void setup() {
        if (!mReady) {
            mSetupPending = true;
            return;
        }

        if (mBitmap == null) {
            return;
        }

        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

        mBitmapPaint.setAntiAlias(true);
        mBitmapPaint.setShader(mBitmapShader);

        mBorderPaint.setStyle(Paint.Style.STROKE);
        mBorderPaint.setAntiAlias(true);
        mBorderPaint.setColor(mBorderColor);
        mBorderPaint.setStrokeWidth(mBorderWidth);

        mBitmapHeight = mBitmap.getHeight();
        mBitmapWidth = mBitmap.getWidth();

        mBorderRect.set(0, 0, getWidth(), getHeight());
        mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);

        mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth);
        mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);

        updateShaderMatrix();
        invalidate();
    }

    private void updateShaderMatrix() {
        float scale;
        float dx = 0;
        float dy = 0;

        mShaderMatrix.set(null);

        if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
            scale = mDrawableRect.height() / (float) mBitmapHeight;
            dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
        } else {
            scale = mDrawableRect.width() / (float) mBitmapWidth;
            dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
        }

        mShaderMatrix.setScale(scale, scale);
        mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);

        mBitmapShader.setLocalMatrix(mShaderMatrix);
    }

}

然后在values下,attrs文件中贴上如下代码:

<resources>
    <declare-styleable name="RingsImageView">
        <attr name="border_width" format="dimension" />
        <attr name="border_color" format="color" />
    </declare-styleable>
</resources>

在所需有显示的布局文件中:

//一定要配置
 xmlns:myxmlns="http://schemas.android.com/apk/res-auto"

//调用自定义的ImgageView
 <com.包名.ring.RingsImgageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@null"
        android:scaleType="centerCrop"
        myxmlns:border_width="5dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        myxmlns:border_color="#dddddd"
        android:src="@mipmap/uu"
        />

完。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android实现圆形剪裁框的方法有许多,以下是其中一种实现方式: 1. 创建一个圆形的 ShapeDrawable 可以通过创建一个圆形的 ShapeDrawable 对象来实现圆形剪裁框。在 drawable 目录下创建一个 xml 文件,例如 circular_shape.xml,内容如下: ```xml <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="@android:color/transparent" /> <stroke android:width="5dp" android:color="@android:color/white" /> </shape> ``` 这个 ShapeDrawable 对象是一个圆形,有一个白色的描边和一个透明的填充。 2. 创建一个 ImageView布局文件中创建一个 ImageView,设置其宽高相等,并设置 ScaleType 为 centerCrop。例如: ```xml <ImageView android:id="@+id/image_view" android:layout_width="200dp" android:layout_height="200dp" android:scaleType="centerCrop" /> ``` 3. 将 ShapeDrawable 设置为 ImageView 的背景 在代码中获取 ImageView 对象,并将 ShapeDrawable 对象设置为其背景。例如: ```java ImageView imageView = findViewById(R.id.image_view); ShapeDrawable shapeDrawable = (ShapeDrawable) ContextCompat.getDrawable(this, R.drawable.circular_shape); imageView.setBackground(shapeDrawable); ``` 这样,ImageView 就被圆形剪裁了,只显示了圆形区域内的图片。 ### 回答2: Android 圆形剪裁框是一种图形处理技术,常用于将图片或者其他视图以圆形形式显示。 实现圆形剪裁框的方法有很多种,其中常用的方法是使用 BitmapShader 和 Canvas 对图片进行裁剪和绘制。 首先,我们需要创建一个圆形的 Shape,可以使用 ShapeDrawable 或者自定义一个继承自 Drawable 的类。然后,通过设置 Drawable 的 Bounds 为图片的边界,即可限制绘制的区域为圆形。 接下来,我们需要获取源图像的 Bitmap 对象,并根据需要设置尺寸和缩放比例。然后,使用 BitmapShader 将 Bitmap 对象与圆形的 Shape 进行关联,创建一个 Paint 对象并设置 Shader 为 BitmapShader。 接着,我们创建一个新的 Bitmap,并创建一个 Canvas 对象并将其与 Bitmap 关联。然后,使用 Canvas 的 drawCircle 方法绘制一个圆形,通过设置 Paint 的 Xfermode 为 PorterDuff.Mode.SRC_IN,实现将 Bitmap 绘制到圆形区域的效果。 最后,我们将处理好的 Bitmap 绘制在指定的 View 或者 ImageView 中,并设置为背景或者源图像。 圆形剪裁框在 Android 开发中经常用于实现头像展示、圆形图标等功能。通过上述的步骤,我们可以将任意形状的图片剪裁为圆形,实现更加美观和独特的视觉效果。同时,我们也可以通过添加边框、描边等操作,进一步丰富圆形剪裁框的效果。 总之,Android 圆形剪裁框是一种常用的图形处理技术,通过对 Bitmap 进行裁剪和绘制,可以实现将图片以圆形形式展示的效果。 ### 回答3: Android圆形剪裁框是一种常见的图像处理技术,用于将图像裁剪成圆形形状。在Android开发中,可以使用一些库或自定义视图来实现这个效果。 一种常见的实现方式是使用ImageView和BitmapShader结合,可以按以下步骤进行操作: 1. 通过ImageView来显示要剪裁的图像,可以在布局文件中添加一个ImageView控件。 2. 加载图像资源到Bitmap对象中。 3. 创建一个正方形的 Bitmap 对象作为剪裁框的背景,可以使用Bitmap.createBitmap()方法,并设置宽高为图像的宽高中较大的值。 4. 创建一个BitmapShader对象,用于指定图像的绘制方式为填充剪裁框。可以使用BitmapShader的构造方法并传入图像资源和Shader.TileMode的相关参数。 5. 创建一个Paint对象,并设置其颜色过滤器为一个PorterDuffColorFilter。这个过滤器用于限制只在剪裁框内绘制图像。 6. 创建一个圆形的Path对象,用于绘制剪裁框形状。 7. 在onDraw方法中,绘制剪裁框的背景Bitmap对象,并设置Paint的图像绘制方式为Shader。然后,使用drawCircle方法绘制圆形剪裁框。 8. 设置ImageView的裁剪模式为圆形,可以使用ImageView.setScaleType()方法设置ScaleType为CENTER_CROP。 通过以上步骤,就可以将图像裁剪成圆形剪裁框的形状。这样,在ImageView中显示的图像就会被自动裁剪成圆形,并填充到指定的剪裁框中。 总结起来,实现Android圆形剪裁框的关键是使用BitmapShader来绘制图像,并通过Paint的过滤器限定绘制范围。另外,利用ImageView的ScaleType属性可以更方便地实现圆形剪裁框的显示效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值