看看相关文章, [支持圆形、圆角矩形、带边框的自定View]:https://github.com/msandroid/MultiShapeView

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.PorterDuff;

import android.graphics.PorterDuffColorFilter;

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.util.Log;

import android.view.MotionEvent;

import android.view.View;

/**

* 支持常见的圆形,圆角矩形及其他图形

*

* 支持边框

*

* 支持按下态

*

* Created by debugCat on 2017/4/16.

*/

public class MultiShapeView extends View {

private Context mContext;

/**

* 显示图片

*/

private Bitmap mBitmap;

/**

* Bitmap Paint

*/

private Paint mBitmapPaint;

/**

* 边框 Paint

*/

private Paint mBorderPaint;

/**

* 当前是否被按下

*/

private boolean mIsPressed;

private Shader mBitmapShader;

/**

* 变换矩阵

*/

private Matrix mShaderMatrix;

/**

* 形状

*/

private int mShape;

/**

* Rect Bitmap

*/

private RectF mRcBitmap;

/**

* Rect Border

*/

private RectF mRcBorder;

/**

* 圆角半径

*/

private float mRoundRadius;

/**

* 边框半径

*/

private float mBorderRadius;

/**

* 图片半径

*/

private float mCircleRadius;

/**

* 边框color

*/

private int mBorderColor;

/**

* 边框大小

*/

private int mBorderWidth;

/**

* 按下态蒙层color

*/

private int mCoverColor;

/**

* 默认BorderWidth

*/

private static final int DEFAULT_BORDER_WIDTH = 0;

/**

* 默认BorderColor

*/

private static final int DEFAULT_BORDER_COLOR = Color.TRANSPARENT;

/**

* 默认按下态蒙层Color

*/

private static final int DEFAULT_COVER_COLOR = Color.parseColor("#40333333");

/**

* 默认圆角半径

*/

private static final int DEFAULT_ROUND_RADIUS = 0;

/**

* 默认形状

*/

public static final int SHAPE_REC = 1; // 矩形

public static final int SHAPE_CIRCLE = 2; // 圆形

public MultiShapeView(Context context) {

this(context, null);

}

public MultiShapeView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public MultiShapeView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MultiShapeView, defStyleAttr, 0);

mContext = context;

mBorderColor = typedArray.getColor(R.styleable.MultiShapeView_border_color, DEFAULT_BORDER_COLOR);

mCoverColor = typedArray.getColor(R.styleable.MultiShapeView_cover_color, DEFAULT_COVER_COLOR);

mBorderWidth = typedArray.getDimensionPixelSize(R.styleable.MultiShapeView_border_width, DEFAULT_BORDER_WIDTH);

mShape = typedArray.getInteger(R.styleable.MultiShapeView_shape, SHAPE_REC);

mRoundRadius = typedArray.getDimensionPixelSize(R.styleable.MultiShapeView_round_radius, DEFAULT_ROUND_RADIUS);

typedArray.recycle();

init();

}

private void init() {

mBitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mBorderPaint.setStyle(Paint.Style.STROKE);

mBorderPaint.setColor(mBorderColor);

mBorderPaint.setStrokeWidth(mBorderWidth);

mRcBitmap = new RectF();

mRcBorder = new RectF();

mShaderMatrix = new Matrix();

}

public void setImageBitmap(Bitmap bitmap) {

mBitmap = bitmap;

preDraw();

}

public void setImageDrawable(Drawable drawable) {

mBitmap = getBitmapFromDrawable(drawable);

preDraw();

}

public void setImageResource(int resId) {

if (resId != 0) {

try {

mBitmap = getBitmapFromDrawable(mContext.getResources().getDrawable(resId));

} catch (Exception e) {

Log.w("MultiShapeView", "Unable to find resource: " + resId, e);

}

}

preDraw();

}

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(1, 1, Bitmap.Config.ARGB_8888);

} else {

bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);

}

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 preDraw() {

if (mBitmap == null) {

return;

}

mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

mBitmapPaint.setShader(mBitmapShader);

mRcBorder.set(0, 0, getWidth(), getHeight());

mBorderRadius = Math.min((mRcBorder.height() - mBorderWidth) / 2, (mRcBorder.width() - mBorderWidth) / 2);

//!!!注意,圆角矩形边框注意位置,否则边框和矩形之间会露出空白

if (mShape == SHAPE_CIRCLE) {

mRcBitmap.set(mBorderWidth, mBorderWidth, mRcBorder.width() - mBorderWidth, mRcBorder.height() - mBorderWidth);

} else if (mShape == SHAPE_REC) {

mRcBitmap.set(mBorderWidth/2, mBorderWidth/2, mRcBorder.width() - mBorderWidth/2, mRcBorder.height() - mBorderWidth/2);

}

mCircleRadius = Math.min(mRcBitmap.height() / 2, mRcBitmap.width() / 2);

updateShaderMatrix();

invalidate();

}

