使用BitmapShader显示圆形头像
来源:互联网 发布:天猫国际官方直营知乎 编辑:程序博客网 时间:2024/05/17 00:59
对于一些应用app特别是社交app中,通常需要用户登陆后显示一个圆形的头像作为用户的标识。普通的ImageView是不可以实现这个功能的,那么怎么才能画出一个圆形头像呢?BitmapShader可以帮我们解决这个问题。
首先来看看BitmapShader的定义,如下:
Shader used to draw a bitmap as a texture. The bitmap can be repeated or mirrored by setting the tiling mode.
着色器(shader)用于将bitmap作为纹理绘制到画布上,超出bitmap的部分根据不同的mode作出不同的绘制要求。
生成BitmapShader的实例之后,就可以使用paint.setShader(shader)设置paint中将要画的bitmap。所以最后还是通过canvas的drawCircle来完成我们的需求的。
package com.app.motion.bitmapshadermotion.view;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.Rect;import android.graphics.Shader;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.widget.ImageView;/** * Created by joe.wang on 2016/9/12. */public class PhotoImageView extends ImageView { private int mWdith; private int mHeight; private Paint mPaint; private BitmapShader mBitmapShader; private Bitmap mBitmap; private Rect mDrawableRect; private Matrix mShaderMartix; public PhotoImageView(Context context) { this(context, null); } public PhotoImageView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { mPaint = new Paint(); mPaint.setAntiAlias(true); mShaderMartix = new Matrix(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mWdith = w; mHeight = h; fillDrawableRect(); setup(); } private void setup() { if (mBitmap == null) { getDrawableBitmap(); } } /** * 获取当前设置的android:src属性中的图片bitmap */ private void getDrawableBitmap() { if (getDrawable() == null) { return; } else { Drawable d = getDrawable(); Bitmap bitmap = Bitmap.createBitmap(d.getIntrinsicWidth(), d.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); d.draw(canvas); mBitmap = bitmap; } } @Override protected void onDraw(Canvas canvas) { if (mBitmap == null) { super.onDraw(canvas); } else { getDrawableBitmap(); mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); updateShaderMatrix(); mPaint.setShader(mBitmapShader); canvas.drawCircle(mDrawableRect.centerX(), mDrawableRect.centerY(), mDrawableRect.width() / 2, mPaint); } } /** * 获取一个正方形,用于绘制圆形 */ private void fillDrawableRect() { int avaliableWidth = mWdith - getPaddingLeft() - getPaddingRight(); int avaliableHeight = mHeight - getPaddingTop() - getPaddingBottom(); int slideLength = Math.min(avaliableWidth, avaliableHeight); int top = getPaddingTop() + (avaliableHeight - slideLength) / 2; int left = getPaddingLeft() + (avaliableWidth - slideLength) / 2; mDrawableRect = new Rect(left, top, left + slideLength, top + slideLength); } /** * 根据不同的比例大小设置bitmap的缩放大小和偏移量 */ private void updateShaderMatrix() { float scale = 0; int dx = 0; int dy = 0; if (mBitmap.getWidth() * mDrawableRect.height() > mBitmap.getHeight() * mDrawableRect.width()) { scale = mDrawableRect.width() * 1.0f / mBitmap.getWidth(); dy = (int) ((mDrawableRect.height() - mBitmap.getHeight() * scale) * 0.5f); } else { scale = mDrawableRect.height() * 1.0f / mBitmap.getHeight(); dx = (int) ((mDrawableRect.width() - mBitmap.getWidth() * scale) * 0.5f); } mShaderMartix.setScale(scale, scale); mShaderMartix.postTranslate(dx + mDrawableRect.left, dy + mDrawableRect.top); mBitmapShader.setLocalMatrix(mShaderMartix); }}
0 0
- 使用BitmapShader显示圆形头像
- BitmapShader实现圆形头像
- 圆形头像之BitmapShader,Matrix实现篇
- 我的Android笔记--使用BitmapShader实现可调灰色圆形、圆角头像
- 利用 BitmapShader 制作自带边框圆形头像
- Android 圆形头像显示
- WPF圆形头像显示
- 圆形头像显示实现
- 使用BitmapShader实现图片的圆形、圆角
- 使用BitmapShader实现圆形,圆角图片
- 精简版BitmapShader实现圆形头像和圆角方形头像
- Glide 圆形头像的使用
- BitmapShader绘制圆形图片
- 使用BitmapShader在自定义View中画圆形
- android 使用BitmapShader实现圆形以及放大镜效果
- 圆形的imageview,常用来显示头像
- Android中显示圆形头像(读书笔记)
- Android圆形头像显示自定义View
- JS函数参数都是按值传递的!
- SQL language
- CSS选择器修改样式,及单独修改样式this.style.
- Linux软件安装
- PAT (Advanced Level) Practise 1116Come on! Let's C (20)
- 使用BitmapShader显示圆形头像
- java util :获取国家省份城市工具类
- ADL:社交网络分析与数据挖掘(DAY3)
- 【NOIP2016提高A组模拟9.9】总结
- 【Ts 3】Nginx的Http(图片)服务器配置+ftp上传使用说明
- Cannot find message resources under key org.apache.struts.action.MESSAGE
- HDU 5877 Weak Pair 树状数组 + DFS
- 【备份专题】虚拟机备份原理和架构
- hdu5876 Sparse Graph