Android开发使用自定义View将圆角矩形绘制在Canvas上的方法
本文实例讲述了Android开发使用自定义View将圆角矩形绘制在Canvas上的方法。分享给大家供大家参考,具体如下:
前几天,公司一个项目中,头像图片需要添加圆角,这样UI效果会更好看,于是写了一个小的demo进行圆角的定义,该处主要是使用BitmapShader进行了渲染(如果要将一张图片裁剪成椭圆或圆形显示在屏幕上,也可以使用BitmapShader来完成).
BitmapShader类完成渲染图片的基本步骤如下:
1、创建BitmapShader类的对象
/**
* Call this to create a new shader that will draw with a bitmap.
*
* @param bitmap The bitmap to use inside the shader
* @param tileX The tiling mode for x to draw the bitmap in.
* @param tileY The tiling mode for y to draw the bitmap in.
*/
public BitmapShader(Bitmap bitmap, TileMode tileX, TileMode tileY) {
......
}
其中,Shader.TitleMode类型有三种,CALMP、MIRROR、REPEAT
CALMP:使用边界颜色来填充剩余空间 MIRROR:使用镜像方式 REPEAT:使用重复方式
2、通过Paint的setShader(bitmapShafer)
来设置画笔
3、使用已经setShader(bitmapShafer)
的画笔来绘制图形
下面展示绘制圆角图片的demo
1、自定义RounderCornerImageView.java类
package com.example.test;
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.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.View;
public class RounderCornerImageView extends View {
private Bitmap mImage;// source bitmap
private Paint mBitmapPaint;//paint
private RectF mBrounds;//rect
private float mRadius=20.0f;//round
public RounderCornerImageView(Context context) {
this(context, null);
}
public RounderCornerImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RounderCornerImageView(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mBitmapPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
mBrounds=new RectF();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
int height,width;
height=width=0;
//obtain bitmap size
int imageHeight,imageWidth;
if (null!=mImage) {
imageHeight=imageWidth=0;
}else
{
imageHeight=mImage.getHeight();
imageWidth=mImage.getWidth();
}
//obtain best measure data and set on View
width=getMeasurement(widthMeasureSpec,imageWidth);
height=getMeasurement(heightMeasureSpec, imageHeight);
//set View last size
setMeasuredDimension(width, height);
}
/**
* measure width and height by specMode
**/
private int getMeasurement(int measureSpec, int contentSize) {
int specSize=MeasureSpec.getSize(measureSpec);
switch (MeasureSpec.getMode(measureSpec)) {
case MeasureSpec.AT_MOST:
return Math.min(specSize, contentSize);
case MeasureSpec.UNSPECIFIED:
return contentSize;
case MeasureSpec.EXACTLY:
return specSize;
default:
return 0;
}//switch
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (w!=oldw || h!=oldh) {
int imageWidth,imageHeight;
if (null==mImage) {
imageWidth=imageHeight=0;
}else
{
imageWidth=mImage.getWidth();
imageHeight=mImage.getHeight();
}
//center point
int left=(w-imageWidth)/2;
int top=(h-imageHeight)/2;
mBrounds.set(left, top, left+imageWidth, top+imageHeight);
if (null!=mBitmapPaint.getShader()) {
Matrix m=new Matrix();
m.setTranslate(left, top);
mBitmapPaint.getShader().setLocalMatrix(m);
}
}
}
public void setImage(Bitmap bitmap) {
if (mImage!=bitmap) {
mImage=bitmap;
if (null!=mImage) {
BitmapShader shader=new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mBitmapPaint.setShader(shader);
}else {
mBitmapPaint.setShader(null);
}
requestLayout();//invalidated the layout of this view by onDraw()
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (null!=mBitmapPaint) {
//draw Round Rect
canvas.drawRoundRect(mBrounds, mRadius, mRadius, mBitmapPaint);
}
}
}
2、显示圆角图片的RoundActivity.java类
package com.example.test;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
public class RoundActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RounderCornerImageView view=new RounderCornerImageView(this);
Bitmap souBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.sun);
view.setImage(souBitmap);
setContentView(view);
}
}
另外,附注下自定义View的一些基本步骤和必须实现的方法
1、继承view
2、重写自定义View的构造方法
3、如需要对view进行位置进行测量和重写布局,则需要重写onMeasure()
、onLayout()
、onDraw()
方法
onMeasure():view本身大小多少,可以测量出来 onLayout():view在ViewGroup中的位置可以决定 onDraw():定义了如何绘制该view
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android控件用法总结》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android数据库操作技巧总结》及《Android资源操作技巧汇总》
希望本文所述对大家Android程序设计有所帮助。
- 深入源码探索 ReactNative 通信机制
- PHP跨站脚本攻击(XSS)漏洞修复思路(二)
- WordPress发布文章自动同步到新浪微博(带特色图片)
- go http 服务器编程(1)
- Linux系统内存监控、性能诊断工具vmstat命令详解
- go http 服务器编程(2)
- 利用placeholder属性来添加输入框默认文字提示,提高用户体验
- Linux系统监控、诊断工具之top命令详解
- 【Dev Club分享】iOS黑客技术大揭秘
- Linux终端:用cat命令查看不可见字符
- golang 函数定义及其接口实例
- 分享两种圣诞节雪花特效JS代码(网站下雪效果)
- React 移动 web 极致优化
- golang 高效字符串拼接
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- laravel Validator ajax返回错误信息的方法
- Linux下 php7安装redis的办法
- php实现的数组转xml案例分析
- Laravel框架Auth用户认证操作实例分析
- yii2实现Ueditor百度编辑器的示例代码
- PHP下载文件函数与用法示例
- php实现银联商务公众号+服务窗支付的示例代码
- php使用json-schema模块实现json校验示例
- 17个品牌,113款5G手机,5G离我们越来越近。
- PHP的cookie与session原理及用法详解
- Thinkphp5.0框架视图view的循环标签用法示例
- Thinkphp5.0 框架视图view的比较标签用法分析
- laravel 操作数据库常用函数的返回值方法
- laravel 验证错误信息到 blade模板的方法
- thinkPHP+LayUI 流加载实现功能