原形头像

  1 import android.content.Context;
  2 import android.content.res.TypedArray;
  3 import android.graphics.Bitmap;
  4 import android.graphics.BitmapShader;
  5 import android.graphics.Canvas;
  6 import android.graphics.Color;
  7 import android.graphics.Matrix;
  8 import android.graphics.Paint;
  9 import android.graphics.RectF;
 10 import android.graphics.Shader;
 11 import android.graphics.drawable.BitmapDrawable;
 12 import android.graphics.drawable.ColorDrawable;
 13 import android.graphics.drawable.Drawable;
 14 import android.util.AttributeSet;
 15 import android.widget.ImageView;
 16
 17
 18 public class CircleImageView extends ImageView {
 19
 20     private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;
 21
 22     private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
 23     private static final int COLORDRAWABLE_DIMENSION = 1;
 24
 25     private static final int DEFAULT_BORDER_WIDTH = 0;
 26     private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
 27
 28     private final RectF mDrawableRect = new RectF();
 29     private final RectF mBorderRect = new RectF();
 30
 31     private final Matrix mShaderMatrix = new Matrix();
 32     private final Paint mBitmapPaint = new Paint();
 33     private final Paint mBorderPaint = new Paint();
 34
 35     private int mBorderColor = DEFAULT_BORDER_COLOR;
 36     private int mBorderWidth = DEFAULT_BORDER_WIDTH;
 37
 38     private Bitmap mBitmap;
 39     private BitmapShader mBitmapShader;
 40     private int mBitmapWidth;
 41     private int mBitmapHeight;
 42
 43     private float mDrawableRadius;
 44     private float mBorderRadius;
 45
 46     private boolean mReady;
 47     private boolean mSetupPending;
 48
 49     public CircleImageView(Context context) {
 50         super(context);
 51     }
 52
 53     public CircleImageView(Context context, AttributeSet attrs) {
 54         this(context, attrs, 0);
 55     }
 56
 57     public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
 58         super(context, attrs, defStyle);
 59         super.setScaleType(SCALE_TYPE);
 60
 61         TypedArray a = context.obtainStyledAttributes(attrs,
 62                 R.styleable.CircleImageView, defStyle, 0);
 63
 64         mBorderWidth = a.getDimensionPixelSize(
 65                 R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
 66         mBorderColor = a.getColor(R.styleable.CircleImageView_border_color,
 67                 DEFAULT_BORDER_COLOR);
 68
 69         a.recycle();
 70
 71         mReady = true;
 72
 73         if (mSetupPending) {
 74             setup();
 75             mSetupPending = false;
 76         }
 77     }
 78
 79     @Override
 80     public ScaleType getScaleType() {
 81         return SCALE_TYPE;
 82     }
 83
 84     @Override
 85     public void setScaleType(ScaleType scaleType) {
 86         if (scaleType != SCALE_TYPE) {
 87             throw new IllegalArgumentException(String.format(
 88                     "ScaleType %s not supported.", scaleType));
 89         }
 90     }
 91
 92     @Override
 93     protected void onDraw(Canvas canvas) {
 94         if (getDrawable() == null) {
 95             return;
 96         }
 97
 98         canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius,
 99                 mBitmapPaint);
100         if (mBorderWidth != 0) {
101             canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius,
102                     mBorderPaint);
103         }
104     }
105
106     @Override
107     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
108         super.onSizeChanged(w, h, oldw, oldh);
109         setup();
110     }
111
112     public int getBorderColor() {
113         return mBorderColor;
114     }
115
116     public void setBorderColor(int borderColor) {
117         if (borderColor == mBorderColor) {
118             return;
119         }
120
121         mBorderColor = borderColor;
122         mBorderPaint.setColor(mBorderColor);
123         invalidate();
124     }
125
126     public int getBorderWidth() {
127         return mBorderWidth;
128     }
129
130     public void setBorderWidth(int borderWidth) {
131         if (borderWidth == mBorderWidth) {
132             return;
133         }
134
135         mBorderWidth = borderWidth;
136         setup();
137     }
138
139     @Override
140     public void setImageBitmap(Bitmap bm) {
141         super.setImageBitmap(bm);
142         mBitmap = bm;
143         setup();
144     }
145
146     @Override
147     public void setImageDrawable(Drawable drawable) {
148         super.setImageDrawable(drawable);
149         mBitmap = getBitmapFromDrawable(drawable);
150         setup();
151     }
152
153     @Override
154     public void setImageResource(int resId) {
155         super.setImageResource(resId);
156         mBitmap = getBitmapFromDrawable(getDrawable());
157         setup();
158     }
159
160     private Bitmap getBitmapFromDrawable(Drawable drawable) {
161         if (drawable == null) {
162             return null;
163         }
164
165         if (drawable instanceof BitmapDrawable) {
166             return ((BitmapDrawable) drawable).getBitmap();
167         }
168
169         try {
170             Bitmap bitmap;
171
172             if (drawable instanceof ColorDrawable) {
173                 bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION,
174                         COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
175             } else {
176                 bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
177                         drawable.getIntrinsicHeight(), BITMAP_CONFIG);
178             }
179
180             Canvas canvas = new Canvas(bitmap);
181             drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
182             drawable.draw(canvas);
183             return bitmap;
184         } catch (OutOfMemoryError e) {
185             return null;
186         }
187     }
188
189     private void setup() {
190         if (!mReady) {
191             mSetupPending = true;
192             return;
193         }
194
195         if (mBitmap == null) {
196             return;
197         }
198
199         mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP,
200                 Shader.TileMode.CLAMP);
201
202         mBitmapPaint.setAntiAlias(true);
203         mBitmapPaint.setShader(mBitmapShader);
204
205         mBorderPaint.setStyle(Paint.Style.STROKE);
206         mBorderPaint.setAntiAlias(true);
207         mBorderPaint.setColor(mBorderColor);
208         mBorderPaint.setStrokeWidth(mBorderWidth);
209
210         mBitmapHeight = mBitmap.getHeight();
211         mBitmapWidth = mBitmap.getWidth();
212
213         mBorderRect.set(0, 0, getWidth(), getHeight());
214         mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2,
215                 (mBorderRect.width() - mBorderWidth) / 2);
216
217         mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width()
218                 - mBorderWidth, mBorderRect.height() - mBorderWidth);
219         mDrawableRadius = Math.min(mDrawableRect.height() / 2,
220                 mDrawableRect.width() / 2);
221
222         updateShaderMatrix();
223         invalidate();
224     }
225
226     private void updateShaderMatrix() {
227         float scale;
228         float dx = 0;
229         float dy = 0;
230
231         mShaderMatrix.set(null);
232
233         if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width()
234                 * mBitmapHeight) {
235             scale = mDrawableRect.height() / (float) mBitmapHeight;
236             dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
237         } else {
238             scale = mDrawableRect.width() / (float) mBitmapWidth;
239             dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
240         }
241
242         mShaderMatrix.setScale(scale, scale);
243         mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth,
244                 (int) (dy + 0.5f) + mBorderWidth);
245
246         mBitmapShader.setLocalMatrix(mShaderMatrix);
247     }
248
249 }
1 <com.sample.CircleImageView
2        android:layout_width="80dp"
3        android:layout_height="80dp"
4        android:layout_marginLeft="40dp"
5        android:scaleType="centerCrop"
6        android:src="@drawable/charming" />
时间: 2025-01-09 01:06:52

