android 自定义圆角imageview

时间:2021-12-12 16:22:11

现在很多头像显示都是用圆形,但是我们原生态的ImageView并不能满足我们的要求,所以就要自定义一个圆形的,做法很多种,

提供下我实现的思路,

1:画一个空的画布

2:在空的画布上画一个圆和一个一张图片(这图片是正方形的)

3:取圆形和正方形的交集

4:把在空位图上绘制的内容图片 绘制到imageview上

 代码如下:

package com.example.customimageview.ui;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

public class CustomImageView extends ImageView {

public CustomImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

public CustomImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public CustomImageView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if(drawable==null){
return;
}
//把drawable转换成Bitmap对象,用于显示图片
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();
if(bitmap!=null){
//创建一个空的位图,这里空是指位图上的内容为空,不是指对象本身
Bitmap canvasBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
//创建一个空的画布(也就是说画布上什么都没有)
Canvas myCanvas = new Canvas(canvasBitmap);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setColor(Color.GREEN);
//在空的画布上画一个圆
myCanvas.drawCircle(bitmap.getWidth()/2+0.1f, bitmap.getHeight()/2+0.1f, bitmap.getHeight()/2+0.1f, paint);
//图2个图片的交集
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//在画布上画一个图片
myCanvas.drawBitmap(bitmap, 0, 0, paint);
//最后把在canvasBitmap上绘制的内容绘制到自定义的控件上通过系统的canvas
canvas.drawBitmap(canvasBitmap, 0, 0,null);
}
}
}

使用:

package com.example.customimageview;
import android.app.Activity;
import android.os.Bundle;

import com.example.customimageview.ui.CustomImageView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomImageView imageview = (CustomImageView) findViewById(R.id.imageview);
imageview.setImageResource(R.drawable.ic_launcher);
}
}

布局文件:

<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"
>
<com.example.customimageview.ui.CustomImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
</RelativeLayout>


在这里就是这行paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));设置2张图的模式,大概有如下这么多种

16条Porter-Duff规则   * 1.PorterDuff.Mode.CLEAR   * 2.PorterDuff.Mode.SRC   * 3.PorterDuff.Mode.DST   * 4.PorterDuff.Mode.SRC_OVER   * 5.PorterDuff.Mode.DST_OVER   * 6.PorterDuff.Mode.SRC_IN   * 7.PorterDuff.Mode.DST_IN   * 8.PorterDuff.Mode.SRC_OUT   * 9.PorterDuff.Mode.DST_OUT   * 10.PorterDuff.Mode.SRC_ATOP   * 11.PorterDuff.Mode.DST_ATOP   * 12.PorterDuff.Mode.XOR   * 13.PorterDuff.Mode.DARKEN   * 14.PorterDuff.Mode.LIGHTEN   * 15.PorterDuff.Mode.MULTIPLY   * 16.PorterDuff.Mode.SCREEN  大家可以去看看  在这不一一演示