/**

* 伸缩变换

*/

private void updateShaderMatrix() {

float scale;

float dx = 0;

float dy = 0;

mShaderMatrix.set(null);

if (mBitmap.getWidth() * mRcBitmap.height() > mRcBitmap.width() * mBitmap.getHeight()) {

scale = mRcBitmap.height() / (float) mBitmap.getHeight();

dx = (mRcBitmap.width() - mBitmap.getWidth() * scale) * 0.5f;

} else {

scale = mRcBitmap.width() / (float) mBitmap.getWidth();

dy = (mRcBitmap.height() - mBitmap.getHeight() * scale) * 0.5f;

}

mShaderMatrix.setScale(scale, scale);

mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);

mBitmapShader.setLocalMatrix(mShaderMatrix);

}

@Override

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {

super.onLayout(changed, left, top, right, bottom);

preDraw();

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

preDraw();

}

@Override

protected void onDraw(Canvas canvas) {

if (mBitmap != null) {

if (mShape == SHAPE_CIRCLE) {

canvas.drawCircle(getWidth() / 2, getHeight() / 2, mCircleRadius, mBitmapPaint);

canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);

} else if (mShape == SHAPE_REC) {

canvas.drawRoundRect(mRcBitmap, mRoundRadius, mRoundRadius, mBitmapPaint);

canvas.drawRoundRect(mRcBorder, mRoundRadius, mRoundRadius, mBorderPaint);

}

}

}

@Override

public void setPressed(boolean pressed) {

super.setPressed(pressed);

if (mIsPressed == pressed) {

return;

}

mIsPressed = pressed;

if (mIsPressed) {

mBitmapPaint.setColorFilter(new PorterDuffColorFilter(mCoverColor, PorterDuff.Mode.SRC_ATOP));

} else {

mBitmapPaint.setColorFilter(null);

}

invalidate();

}

@Override

public boolean onTouchEvent(MotionEvent event) {

int action = event.getActionMasked();

switch (action) {

case MotionEvent.ACTION_DOWN:

setPressed(true);

break;

case MotionEvent.ACTION_MOVE:

if (!mRcBitmap.contains(event.getX(), event.getY())){

setPressed(false);

}

break;

case MotionEvent.ACTION_UP:

case MotionEvent.ACTION_CANCEL:

setPressed(false);

break;

}

return true;

}

//-----------------------------------------------getter/setter------------------------------

public int getBorderColor() {

return mBorderColor;

}

public void setBorderColor(int borderColor) {

if (borderColor == mBorderColor) {

return;

}

mBorderColor = borderColor;

invalidate();

}

public int getBorderWidth() {

return mBorderWidth;

}

public void setBorderWidth(int borderWidth) {

if (borderWidth == mBorderWidth) {

return;

}

mBorderWidth = borderWidth;

preDraw();

}

public int getCoverColor() {

return mCoverColor;

}

public void setCoverColor(int coverColor) {

if (coverColor == mCoverColor) {

return;

}

mCoverColor = coverColor;

}

public int getShape() {

return mShape;

}

public void setShape(int shape) {

mShape = shape;

preDraw();

}

public float getRoundRadius() {

return mRoundRadius;

}

public void setRoundRadius(float roundRadius) {

mRoundRadius = roundRadius;

preDraw();

}

}

布局 可以设置图片大小 角度 和边框。

Activity中设置图片

mIvCircleOne = (MultiShapeView) findViewById(R.id.iv_circle_one);

mIvCircleTwo = (MultiShapeView) findViewById(R.id.iv_circle_two);

mIvRound = (MultiShapeView) findViewById(R.id.iv_round);

mIvCircleOne.setImageResource(R.drawable.a123);

mIvCircleTwo.setImageResource(R.drawable.a123);

mIvRound.setImageDrawable(getResources().getDrawable(R.drawable.a123));

在values中添加attrs.xml

完成。

