自定义圆角ImageVIew
来源:互联网 发布:网络好但是迅雷下载慢 编辑:程序博客网 时间:2024/06/14 11:06
今天继续写写博客,坚持下去懒癌是有救的。这个控件可以给图片带上圆角矩形或者圆形效果,并可以设置外带的边框。废话少说,先看看事例图:
上面两个就是正圆和圆角矩形的效果啦。它会自动缩放图片使之中心对齐铺满。
下面是写在属性文件里的自定义属性,边框颜色,边框大小,图片,是否是圆形,圆角值:
<declare-styleable name="CircleImageView"> <attr name="strokeColor" format="color"></attr> <attr name="strokeWidth" format="dimension"></attr> <attr name="image" format="reference"></attr> <attr name="isCircle" format="boolean"></attr> <attr name="radius" format="dimension"></attr> </declare-styleable>
下面是控件的代码:
package com.example.huangyi.test.widge;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Bitmap;import android.graphics.BitmapShader;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.RectF;import android.graphics.Shader;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.View;import com.example.huangyi.test.R;/** * Created by huangyi on 17-5-23. */public class CircleImageView extends View { private static final int MIN_WIDTH = 30; private static final int MIN_HEIGHT = 30; private boolean isCircle; private float radius; private int centerX; private int centerY; private float strokeWidth; private int strokeColor; private Paint mStrockPaint; private Paint mBitmapPaint; private BitmapShader bitmapShader; private Bitmap bitmap; public CircleImageView(Context context) { super(context); init(context,null); } public CircleImageView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(context,attrs); } public CircleImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context,attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int wSize = MeasureSpec.getSize(widthMeasureSpec); int hSize = MeasureSpec.getSize(heightMeasureSpec); int wMode = MeasureSpec.getMode(widthMeasureSpec); int hMode = MeasureSpec.getMode(heightMeasureSpec); int bitmapW = bitmap.getWidth(); int bitmapH = bitmap.getHeight(); if(wMode == MeasureSpec.AT_MOST){ wSize = Math.min(wSize,Math.max(bitmapW,MIN_WIDTH)); } if(hMode == MeasureSpec.AT_MOST){ hSize = Math.min(hSize,Math.max(bitmapH,MIN_HEIGHT)); } if(isCircle){ centerX = wSize/2; centerY = hSize/2; radius = wSize > hSize?hSize/2:wSize/2; } setMeasuredDimension(MeasureSpec.makeMeasureSpec(wSize,wMode), MeasureSpec.makeMeasureSpec(hSize,hMode)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); setUpBitmapShader(); if(isCircle){ canvas.drawCircle(centerX,centerY,radius-strokeWidth,mBitmapPaint); canvas.drawCircle(centerX,centerY,radius-strokeWidth,mStrockPaint); }else{ RectF rectF = new RectF(0+strokeWidth,0+strokeWidth,getWidth()-strokeWidth,getHeight()-strokeWidth); canvas.drawRoundRect(rectF,radius,radius,mBitmapPaint); canvas.drawRoundRect(rectF,radius,radius,mStrockPaint); } } private void init(Context context,AttributeSet attrs){ TypedArray ta = context.getResources().obtainAttributes(attrs, R.styleable.CircleImageView); strokeWidth = ta.getDimension(R.styleable.CircleImageView_strokeWidth,0); if(strokeWidth > 0){ strokeColor = ta.getColor(R.styleable.CircleImageView_strokeColor,0x66000000); } Drawable drawable = ta.getDrawable(R.styleable.CircleImageView_image); bitmap = drawable2Bitmap(drawable); isCircle = ta.getBoolean(R.styleable.CircleImageView_isCircle,false); radius = ta.getDimension(R.styleable.CircleImageView_radius,0); ta.recycle(); mStrockPaint = new Paint(); mStrockPaint.setAntiAlias(true); mStrockPaint.setStyle(Paint.Style.STROKE); mStrockPaint.setStrokeWidth(strokeWidth); mStrockPaint.setColor(strokeColor); mBitmapPaint = new Paint(); mBitmapPaint.setAntiAlias(true); } private Bitmap drawable2Bitmap(Drawable drawable){ if(drawable != null && drawable instanceof BitmapDrawable){ return ((BitmapDrawable) drawable).getBitmap(); } Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0,0,drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); drawable.draw(canvas); return bitmap; } /** * 设置图片缩放比例 */ private void setUpBitmapShader(){ float scale = 1.0f; Matrix m = new Matrix(); m.postTranslate(getWidth()/2-bitmap.getWidth()/2,getHeight()/2-bitmap.getHeight()/2); if(isCircle){ int size = Math.min(bitmap.getWidth(),bitmap.getHeight()); scale = (2.0f*radius)/size; }else{ scale = Math.max(1.0f*getWidth()/bitmap.getWidth(), 1.0f*getHeight()/bitmap.getHeight()); } m.postScale(scale,scale,getWidth()/2,getHeight()/2); bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); bitmapShader.setLocalMatrix(m); mBitmapPaint.setShader(bitmapShader); } public void setImage(Bitmap b){ if(b == null){ return; } bitmap = b; invalidate(); } public void setImage(Drawable d){ if(d == null){ return; } bitmap = drawable2Bitmap(d); invalidate(); }}
测试的布局文件:
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.huangyi.test.MainActivity"> <com.example.huangyi.test.widge.CircleImageView android:id="@+id/cv" android:layout_gravity="center" android:layout_width="100dp" android:layout_height="150dp" app:strokeColor="@color/colorAccent" app:strokeWidth="2dp" app:radius="5dp" app:isCircle="true" app:image="@drawable/carton"/></FrameLayout>
解释先不写了,回头再编辑加入。有需求的多看两眼也能明白定义过程。
阅读全文
0 0
- 自定义圆角ImageView
- 自定义圆角ImageVIew
- 自定义圆角ImageView
- 自定义圆角ImageView
- Android自定义圆角ImageView
- android 自定义圆角imageview
- Android 自定义圆角ImageView
- 自定义圆角ImageView MyCircleImageView
- 自定义ImageView实现圆角
- Android自定义圆角ImageView
- 自定义的圆角ImageView
- 自定义圆形或圆角imageview
- 自定义ImageView实现圆角矩形
- 自定义圆角imageview方案2
- Android 自定义圆角、立体ImageView -- MaterialImageView
- Android自定义圆角矩形图片ImageView
- android自定义圆角矩形Imageview
- android自定义圆角imageview学习
- webpack---用到过的加载器loader
- 三、vault
- 代码阅读整理之 层次 uml 逆向工程
- ajax和JSON基础知识
- 指针
- 自定义圆角ImageVIew
- JSP技术
- hibernate+struts2的详细分页代码
- 模板方法模式
- http协议基础知识
- (Verilog)单周期CPU设计
- ReorderableList
- To Determine a Prime Number
- Flink JOIN 执行计划