Android 简易 自定义ImageView 实现圆形头像
2017-11-16 21:16
686 查看
实现思路:
首先把xml文件传过来的bitmap放缩为组件对应的大小,再裁剪成正方形,然后通过Paint.setShader(new BitmapShader())方法,将bitmap设置为填充色,最后画一个圆搞定。效果:
源码 :
import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Shader; import android.support.annotation.Nullable; import android.util.AttributeSet; /** * Created by 煎鱼 on 2017/11/11. */ public class RoundView extends android.support.v7.widget.AppCompatImageView { private static final String TAG = "RoundView"; private int D_Width;//圆的直径,D_Width = Math.min(width,heigh); private int src; //通过自定义属性传进来的bitmap的资源码 private Bitmap b; public RoundView(Context context) { super(context); } public RoundView(Context context, @Nullable AttributeSet attrs) { this(context, attrs,0); } public RoundView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context,attrs); } private void init(Context context, AttributeSet attrs) { //获取自定义属性。 TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RoundView); src = ta.getResourceId( R.styleable.RoundView_src,-1); if( src== -1 ){ b = BitmapFactory.decodeResource(getResources(), R.drawable.t1);//默认图 }else{ b = BitmapFactory.decodeResource(getResources(), src); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); int heighMode = MeasureSpec.getMode(heightMeasureSpec); int heigh = MeasureSpec.getSize(heightMeasureSpec); D_Width = Math.min(width,heigh); alterBitmap(); setMeasuredDimension(width, heigh); } private void alterBitmap() { //先缩小再裁剪: b = scaleBitmap( b , (float) D_Width/Math.min(b.getWidth(),b.getHeight()) );//计算比例 b = cropBitmap(b); } @Override protected void onDraw(Canvas canvas) { Paint mPaint = new Paint(); mPaint.setAntiAlias(true); //以bitmap为填充内容画一个圆 mPaint.setShader(new BitmapShader(b, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR)); canvas.drawCircle(D_Width / 2, D_Width / 2, D_Width / 2, mPaint); //画外边框 mPaint.reset(); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(10); mPaint.setColor(0xffdddddd); canvas.drawCircle(D_Width / 2, D_Width / 2, D_Width / 2, mPaint); } /** * 按比例缩放图片 * * @param origin 原图 * @param ratio 比例 * @return 新的bitmap */ private Bitmap scaleBitmap(Bitmap origin, float ratio) { if (origin == null) { return null; } int width = origin.getWidth(); int height = origin.getHeight(); Matrix matrix = new Matrix(); matrix.postScale(ratio, ratio); Bitmap newBM = Bitmap.createBitmap(origin, 0, 0, width, height, matrix, true); if (newBM.equals(origin)) { return newBM; } origin.recycle(); return newBM; } /** * 裁剪成正方形 * * @param bitmap 原图 * @return 裁剪后的图像 */ private Bitmap cropBitmap(Bitmap bitmap) { int w = bitmap.getWidth(); // 得到图片的宽,高 int h = bitmap.getHeight(); int cropWidth = w; int cropHeight = h; //在取图片较短边作为正方形的边长,从图片长边的中间进行裁剪 if(w>=h){ cropWidth = h; return Bitmap.createBitmap(bitmap, (w-h)/2, 0, cropWidth, cropHeight , null, false); }else{ cropHeight = w; return Bitmap.createBitmap(bitmap, 0 , (h-w)/2 , cropWidth, cropHeight , null, false); } } }
相关文章推荐
- android 自定义ImageView控件实现圆形图片-适用于用户头像
- Android 自定义圆形头像CircleImageView支持加载网络图片的实现代码
- android 自定义ImageView控件实现圆形图片-适用于用户头像
- Android ImageView实现圆形头像
- android圆形头像的实现类CircleImageView.java
- 几行实现圆形头像,以及一些常见需求形状自定义ImageView组件
- Android利用CircleImageView实现圆形头像的方法
- Android 自定义ImageView, 圆形六边形头像
- 【Android开源项目分析】自定义圆形头像CircleImageView的使用和源码分析
- Android利用CircleImageView实现圆形头像效果
- Android开发之自定义圆形的ImageView的实现
- android自定义ImageView实现圆形图片
- Android使用CircleImageView实现圆形头像的方法
- 【Android自定义View实战】之自定义圆形头像CircleImageView支持加载网络图片
- Android使用Xfermode图形渲染方法实现自定义圆形、圆角和椭圆ImageView
- 【Android】自定义圆形ImageView(圆形头像 可指定大小)
- android ImageView 实现圆形图片(QQ头像)
- Android实现自定义圆形/圆角ImageView
- Android开发之自定义圆形的ImageView的实现
- 自定义ImageView实现圆形头像