android圆形头像边框,利用Android中BitmapShader制作自带边框的圆形头像

效果如下:

c0949c563d958746d53dd714a7ba45ae.png

BitmapShader 的简单介绍

关于 Shader是什么,Shader的种类有哪几种以及如何使用不属于本文范畴,对这方面不是很了解的同学,建议先去学习一下 Shader的基本使用。

BitmapShader主要的作用就是 通过Paint对象,对 画布进行指定的Bitmap填充,实现一系列效果,可以有以下三种模式进行选择

1.CLAMP- 拉伸,这里拉伸的是图片的最后一个元素,不断地重复,这个效果,在图片比较小,而所要画的面积比较大的时候会比较明显。

2.REPEAT- 重复,横向纵向不断地重复,不同于上一模式,这种模式在图片比较小不能满足要求是,会在横向纵向不断重复绘制图形。

3.MIRROR- 翻转,这种模式和 REPEAT是类似的,只不过这里的重复是翻转着重复,和折纸的效果差不多。

而我们将要使用的是 CLAMP模式,因为只要我们对图形的大小进行控制,就可以避免图像进行拉伸。

具体实现介绍

为了自定义 图像,边框宽度和颜色,我们首先在 res/values 目录下,新建一个 attrs.xml文件,里面要书写的内容如下所示

当然,在这里还可以添加一些其他的特性。既然定义了我们想要使用的特性,那么我们就要在自定义View里面 解析这些属性并且加以利用,解析过程如下所示

TypedArray type = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView);

mBorderColor = type.getColor(R.styleable.MyCustomView_mborder_color,0);

mDrawable = type.getDrawable(R.styleable.MyCustomView_msrc);

//将获得的 Drawable 转换成 Bitmap

BitmapDrawable bitmapDrawable = (BitmapDrawable) mDrawable;

mBitmap = bitmapDrawable.getBitmap();

mBorderWidth = type.getDimensionPixelSize(R.styleable.MyCustomView_mborder_width, 2);

值得注意的是 mSrc属性的解析,由于获得是 Drawable对象,所以我们需要将其转换为 Bitmap对象。

下面就利用我们获得的 Bitmap对象进行圆形头像的绘制,对 BitmapShader和 Paint的初始化如下所示

mSrcBitmap = Bitmap.createScaledBitmap(mBitmap, mWidth, mHeight, false);

mShader = new BitmapShader(mSrcBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

mPaint = new Paint();

mPaint.setShader(mShader);

mRadius = (mWidth - mBorderWidth * 2 - 4) / 2;

mCircleX = (mWidth) / 2;

mCircleY = (mHeight) / 2;

mSrcBitmap是对获得的图像进行适当的缩小或者放大,以适应我们对图形的要求,而这里的 mWidth和 mHeight又是什么呢?实际上就是我们在 定义视图在layout_width和 layout_height中传递进来的值,不过在这里我对他们进行了处理,也就是选取最小值操作,这样的话就可以避免由于宽大于高或者高大于宽而造成图像填充不满指定区域的现象。值得注意的是,自定义视图,需要对 wrap_content进行特殊处理,否则系统对该属性的视图不予以显示。至于如何进行处理,可以看看本例的源码,很简单,相信很多人一看就知道或者说早就了然于胸。

还有一点需要强调的是这里的 mRadius,也就是将要绘制的圆的半径,为什么要减去边框的宽度 乘 2 呢? 要知道,我们的圆是根据 视图指定的宽度或者高度来画的,如果我们所画 的圆恰好是指定视图的内切圆,那么边框放在哪里呢?它肯定要被画在视图的外面,那样我们就看不到完整的边框了。所以,这么减去的意义在于为边框腾出空间。

经过以上操作,我们就已经将圆形头像绘制出来了,下面来绘制边框,其实非常简单,我只不过是又定义了一个  Paint对象,并且利用它画了一个圆而已,画笔的初始化操作如下所示

mBorderPaint = new Paint();

mBorderPaint.setStyle(Paint.Style.STROKE);

mBorderPaint.setStrokeWidth(mBorderWidth);

mBorderPaint.setColor(mBorderColor);

mBorderPaint.setStrokeCap(Paint.Cap.ROUND);

好了,下面就可以在onDraw()函数中,进行绘制了,如下所示

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.drawCircle(mCircleX, mCircleY, mRadius, mPaint);

canvas.drawCircle(mCircleX, mCircleY, mRadius, mBorderPaint);

}

这样,整个效果就算实现完毕了。下面来看看如何使用

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginBottom="16dp"

android:layout_marginRight="8dp"

app:mborder_color="@android:color/holo_green_light"

app:mborder_width="4dp"

app:msrc="@drawable/myview_test"/>

注意,一定要在容器中加上这么一句

具体实现的核心代码

package com.example.hwaphon.patheffecttest;

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Bitmap;

import android.graphics.BitmapShader;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Shader;

import android.graphics.drawable.BitmapDrawable;

import android.graphics.drawable.Drawable;

import android.util.AttributeSet;

import android.view.View;

/**

* Created by Hwaphon on 2016/5/12.

*/