原形头像的相关文章

cocos2dx lua中异步加载网络图片,可用于显示微信头像

最近在做一个棋牌项目,脚本语言用的lua,登录需要使用微信登录,用户头像用微信账户的头像,微信接口返回的头像是一个url,那么遇到的一个问题就是如何在lua中异步加载这个头像,先在引擎源码里找了下可能会提供这个功能的地方,发现好像没有提供类似功能,那么只能自己动手写.所以我在ImageView这个类里面添加了一个成员方法,其实可以不写在ImageView里,而且我觉得非必需情况下还是不要修改引擎源码的好,因为如果源码改动比较多的话,将来引擎版本升级会比较麻烦.我写在ImageView里纯粹是想偷

jQuery插件ImgAreaSelect 实例讲解一(头像上传预览和裁剪功能)

上一节随笔中,我们已经知道了关于jQuery插件ImgAreaSelect基本的知识:那么现在看一下实例: 首先,要知道我们应该实现什么功能? (1)图片能够实现上传预览功能 (2)拖拽裁剪图片,使其能够显示裁剪后的区域 (3)显示要裁剪区域的坐标 其次,该如何引用该插件呢? 那就具体看一下吧! 第一步:先将样式和文件包引入(根据你自己的位置引入) <!--引入imgareaselect的css样式--> <link rel="stylesheet" type=&qu

