自定义View
2015-09-17 09:56
337 查看
自定义View
画笔的设置
旋转
画圆弧和扇形的方法
能用Canvas绘制出的各种图形
一般画笔的初始化等造作都在第二个构造器中。
除了构造器要重写外我们还必须重写两个方法:
onMeasure()
onDraw()
onMeasure()是测量宽度和高度的。在这个方法中获得View的宽度和高度。获得方法是在super()方法中复制来的。
onDraw()是受UI主线程控制的,在这个方法中进行绘制一系列的图形。
代码如下:
void rotate(float degrees)
void rotate (float degrees, float px, float py)
第一个构造函数直接输入旋转的度数,正数是顺时针旋转,负数指逆时针旋转,它的旋转中心点是原点(0,0)
第二个构造函数除了度数以外,还可以指定旋转的中心点坐标(px,py)
下面以第一个构造函数为例,旋转一个矩形,先画出未旋转前的图形,然后再画出旋转后的图形;
下面是一个画表盘的代码:在代码中既要画出圆,还要画出小线条和对应的时钟数
oval :指定圆弧的外轮廓矩形区域。
startAngle: 圆弧起始角度,单位为度。
sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度,从右中间开始为零度。
useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。关键是这个变量,下面将会详细介绍。
paint: 绘制圆弧的画板属性,如颜色,是否填充等。
Paint paint = new Paint();
paint.setStrokeWidth(20);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLUE);
float startAngle01 = 3;
float sweepAngle01 = 86;
RectF rect = new RectF(center - radius, center - radius, center
+ radius, center + radius);
canvas.drawArc(rect, startAngle01, sweepAngle01, true, paint);
当第4个参数为true时,绘制出的是扇形
这个参数为false时,绘制出的是弧形
//绘制矩形(左上右下的坐标,我们可以理解为左上的坐标为我们确定了矩形的左上角点,右下坐标为我们确定了右下角的点,这样一个矩形区域就确定出来了,paint为画笔)
drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint)
//绘制圆角矩形(左上右下的坐标)
drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
//绘制弧(参数一是RectF对象,一个矩形区域椭圆形的界限用于定义在形状、大小、电弧,参数二是起始角(度)在电弧的开始,
参数三扫描角(度)开始顺时针测量的,参数四是如果这是真的话,包括椭圆中心的电弧,并关闭它,实际绘制的是扇形,如果它是假这将是一个弧线,参数五是Paint对象)
drawOval(float left, float top, float right, float bottom, Paint paint)
//绘制椭圆
drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
//绘制直线(XY起止坐标)
drawCircle(float cx, float cy, float radius, Paint paint)
//绘制圆形
drawText(String text, float x, float y, Paint paint)
//绘制文本
其他的不再进行列举,有需要可以查看API文档。
画笔的设置
旋转
画圆弧和扇形的方法
能用Canvas绘制出的各种图形
自定义View
新建一个类继承自View类,在这个类中有四个构造器,我们必须重写第二个。代码如下:[code]public MyView(Context context) { super(context); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); }
一般画笔的初始化等造作都在第二个构造器中。
除了构造器要重写外我们还必须重写两个方法:
onMeasure()
onDraw()
onMeasure()是测量宽度和高度的。在这个方法中获得View的宽度和高度。获得方法是在super()方法中复制来的。
onDraw()是受UI主线程控制的,在这个方法中进行绘制一系列的图形。
代码如下:
[code] @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);//设置宽 height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);//设置高 setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //是由UI主线程自动调用,只需要在此绘制即可 canvas.drawLine(0,0,300,300,mPaintLine);//绘制的是线 canvas.drawCircle(300,300,100,mPaintCircle);//绘制的是圆 canvas.drawCircle(width / 2, height / 2, 200, mPaintCircle); canvas.drawCircle(width / 2, height / 2, 10, mPaintCircle); }
画笔的设置
绘制任何图形都必须有画笔,画笔也是一个对象需要new,一般在有两个参数的构造器中new:[code]public MyView(Context context, AttributeSet attrs) { super(context, attrs); mCalendar=Calendar.getInstance(); mPaintLine = new Paint(); mPaintLine.setColor(Color.RED);//设置线的颜色 mPaintLine.setStrokeWidth(5);//设置线的宽度 mPaintLine.setAntiAlias(true);//设置抗锯齿 mPaintCircle = new Paint(); mPaintCircle.setColor(Color.BLUE); mPaintCircle.setStrokeWidth(5);//设置线的宽度 mPaintCircle.setStyle(Paint.Style.STROKE);//绘制出空心圆 mPaintCircle.setAntiAlias(true);//设置抗锯齿 mPaintText = new Paint(); mPaintText.setColor(Color.BLACK); mPaintText.setTextSize(25);//设置字体大小 mPaintText.setTextAlign(Paint.Align.CENTER);//文字居中
旋转
画布的旋转是默认是围绕坐标原点来旋转的,这里容易产生错觉,看起来觉得是图片旋转了,其实我们旋转的是画布,以后在此画布上画的东西显示出来的时候全部看起来都是旋转的。其实Roate函数有两个构造函数:void rotate(float degrees)
void rotate (float degrees, float px, float py)
第一个构造函数直接输入旋转的度数,正数是顺时针旋转,负数指逆时针旋转,它的旋转中心点是原点(0,0)
第二个构造函数除了度数以外,还可以指定旋转的中心点坐标(px,py)
下面以第一个构造函数为例,旋转一个矩形,先画出未旋转前的图形,然后再画出旋转后的图形;
下面是一个画表盘的代码:在代码中既要画出圆,还要画出小线条和对应的时钟数
[code]for (int i=1;i<=12;i++){ canvas.save();//保存画布当时状态 canvas.rotate(360 / 12 * i, width / 2, height / 2);//第一个参数是旋转的度数,第二、三个参数是围绕这个点旋转的坐标值 canvas.drawLine(width / 2, height / 2 - 200, width / 2, height / 2 - 180, mPaintLine);//画出小线条 canvas.drawText("" + i, width / 2, height / 2 - 150, mPaintText);//写上对应的时钟数字 canvas.restore(); }
画圆弧和扇形的方法
[code] public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
oval :指定圆弧的外轮廓矩形区域。
startAngle: 圆弧起始角度,单位为度。
sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度,从右中间开始为零度。
useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。关键是这个变量,下面将会详细介绍。
paint: 绘制圆弧的画板属性,如颜色,是否填充等。
Paint paint = new Paint();
paint.setStrokeWidth(20);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLUE);
float startAngle01 = 3;
float sweepAngle01 = 86;
RectF rect = new RectF(center - radius, center - radius, center
+ radius, center + radius);
canvas.drawArc(rect, startAngle01, sweepAngle01, true, paint);
当第4个参数为true时,绘制出的是扇形
这个参数为false时,绘制出的是弧形
能用Canvas绘制出的各种图形
drawRect(float left, float top, float right, float bottom, Paint paint)//绘制矩形(左上右下的坐标,我们可以理解为左上的坐标为我们确定了矩形的左上角点,右下坐标为我们确定了右下角的点,这样一个矩形区域就确定出来了,paint为画笔)
drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint)
//绘制圆角矩形(左上右下的坐标)
drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
//绘制弧(参数一是RectF对象,一个矩形区域椭圆形的界限用于定义在形状、大小、电弧,参数二是起始角(度)在电弧的开始,
参数三扫描角(度)开始顺时针测量的,参数四是如果这是真的话,包括椭圆中心的电弧,并关闭它,实际绘制的是扇形,如果它是假这将是一个弧线,参数五是Paint对象)
drawOval(float left, float top, float right, float bottom, Paint paint)
//绘制椭圆
drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
//绘制直线(XY起止坐标)
drawCircle(float cx, float cy, float radius, Paint paint)
//绘制圆形
drawText(String text, float x, float y, Paint paint)
//绘制文本
其他的不再进行列举,有需要可以查看API文档。
相关文章推荐
- 关于byte数组截取有效字段的工具方法
- HDU_3468_Treasure Hunting([二分图匹配 / 最大流] + 最短路)
- 九阳智能豆浆机破解细节分析
- Qt 学习之路:深入 Qt5 信号槽新语法
- CF 578A A Problem about Polyline
- 摘要JSR168 PORLET标准手册汉化整理
- win8本地连接无法禁用
- Struts 2 – Development mode example
- 成本中心领用接口
- 第十章 基本数据结构
- 传智播客助力一带一路IT人才培养
- sqlserver text/ntext 字段读取
- Android 开发之 ---- 底层驱动开发(一)
- CXF-Spring发布 Cannot create a secure XMLInputFactory
- C语言算法小练习-4
- 设置网页图标、任务栏图标
- Android 实现沉浸式状态栏
- OSI各层数据名称
- PropertiesLoaderUtils.loadAllProperties()
- 用foreach遍历改变二维数组中的值