技术标签: Android
https://blog.csdn.net/android_cll/article/details/54574778
二:实现步骤、
1.自定义一个转换工具类、
package com.common.base.util;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
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.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
import com.common.base.R;
public class CircleImageView extends ImageView {
/**
* 头像转换工具类
*/
private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;
private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
private static final int COLORDRAWABLE_DIMENSION = 1;
private static final int DEFAULT_BORDER_WIDTH = 0;
private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
private final RectF mDrawableRect = new RectF();
private final RectF mBorderRect = new RectF();
private final Matrix mShaderMatrix = new Matrix();
private final Paint mBitmapPaint = new Paint();
private final Paint mBorderPaint = new Paint();
private int mBorderColor = DEFAULT_BORDER_COLOR;
private int mBorderWidth = DEFAULT_BORDER_WIDTH;
private Bitmap mBitmap;
private BitmapShader mBitmapShader;
private int mBitmapWidth;
private int mBitmapHeight;
private float mDrawableRadius;
private float mBorderRadius;
private boolean mReady;
private boolean mSetupPending;
public CircleImageView(Context context) {
super(context);
}
public CircleImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
super.setScaleType(SCALE_TYPE);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);
mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);
a.recycle();
mReady = true;
if (mSetupPending) {
setup();
mSetupPending = false;
}
}
@Override
public ScaleType getScaleType() {
return SCALE_TYPE;
}
@Override
public void setScaleType(ScaleType scaleType) {
if (scaleType != SCALE_TYPE) {
throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
}
}
@Override
protected void onDraw(Canvas canvas) {
if (getDrawable() == null) {
return;
}
canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
setup();
}
public int getBorderColor() {
return mBorderColor;
}
public void setBorderColor(int borderColor) {
if (borderColor == mBorderColor) {
return;
}
mBorderColor = borderColor;
mBorderPaint.setColor(mBorderColor);
invalidate();
}
public int getBorderWidth() {
return mBorderWidth;
}
public void setBorderWidth(int borderWidth) {
if (borderWidth == mBorderWidth) {
return;
}
mBorderWidth = borderWidth;
setup();
}
@Override
public void setImageBitmap(Bitmap bm) {
super.setImageBitmap(bm);
mBitmap = bm;
setup();
}
@Override
public void setImageDrawable(Drawable drawable) {
super.setImageDrawable(drawable);
mBitmap = getBitmapFromDrawable(drawable);
setup();
}
@Override
public void setImageResource(int resId) {
super.setImageResource(resId);
mBitmap = getBitmapFromDrawable(getDrawable());
setup();
}
private Bitmap getBitmapFromDrawable(Drawable drawable) {
if (drawable == null) {
return null;
}
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
try {
Bitmap bitmap;
if (drawable instanceof ColorDrawable) {
bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
} else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
} catch (OutOfMemoryError e) {
return null;
}
}
private void setup() {
if (!mReady) {
mSetupPending = true;
return;
}
if (mBitmap == null) {
return;
}
mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mBitmapPaint.setAntiAlias(true);
mBitmapPaint.setShader(mBitmapShader);
mBorderPaint.setStyle(Paint.Style.STROKE);
mBorderPaint.setAntiAlias(true);
mBorderPaint.setColor(mBorderColor);
mBorderPaint.setStrokeWidth(mBorderWidth);
mBitmapHeight = mBitmap.getHeight();
mBitmapWidth = mBitmap.getWidth();
mBorderRect.set(0, 0, getWidth(), getHeight());
mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);
mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth);
mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);
updateShaderMatrix();
invalidate();
}
private void updateShaderMatrix() {
float scale;
float dx = 0;
float dy = 0;
mShaderMatrix.set(null);
if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
scale = mDrawableRect.height() / (float) mBitmapHeight;
dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
} else {
scale = mDrawableRect.width() / (float) mBitmapWidth;
dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
}
mShaderMatrix.setScale(scale, scale);
mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);
mBitmapShader.setLocalMatrix(mShaderMatrix);
}
}
2.xml的引用、
<com.common.base.util.CircleImageView
android:id="@+id/touxian_id"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:src="@drawable/yonghu_touxiang" />
3.activity的实现、
private CircleImageView touxiang_id;
touxiang_id = (CircleImageView)findViewById(R.id.touxian_id)
BitmapHelp.displayOnImageView(mContext, holder.touxiang_id, mListy
.getUser().getPic(), R.drawable.ic_launcher,
R.drawable.ic_launcher);
文章浏览阅读1w次,点赞3次,收藏3次。很多童鞋在装上搜狗等输入法后,无端就多出了一个不知道怎么删除的英语美式键盘,如下图虽然同样可以使用home+空格键切换输入法,但是每次都要切换这对于强迫症患者来说简直不能忍所以本人根据自己的使用情况写了一个方法指南,经过多次试验,发现它还是很能派上用场的大致原理就是再添加一次键盘然后再删除掉。步骤一:点击如图位置-打开“语言首选项”步骤二:(可以
文章浏览阅读735次。glib-genmarshalglib-genmarshal — C code marshaller generation utility for GLib closures Synopsisglib-genmarshal [options...] [files...]Descriptionglib-genmarshal is a sma_glib-genmarshal 不是executable
文章浏览阅读342次。julia Julia| 关键词 (Julia | Keywords)Like other programming languages, Julia also has the set of some reserved words whose meanings are the predefined and They cannot be used as the identifiers name. ...
文章浏览阅读3.3w次,点赞4次,收藏21次。简介Sass 有两种语法规则(syntaxes),目前新的语法规则(从 Sass 3开始)被称为 “SCSS”( 时髦的css(Sassy CSS)),它是css3语法的的拓展级,就是说每一个语法正确的CSS3文件也是合法的SCSS文件,SCSS文件使用.scss作为拓展名。第二种语法别成为缩进语法(或者 Sass),它受到了Haml的简洁精炼的启发,它是为了人们可以用和css相近的但是更_scss常用
文章浏览阅读5.4k次,点赞4次,收藏28次。Samba服务的主配置文件是smb.conf,默认在/etc/samba/目录下。smb.conf含有多个段,每个段由段名开始,直到下个段名。每个段名放在方括号中间。每段的参数的格式是:名称=指。配置文件中一行一个段名和参数,段名和参数名不分大小写。除了[global]段外,所有的段都可以看作是一个共享资源。段名是该共享资源的名字,段里的参数是该共享资源的属性。Samba安装好后,使用testpa..._valid users
文章浏览阅读287次。题目描述有N种食物,排成一排,选择里面的若干食物,但不能选择相邻的食物。一个也不选也是一种选择的方法。问有多少种选择的方法?输入:一个整数n输出:一个正整数表示答案样例输入:3样例输出:5提示:方法有1、2、3、1和3、不选。共5种。斐波那契n从1开始,f(1)=2f(2)=3f(3)=5…n = eval(input())li = [0]*3li[1]..._n种食物,排成一排,可以选择若干种,但是不能选择
文章浏览阅读2.5k次。css解决图片固定大小后拉伸的问题<div> <img src="/img/1.jpg" class="img" /></div><style>.img{ object-fit:cover;}</style>object-fit属性属性描述fill默认值。整个对象将完全填充此框。 如果对象的高宽比不匹配其框的宽高比,那么该对象将被拉伸以适应。contain整个对象在填充盒子的同时保留其长宽比,因此_css img设置了大小依然被父盒子拉变形
文章浏览阅读7.2k次,点赞4次,收藏10次。1.整数反转给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321#include <stdio.h>int main(void){ long int a,s=0; long int i,k; scanf("%ld",&a); if(a<0) { a=-a; for(i=0;a!=0;..._输入年份和月份,输出这一年的这这个月有多少天。需要考虑闰年。8.阶乘之和:计算s=
文章浏览阅读1k次。ubuntu20+gitlab_ubuntu安装git时pofix configuration 应该选择哪个
文章浏览阅读3k次。此处.Content属性应改为.Text属性。使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)_visual studio窗体应用实例
文章浏览阅读9.3k次,点赞22次,收藏2次。解决问题:在聊天窗口打字时,输入英文字符`/`时,会自动变成表情,且无法取消,无法避免。_qq聊天框输入/会变成表情包
文章浏览阅读1.1k次。导读国内有庞大的仓储物流从业人员队伍,很多人想深入了解WMS与TMS究竟是什么。本文详细解析WMS与TMS的选型与实施。WMS实施(上)和其它软件项目的实施大同小异,这里整理了WMS选型和上线过程中容易被忽略的10大误区。1、过分相信软件商的系统演示。在演示会上,一定要控制交流的内容和进程,尽量使用自己的作业数据。2、只关注软件本身,忘了关注将来的实施顾问和厂商背景。再好的WMS也要在标准软件之外加上10%-50%的定制工作,最好签一份系统维护合同,虽然会花钱,但是来自厂家的支持永远巨划