Android笔记 圆形ImageView
2016-05-11 10:18
441 查看
通过直接继承ImageView,使用BitmapShader圆形绘制实现。具体的可看鸿洋大大的博客:/article/1580281.html
直接上代码
直接上代码
package com.bencoo.kme.widget; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Shader.TileMode; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.ImageView; public class CircleImageView extends ImageView { /** * 宽度 */ private int mWidth; /** * 圆半径 */ private int mRadius; /** * 矩阵 */ private Matrix mMatrix; /** * 渲染图形 给图像着色 */ private BitmapShader mShader; /** * 笔 */ private Paint mBitmapPaint; public CircleImageView(Context context) { super(context); init(); } public CircleImageView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CircleImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } /** * @description 初始化 */ private void init(){ mMatrix=new Matrix(); mBitmapPaint=new Paint(); mBitmapPaint.setAntiAlias(true); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); mWidth=Math.min(getMeasuredWidth(), getMeasuredHeight()); mRadius=mWidth/2; setMeasuredDimension(mWidth, mWidth); } /** * @description Drawable转成Bitmap * @param drawable * @return */ private Bitmap drawableToBitmap(Drawable drawable){ if(drawable instanceof BitmapDrawable){ BitmapDrawable bd=(BitmapDrawable) drawable; return bd.getBitmap(); } int width=drawable.getIntrinsicWidth(); int height=drawable.getIntrinsicHeight(); Bitmap bitmap=Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas=new Canvas(bitmap); drawable.setBounds(0,0,width,height); drawable.draw(canvas); return bitmap; } /** * @description 初始Shader */ private void setUpShader(){ Drawable drawable=getDrawable(); if(drawable==null){ return; } Bitmap bitmap=drawableToBitmap(drawable); mShader=new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP); int width=bitmap.getWidth(); int height=bitmap.getHeight(); //计算缩放比例 float scale=1.0f; int bSize=Math.min(width, height); scale=mWidth*1.0f/bSize; //矩阵 mMatrix.setScale(scale, scale); //Shader设置矩阵 mShader.setLocalMatrix(mMatrix); //给笔设置Shader mBitmapPaint.setShader(mShader); } @Override protected void onDraw(Canvas canvas) { Drawable drawable=getDrawable(); if(drawable==null){ return; } setUpShader(); canvas.drawCircle(mRadius, mRadius, mRadius, mBitmapPaint); } }
相关文章推荐
- 【转】Android使用XML Shape绘制带阴影效果的圆形按钮
- android客户端学习-ViewUtils
- Android 日期工具类DateUtil
- Android Studio运行时gradle错误
- Android App开发中创建Fragment组件的教程
- Android 主线程 子线程
- 开始第一天的博客学习
- 获取android手机内外部存储空间的参数 && 如何决定一个apk的安装位置 && APK安装过程及原理详解
- Android官方文档之Services
- [Android基础系列]重新审视ContentProvider
- android 开发技巧、问题汇总
- Android全局的一些设置
- Android抽象布局——include、merge 、ViewStub
- Android内存优化之OOM
- Android 内功心法(1.5)——android常用设计模式之命令模式
- [置顶] android webview与js交互(动态添加js)
- 【转】Android进阶2之 阴影制作(Shadow)
- Android studio 快捷键大全
- android随笔25——搜索框输入内容后界面的隐藏逻辑
- AndroidStudio NDK入门小结