自定义ImageView实现圆形图片,主要是在onDraw()方法中实现绘制圆形图片,在onMeasure()中测量圆形的半径并设置View的宽高。效果如下图

代码如下

public class CircleImageView extends ImageView {
//画笔

private Paint mPaint;
//圆形图片的半径
private int mRadius;
//图片的宿放比例
private float mScale;

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

public CircleImageView(Context context, @Nullable AttributeSet attrs) {    super(context, attrs);

}

public CircleImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//由于是圆形,宽高应保持一致
int size = Math.min(getMeasuredWidth(), getMeasuredHeight());
mRadius = size / 2;
setMeasuredDimension(size, size);
}

@SuppressLint("DrawAllocation")@Override

protected void onDraw(Canvas canvas) {

    mPaint = new Paint();


Drawable drawable = getDrawable();

if (null != drawable) {
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();

//初始化BitmapShader,传入bitmap对象
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//计算缩放比例
mScale = (mRadius * 2.0f) / Math.min(bitmap.getHeight(), bitmap.getWidth());

Matrix matrix = new Matrix();
matrix.setScale(mScale, mScale);
bitmapShader.setLocalMatrix(matrix);
mPaint.setShader(bitmapShader);
//画圆形,指定好坐标,半径,画笔
canvas.drawCircle(mRadius, mRadius, mRadius, mPaint);
} else {
super.onDraw(canvas);
}
}

}

自定义好之后,就可以直接在xml布局中使用该控件

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:gravity=“center”
tools:context=“com.sun.zh.bezier.MainActivity”>
android:id="@+id/image"
android:layout_width=“200dp”
android:layout_height=“200dp”
android:scaleType=“centerCrop”
android:src="@drawable/ic_timg" />

注意必须设置src图,设置background图不会出现圆形效果

在ImageView中src与background的区别:

background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸。src是图片内容(前景),bg是背景,可以同时使用。此外scaleType只是对src起作用,bg可设置透明度。在动态加载图片中设置src可使用image.setImageResource(R.drawable.**)。

更多相关文章

  1. Service显示启动和隐式启动
  2. [置顶] Android(安卓)GridView宫格视图 之 BaseAdapter
  3. 说说 Android(安卓)中的通知(Notification)
  4. android图形图像函数汇集
  5. Android(安卓)自定义dialog(封装好的)
  6. 【读书笔记-《Android游戏编程之从零开始》】4.Android(安卓)游
  7. Android(安卓)的第三方报表组件,AChartEngine 案列demo
  8. Android游戏引擎《Rokon》:主要类和方法的介绍文档
  9. 【Android】android4.4从图库选择图片,获取图片路径并裁剪

随机推荐

  1. Android中的一些开关
  2. android实践--进度对话框(ProgressDialog
  3. 用 jdb 追踪 Android
  4. android中wifi原理及流程分析(很经典)
  5. 判断手机是android还是ios,是否用了微信内
  6. Android内嵌H5(2)
  7. android学习笔记20--------------Relativ
  8. IFL嵌入式小组技术博客入口导航
  9. Android系统中自带了很多图标,我们的程序
  10. ibmdeveloper上的android 的文章