public class MyView extends View {

private Bitmap mBitmap;

private Drawable mDrawable;

private Bitmap mSrcBitmap;

private BitmapShader mShader;

private Paint mPaint;

private int mWidth, mHeight;

private int mRadius;

private int mCircleX, mCircleY;

private int mBorderColor;

private Paint mBorderPaint;

private int mBorderWidth;

public MyView(Context context) {

this(context, null);

}

public MyView(Context context, AttributeSet attrs) {

super(context, attrs);

TypedArray type = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView);

mBorderColor = type.getColor(R.styleable.MyCustomView_mborder_color,0);

mDrawable = type.getDrawable(R.styleable.MyCustomView_msrc);

//将获得的 Drawable 转换成 Bitmap

BitmapDrawable bitmapDrawable = (BitmapDrawable) mDrawable;

mBitmap = bitmapDrawable.getBitmap();

mBorderWidth = type.getDimensionPixelSize(R.styleable.MyCustomView_mborder_width, 2);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

mWidth = measureWidth(widthMeasureSpec);

mHeight = measureHeight(heightMeasureSpec);

int temp = mWidth > mHeight ? mHeight : mWidth;

mWidth = mHeight = temp;

initView();

setMeasuredDimension(mWidth, mHeight);

}

private int measureHeight(int heightMeasureSpec) {

int size = MeasureSpec.getSize(heightMeasureSpec);

int sizeMode = MeasureSpec.getMode(heightMeasureSpec);

int result = 0;

if (sizeMode == MeasureSpec.EXACTLY) {

result = size;

} else {

result = 200;

if (sizeMode == MeasureSpec.AT_MOST) {

result = Math.min(result, size);

}

}

return result;

}

private int measureWidth(int widthMeasureSpec) {

int size = MeasureSpec.getSize(widthMeasureSpec);

int sizeMode = MeasureSpec.getMode(widthMeasureSpec);

int result = 0;

if (sizeMode == MeasureSpec.EXACTLY) {

result = size;

} else {

result = 200;

if (sizeMode == MeasureSpec.AT_MOST) {

result = Math.min(result, size);

}

}

return result;

}

private void initView() {

mSrcBitmap = Bitmap.createScaledBitmap(mBitmap, mWidth, mHeight, false);

mShader = new BitmapShader(mSrcBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

mPaint = new Paint();

mPaint.setShader(mShader);

mRadius = (mWidth - mBorderWidth * 2) / 2;

mCircleX = (mWidth) / 2;

mCircleY = (mHeight) / 2;

mBorderPaint = new Paint();

mBorderPaint.setStyle(Paint.Style.STROKE);

mBorderPaint.setStrokeWidth(mBorderWidth);

mBorderPaint.setColor(mBorderColor);

mBorderPaint.setStrokeJoin(Paint.Join.ROUND);

mBorderPaint.setStrokeCap(Paint.Cap.ROUND);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.drawCircle(mCircleX, mCircleY, mRadius, mPaint);

canvas.drawCircle(mCircleX, mCircleY, mRadius, mBorderPaint);

}

}

总结

以上就是Android利用BitmapShader制作自带边框圆形头像的全部内容,希望这篇文章对大家开发Android的时候能有所帮助,如果有疑问大家可以留言交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Android Studio圆形边框添加图片,您可以按照以下步骤进行操作: 1. 在res/drawable文件夹创建一个XML文件(例如circlular_border.xml),并添加以下代码: ``` <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="50dp"/> <stroke android:width="2dp" android:color="@color/black"/> <solid android:color="@color/white"/> </shape> ``` 2. 在布局文件添加ImageView控件,并为其设置背景为刚刚创建的XML文件: ``` <ImageView android:id="@+id/imageView" android:layout_width="100dp" android:layout_height="100dp" android:background="@drawable/circular_border" /> ``` 3. 在Java代码加载您想要添加的图片,并将其设置为ImageView的源(src): ``` ImageView imageView = findViewById(R.id.imageView); imageView.setImageResource(R.drawable.your_image_file); ``` 这样,您就可以在圆形边框添加图片了。请注意,如果您想要实现圆形ImageView,可以使用CircleImageView库。 ### 回答2: 在Android Studio添加圆形边框并在其添加图片的步骤如下: 1. 首先,在drawable文件夹下创建一个圆形边框的XML文件。例如,创建一个名为circle_border.xml的文件。 2. 在circle_border.xml文件,使用shape标签定义一个圆形的形状,并设置边框的颜色和宽度。例如,可以使用solid标签设置边框的颜色,stroke标签设置边框的宽度。同时,设置一个size属性来限定圆形的大小。以下是circle_border.xml文件的示例代码: ```xml <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#FF0000" /> <stroke android:color="#000000" android:width="2dp" /> <size android:width="100dp" android:height="100dp" /> </shape> ``` 3. 在布局文件,添加一个ImageView元素,并为它设置drawable属性为前面创建的circle_border.xml文件。例如,可以将drawable属性设置为@drawable/circle_border。以下是一个示例代码: ```xml <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/circle_border" /> ``` 4. 最后,在Java代码,使用Glide或者Picasso等图片加载库来加载要显示的图片,并将其设置到ImageView元素。以下是一个使用Glide库加载图片的示例代码: ```java ImageView imageView = findViewById(R.id.imageView); Glide.with(this) .load(R.drawable.your_image) .into(imageView); ``` 以上就是在Android Studio添加圆形边框并添加图片的步骤。通过创建圆形边框的XML文件,并将该边框作为ImageView的drawable属性,再加载图片到ImageView,即可实现圆形边框添加图片的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值