前几天,公司一个项目中,头像图片需要添加圆角,这样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 bitmapprivate Paint mBitmapPaint;//paintprivate RectF mBrounds;//rectprivate float mRadius=20.0f;//roundpublic 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();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubint height,width;height=width=0;//obtain bitmap sizeint imageHeight,imageWidth;if (null!=mImage) {imageHeight=imageWidth=0;}else{imageHeight=mImage.getHeight();imageWidth=mImage.getWidth();}//obtain best measure data and set on Viewwidth=getMeasurement(widthMeasureSpec,imageWidth);height=getMeasurement(heightMeasureSpec, imageHeight);//set View last sizesetMeasuredDimension(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}@Overrideprotected 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 pointint 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()}}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (null!=mBitmapPaint) {//draw Round Rectcanvas.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{@Overrideprotected 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

自定义View将圆角矩形绘制在Canvas上相关推荐

  1. android布局中画圆角矩形,Android 自定义View之圆角矩形轨迹图

    一.原理说明 主要是通过计算轨迹的坐标点加入到集合中,然后对集合进行相应截取,传入canvas中. 二.具体代码实现 /** * 原理是先通过尺寸把各个轨迹的坐标计算出来,然后再截取相应坐标,进行重绘 ...

  2. Android 自定义View 圆形圆角图片

    [Android 自定义View 圆形圆角图片] 基于Xfermode 实现 1.概述 在很久以前也写过一个利用Xfermode 实现圆形.圆角图片的(Android 完美实现图片圆角和圆形(对实现进 ...

  3. android 自定义paint,Android自定义View中Paint、Rect、Canvas介绍(一)

    自定义View对于新手而言貌似是一个很复杂的东西.格式,各函数的意义.对于大神经常忘记各函数及一些参数的具体写法及意义,刚好在做一个风车效果,把过程及遇到的问题都写下来 1.如何自定义一个View p ...

  4. 【5年Android从零复盘系列之十七】Android自定义View(12):手势绘制及GestureOverlayView事件详解(图文)

    [5年Android从零复盘系列之十七]Android自定义View(12):手势绘制及GestureOverlayView事件浅析 1.基础 掌握View体系事件分发与处理,参考Android自定义 ...

  5. 自定义View之——风车的绘制

    由于本人使用的华为手机,真是被华为天气的界面圈粉,之前有仿写了其中一个自定义的view,今天带来另一个自定义view,就是其中的风车,先上图 相信大家在其它很多天气软件就看到过. 一.概述 在图中,风 ...

  6. Android -- 自定义View小Demo,绘制四位数随机码(一)

    1,现在有这样一个需求,实现显示随机随机数可能在代码中直接很简单的就实现了,但是现在我们直接自定义View来实现这个效果,那么我们来分析一波吧,我们允许开发者自己设置这个textview的大小,颜色, ...

  7. Android 自定义View :虚线矩形

    预览效果: 涉及参数: 斜线起点坐标(斜线可以忽略) 斜线终点坐标(斜线可以忽略) 矩形左上角坐标 矩形右下角坐标 其中,前两个参数用于绘制预览效果中矩形上方的斜线,如果不需要可以移除. 本案例涉及视 ...

  8. android自定义View: 饼状图绘制(四)

    本系列自定义View全部采用kt 系统mac android studio: 4.1.3 kotlin version1.5.0 gradle: gradle-6.5-bin.zip 本篇效果: 画矩 ...

  9. 自定义View时,用到Paint Canvas的一些温故,讲讲用路径绘画实现动画效果(基础篇 三)

    转载请注明出处王亟亟的大牛之路 上礼拜上了一篇关于动画的自定义View的文章,然后里面的实现是PathMeasure,然后这一部分貌似以前没有讲过,那么就再补一篇来介绍下这部分的知识(之前一篇的传送门 ...

最新文章

  1. 深入super,看Python如何解决钻石继承难题
  2. Android第十期 - 百度地图
  3. fastxml 大于符号不转换_你可能不知道的MATLAB入门技巧#第二话
  4. 搞工程和搞电子的人摆摊能做什么?
  5. 使用SQL Server分区表功能提高数据库的读写性能
  6. c#中接口的使用方法图解_c# 接口方法中使用new有什么用?
  7. 一流大学计算机专业,计算机专业一流大学太难考,不妨退而求其次,看看这5所大学...
  8. php 实例化模型出错,实例化model出错了
  9. error LNK2005: _DllMain@12 already defined in MSVC
  10. 【linux(2),Redis面试复习大纲在手面试不慌
  11. GEO基因芯片数据处理精华(一):GEOquery包
  12. 扒一扒微信后台架构.....
  13. java exception 级别_Java异常体系概述
  14. java junit测试类怎么写_15.junit测试类使用及注解
  15. 差分管电路图_电子管差分放大电路改造方案
  16. 扩展卡尔曼滤波EKF—目标跟踪中的应用(算法部分)
  17. SWS_BICUBIC未声明的标识符解决方法
  18. 玩转华为ENSP模拟器系列 | 配置OSPF ABR路由聚合示例
  19. AD里面简易的3d制作
  20. 百分百解决python manage.py makemigrations没有反应

热门文章

  1. 使用python将txt格式的数据转换为csv格式,读取csv数据前几行
  2. 内存测试内存检测工具
  3. 目标检测~FastPillars实时3D
  4. Linux即时通讯软件都有哪些?政企要怎么挑选?
  5. 这是一篇假的回顾过去展望未来计划书
  6. 北京住房公积金联名卡查询使用
  7. 真实揭秘90后程序员婚恋现状,有点扎心!
  8. android ps2 模拟器,手机目前安卓系统PS2模拟器最好用的是一款叫做呆萌PS2模拟器的APP!这一款竟然是国产的!...
  9. express图片上传
  10. 【重点:线程池续】超人气组合:Callable和Future