大多数的app的用户登陆后,会显示用户的头像等信息,而用户的头像大多都是圆形的,所以我们想到用Drawable来生成我们需要的圆形图片,用Drawable来生成圆形图片的方法很简单.
下面让我们来看一下是如何来生成的吧,首先我们需要新建一个类来继承Drawable.
public class MyDrawable extends Drawable {
private Paint paint;//画笔
private Bitmap bitmap;//我们要操作的Bitmap
private RectF rectF;//矩形f
public MyDrawable(Bitmap bitmap) {
this.bitmap = bitmap;
paint = new Paint();//初始化画笔
paint.setAntiAlias(true);//抗锯齿
//位图渲染器(参数1:我们要操作的Bitmap,参数2.3:X轴,Y轴的填充类型,
// 类型一共有三种,REPEAT:重复类型,CLAMP:拉伸类型(注意这里的拉伸是指拉伸图片的而最后一个像素),MIRROM:镜像类型)
BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
paint.setShader(shader);
}
/**
* 这个方法是指drawbale将被绘制在画布上的区域
*
* @param left
* @param top
* @param right
* @param bottom
*/
//左上右下
@Override
public void setBounds(int left, int top, int right, int bottom) {
super.setBounds(left, top, right, bottom);
//绘制区域
rectF = new RectF(left, top, right, bottom);
}
//获取bipmap的高度
@Override
public int getIntrinsicHeight() {
return bitmap.getHeight();
}
//获取bitmap的宽
@Override
public int getIntrinsicWidth() {
return bitmap.getWidth();
}
/**
* 这是我们的核心方法,绘制我们想要的图片
*
* @param canvas
*/
@Override
public void draw(Canvas canvas) {
//参数1:绘制的区域,参数2:X轴圆角半径,参数3:Y轴圆角半径,参数4:画笔
//canvas.drawRoundRect(rectF, 50, 50, paint);
//画圆(参数1.2:确定圆心坐标,参数3:半径,参数4:画笔)
canvas.drawCircle(getIntrinsicWidth() / 2, getIntrinsicHeight() / 2, getIntrinsicWidth() / 2, paint);
}
//设置透明度
@Override
public void setAlpha(int alpha) {
}
//设置滤镜渲染颜色
@Override
public void setColorFilter(ColorFilter colorFilter) {
}
//获取透明图
@Override
public int getOpacity() {
return 0;
}
}
写完MyDrawable就可以使用了,使用也很简单,下面是MainActivity的布局文件,这里我只写了一个ImageView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.an.drawabledemo.MainActivity">
<ImageView
android:id="@+id/main_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
接下来就是在MainActivity中使用了,
public class MainActivity extends AppCompatActivity {
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.love);
iv = (ImageView) this.findViewById(R.id.main_iv);
iv.setImageDrawable(new MyDrawable(bitmap));
}
}
就可以得到如下的效果图了,
本人菜鸟一个,有什么不对的地方希望大家指出评论,大家一起学习进步!