本文实例讲述了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,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,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程序设计有所帮助。
总结以上是内存溢出为你收集整理的Android开发使用自定义View将圆角矩形绘制在Canvas上的方法全部内容,希望文章能够帮你解决Android开发使用自定义View将圆角矩形绘制在Canvas上的方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)