利用Drawable生成圆形图片

大多数的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));
    }
}

就可以得到如下的效果图了,

这里写图片描述

本人菜鸟一个,有什么不对的地方希望大家指出评论,大家一起学习进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值