实现类似QQ离线用户头像彩色变灰色的效果

头像由彩色变灰色有两种实现方式: 方法1把图片彩色图转换为纯黑白二色: /** * 将彩色图转换为纯黑白二色 * * @param 位图 * @return 返回转换好的位图 */ private Bitmap convertToBlackWhite(Bitmap bmp) { int width = bmp.getWidth(); // 获取位图的宽 int height = bmp.getHeight(); // 获取位图的高 int[] pixels = new int[width * h

头像服务端设计思路

思路 一 把图片上传到服务端.命名以用户的(用户名md5)作为文件名.要是以前有文件,覆盖以前的文件 二编写一个servlet处理获取头像请求. servlet接收一个用户名md5+大小的参数 根据 用户名md5+大小生成对应的图片 例如 用户名为ada 上传到服务端的位置为 /gravatar/ada.jpg 请求地址:/webstore/headimg/ada.jpg?s=120 对应的服务端文件地址 /gravatar/ada.jpg(原图片) /gravatar/ada/120.jpg

【学习ios之路:UI系列】点击更换头像实现从相册读取照片和拍照两种功能

功能如下: 1.点击头像,提示选择更换头像方式①相册 ②照相. 2.点击相册,实现通过读取系统相册,获取图片进行替换. 3.点击照相,通过摄像头照相,进行替换照片. 4.如果摄像头,弹出框警告. 代码如下: 1.通过UIActionSheet对象实现提示功能 //创建对象 UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle: @"提示" delegate:self cancelButtonTitle:@&q

Android中通过访问本地相册或者相机设置用户头像

目前几乎所有的APP在用户注册时都会有设置头像的需求,大致分为三种情况: (1)通过获取本地相册的图片,经过裁剪后作为头像. (2)通过启动手机相机,现拍图片然后裁剪作为头像. (3)在APP中添加一些自带的头像资源,供用户选择(不够人性化,目前很少使用). 这次我们简单介绍下通过获取本地相册以及相机拍摄的方法设置头像,实现思路如下: (1)通过startActivityForResult方法,分别传递调用系统相册的Intent和调用相机拍照的Intent来做选择 (2)调用Android系统中

python获取微信公共平台消息列表和用户头像

转载需注明原文地址:http://blog.csdn.net/btyh17mxy/article/details/25207889 刚写的模拟登陆的方式从获取微信公众平台消息列表和用户头像的库,之后还会继续增加相关功能,github地址https://github.com/btyh17mxy/wxwall #!/usr/bin/env python # coding: UTF-8 import json import hashlib import re import random import

灰色头像

引子 你灰色头像不会再跳动 哪怕是一句简单的问候 心贴心的交流一页页翻阅多难过 是什么 坠落 升空 又想起你曾说的陪我到最后 暖色的梦变冰凉的枷锁 如果时光倒流我们又能抓得住什么. 背景 WJMZBMR喜欢上QQ..但是很多人的头像已经变成灰色了.这让他压力很大.而且WJMZBMR的好友太多了,大量的灰色头像让他无法准确的找到他想找的好友.. 今天WJMZBMR决定清理一下他的QQ,找出那些不会在跳动的头像并且把它们踢掉.为此他翻出了最近一个月的聊天记录. 如果一个头像在在最近一个月中与WJMZ

android 实现类似微信缓存和即时更新好友头像

引言 使用微信时我们会发现,首次进入微信的好友列表时,会加载好友头像,但是再次进入时,就不用重新加载了,而且其他页面都不用重新加载,说明微信的好友头像是缓存在本地的,然后好友修改头像后,又会及时的更新,这个功能是如何实现的呢,我们来分析一下 分析 关于头像缓存的实现 头像是网络图片,而且数据量较大,如果用我们常用的SharedPreferences将头像以Bitmap的形式存储,势必会造成OOM,这个方法是行不通的,我们存储的只能是图片的地址,但是如果只存储地址的话,要转化成图片,还是要通过网络