android 上传头像工具类,android 圆角头像工具类相关推荐

  1. android上传字符串到服务器,Android上传文件到服务器

    Android要实现文件上传,可以利用Socket上传,也可以模拟Web进行上传,但是如果是使用第一种方式上传,严格的话就得使用TCP,这样容易生成系统死掉,或者是长时间等待,如果是UDP来传,就容易 ...

  2. android上传sd卡文件格式,Android开发学习:向模拟器的sdcard中添加文件

    向模拟器的sdcard中添加文件有两种方法: 1.在eclipse的DDMS视图中操作 启动eclipse---打开DDMS视图---选择File Explorer,出现下面的窗口 选中sdcard文 ...

  3. android -上传文件到服务器

    android上传文件到服务器       重点:最好是设置好content-type这些参数的配置!     package com.spring.sky.image.upload.network; ...

  4. android上传本地图片到服务器上,Android使用post方式上传图片到服务器的方法

    本文实例讲述了Android使用post方式上传图片到服务器的方法.分享给大家供大家参考,具体如下: /** * 上传文件到服务器类 * * @author tom */ public class U ...

  5. android显示服务器端文件夹,Android上传文件到服务端并显示进度条

    最近在做上传文件的服务,简单看了网上的教程.结合实践共享出代码. 由于网上的大多数没有服务端的代码,这可不行呀,没服务端怎么调试呢. Ok,先上代码. Android 上传比较简单,主要用到的是 Ht ...

  6. 移动端上传大文件到服务器,android上传大文件到服务器地址

    android上传大文件到服务器地址 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器 ...

  7. iOS Android 上传代码库+持续集成+单元测试

    背景 本文将介绍如何把iOS & Android项目分别上传到CocoaPods和Jitpack,并用Travis CI做持续集成,codecov做代码单元测试覆盖率的报告展示. 上传代码 创 ...

  8. 简单易懂SpringBoot和Android上传和下载文件方案——采用URL

    上传思路 SpringBoot把文件保存在静态资源里,并且开启静态资源访问 数据库保存文件的URL地址(URL地址是一个字符串) Android采用OkHttp上传文件 下载思路 SpringBoot ...

  9. Android上传文件到Web服务器,PHP接收文件(一)

    Android上传文件到服务器,通常采用构造http协议的方法,模拟网页POST方法传输文件,服务器端可以采用JavaServlet或者PHP来接收要传输的文件.使用JavaServlet来接收文件的 ...

  10. 上传txt生成字典 java_文件上传漏洞fuzz字典生成脚本小工具分享

    前言 学习xss的时候翻阅资料发现了一个文件上传漏洞fuzz字典生成脚本小工具,试了试还不错,分享一下 配置 需要python2环境 使用方法 $ python upload-fuzz-dic-bui ...

最新文章

  1. 为什么汉字不能当密码,假如用汉字做密码,又会怎样?
  2. FPGA之道(50)复位的设计
  3. homestead开发php,介绍ThinkPHP开发环境之Homestead
  4. RocketMQ源码解析-Broker的消息存储
  5. [个人笔记]C# 基础语法
  6. 2021.9.8 华为笔试题第三题
  7. 联想计算机如何设置bios密码,Lenovo 消费笔记本如何设置BIOS密码
  8. 用caffe框架做号牌识别笔记
  9. android 通知写法_Android消息通知-Notifation
  10. Fiddler+雷电模拟器进行APP抓包
  11. 软考 计算机 都有什么考试内容,了解软考是什么 软考考试流程都包括哪些
  12. hexo的next主题换到Yelee(Yilia)
  13. riscv-gnu-toolchain工具链的安装
  14. html圆渐变颜色代码,HTML5 canvas createRadialGradient()放射状/圆形渐变(示例代码)
  15. ker矩阵是什么意思_矩阵形式下的最小二乘法推导
  16. 计算机专业大几用到移动硬盘,2T有轻薄,4T大容量,双盘在面前,你会怎么选?—希捷2T移动硬盘评测...
  17. jason字符串解析
  18. DataTable小详解
  19. 如何将区块链技术运用到实际场景中?
  20. G.Hinton Dark Knowledge

热门文章

  1. Linux命令的类型:如何看清一条命令的“真身”是什么?
  2. 计算机防火墙打不开0x6d9,Windows7打开防火墙出错提示0x6D9的原因及解决方法
  3. Request Method请求方法
  4. Intellij IDEA 关于jsp中css样式的效果不能显示问题
  5. 数据分析也能造假!你得小心这些不为人知的坑
  6. 暑假第六次周赛--阿福场
  7. table tr td
  8. 常见宽带故障排查手册
  9. 新功能上线|AI全自动抠图换背景,电商、营销、摄影人士必备
  10. 执行器市场现状及未来发展趋势