自定义绘图

自定义视图中最重要的部分是它的外观。根据您的应用需求,自定义绘图可以很容易或复杂。本篇涵盖了一些最常见的操作

onDraw()

绘制自定义视图中最重要的步骤是重写该onDraw()方法。参数to onDraw()是Canvas视图可以用来绘制自己的对象。在Canvas 类定义绘制文字,线条,位图和许多其它图形图元的方法。您可以使用这些方法 onDraw()创建自定义用户界面(UI)。
但是,在您调用任何绘图方法之前,需要创建一个Paint 对象。下文将更详细地讨论。 (可以理解成绘制前需要一直笔,而这个笔就是Paint对象)

创建绘图对象

例如,Canvas提供了一种绘制线条的方法,同时 Paint提供了定义该线条颜色的方法。Canvas有一种方法来绘制一个矩形,同时Paint定义是用一种颜色填充该矩形还是将其留空。简单地说,Canvas定义可以在屏幕上绘制的形状,同时Paint定义绘制的每个形状的颜色,样式,字体等等。

所以,在绘制任何东西之前,您需要创建一个或多个Paint 对象。该PieChart示例在调用的方法中执行此操作init,该操作从构造函数中调用:

private void init() {mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mTextPaint.setColor(mTextColor);if (mTextHeight == 0) {mTextHeight = mTextPaint.getTextSize();} else {mTextPaint.setTextSize(mTextHeight);}mPiePaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPiePaint.setStyle(Paint.Style.FILL);mPiePaint.setTextSize(mTextHeight);mShadowPaint = new Paint(0);mShadowPaint.setColor(0xff101010);mShadowPaint.setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL));...

提前创建对象是一项重要的优化。视图经常重绘,许多图形对象需要昂贵的初始化。在您的onDraw() 方法中创建绘图对象会显着降低性能,并可能导致UI显得呆滞。

处理布局事件

为了正确绘制自定义视图,您需要知道它的大小。复杂的自定义视图通常需要执行多个布局计算,具体取决于屏幕上区域的大小和形状。你绝对不应该对屏幕上的视图大小做出假设。即使只有一个应用使用您的视图,该应用也需要在纵向和横向模式下处理不同的屏幕尺寸,多种屏幕密度以及各种纵横比。

虽然View有许多处理度量的方法,但大多数方法不需要被覆盖。如果你的视图不需要特殊控制它的大小,你只需要重写一个方法:onSizeChanged()。

onSizeChanged()在您的视图首次分配大小时调用,并且如果视图的大小因任何原因而发生更改,则会再次调用该视图。计算与您的视图尺寸相关的位置,尺寸和任何其他值 onSizeChanged(),而不是每次绘制时重新计算它们。在该PieChart例子中,onSizeChanged()是在PieChart图计算饼图的外接矩形和文本标签和其他视觉元素的相对位置。

当您的视图分配了大小时,布局管理器会假定大小包含所有视图的填充。计算视图大小时,您必须处理填充值。这里有一个片段PieChart.onSizeChanged() 显示了如何做到这一点:

  // Account for paddingfloat xpad = (float)(getPaddingLeft() + getPaddingRight());float ypad = (float)(getPaddingTop() + getPaddingBottom());// Account for the labelif (mShowText) xpad += mTextWidth;float ww = (float)w - xpad;float hh = (float)h - ypad;// Figure out how big we can make the pie.float diameter = Math.min(ww, hh);

onMeasure()
如果您需要更好地控制视图的布局参数,请执行onMeasure()。此方法的参数是一些 View.MeasureSpec值,告诉您视图的父级希望您的视图有多大,以及该大小是一个硬性最大值还是仅仅是一个建议。作为优化,这些值被存储为打包整数,并使用静态方法 View.MeasureSpec来解压存储在每个整数中的信息。

这是一个示例实现onMeasure()。在这个实现中,PieChart 试图使它的面积足够大,以使饼与其标签一样大:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// Try for a width based on our minimumint minw = getPaddingLeft() + getPaddingRight() + getSuggestedMinimumWidth();int w = resolveSizeAndState(minw, widthMeasureSpec, 1);// Whatever the width ends up being, ask for a height that would let the pie// get as big as it canint minh = MeasureSpec.getSize(w) - (int)mTextWidth + getPaddingBottom() + getPaddingTop();int h = resolveSizeAndState(MeasureSpec.getSize(w) - (int)mTextWidth, heightMeasureSpec, 0);setMeasuredDimension(w, h);
}

在这个代码中有三件重要的事情需要注意:

  • 计算考虑了视图的填充。如前所述,这是观点的责任。
  • 辅助方法resolveSizeAndState()用于创建最终的宽度和高度值。该帮助程序View.MeasureSpec通过将视图的所需大小与传入的规范进行比较来返回适当的 值 onMeasure()。
  • onMeasure()没有回报价值。相反,该方法通过调用来传递其结果setMeasuredDimension()。调用此方法是强制性的。如果您省略此调用,则View该类会引发运行时异常。

onDraw()

一旦你定义了对象创建和测量代码,你就可以实现onDraw()。每个视图的实现onDraw() 方式都不相同,但大多数视图共享一些常见操作:

  • 使用绘制文本drawText()。通过调用指定字体setTypeface(),并通过调用指定文字颜色setColor()。
  • 通过绘制基本形状drawRect(),drawOval()和drawArc()。通过调用来更改形状是否填充,勾勒或两者兼而有之setStyle()。
  • 使用Path该类绘制更复杂的形状。通过向Path对象添加直线和曲线来定义形状 ,然后使用绘制形状drawPath()。就像原始形状一样,根据路径可以勾勒出轮廓,填充或两者 setStyle()。
  • 通过创建LinearGradient对象来定义渐变填充。呼吁setShader()使用你 LinearGradient的填充形状。
  • 使用绘制位图drawBitmap()。
    例如,这里是绘制的代码PieChart。它使用文本,线条和形状的组合。
protected void onDraw(Canvas canvas) {super.onDraw(canvas);// Draw the shadowcanvas.drawOval(mShadowBounds,mShadowPaint);// Draw the label textcanvas.drawText(mData.get(mCurrentItem).mLabel, mTextX, mTextY, mTextPaint);// Draw the pie slicesfor (int i = 0; i < mData.size(); ++i) {Item it = mData.get(i);mPiePaint.setShader(it.mShader);canvas.drawArc(mBounds,360 - it.mEndAngle,it.mEndAngle - it.mStartAngle,true, mPiePaint);}// Draw the pointercanvas.drawLine(mTextX, mPointerY, mPointerX, mPointerY, mTextPaint);canvas.drawCircle(mPointerX, mPointerY, mPointerSize, mTextPaint);
}

Android自定义控件学习(三)----- 自定义视图组件
https://blog.csdn.net/qq_26296197/article/details/79775237

android自定义View学习(二)----自定义绘图相关推荐

  1. android自定义View学习(一)----创建一个视图类

    创建一个视图类 精心设计的自定义视图与其他精心设计的类非常相似.它使用易于使用的界面封装了一组特定的功能,它可以高效地使用CPU和内存,等等.不过,作为一个设计良好的班级,自定义视图应该: 符合And ...

  2. 精通Android自定义View(十二)绘制圆形进度条

    1 绘图基础简析 1 精通Android自定义View(一)View的绘制流程简述 2 精通Android自定义View(二)View绘制三部曲 3 精通Android自定义View(三)View绘制 ...

  3. 自定义View学习之仿QQ运动步数进度效果

    自定义View学习的小记录之第一篇 自定义View学习之QQ计步器 如何实现 1.分析想要得到什么效果 2.确定自定义属性,编写attrs.xml 3.在布局中使用 4.在自定义View中获取自定义属 ...

  4. 自定义view(二)

    这里是自定义view(二),上一篇关于自定义view的一些基本知识,比如说自定义view的步骤.会涉及到哪些函数以及如何实现自定义属性,同时实现了一个很基础的自定义控件,一个自定义的计时器,需要看的人 ...

  5. Android自定义view原理及自定义View示例

    自定义view如何分类 自定义View:只需要重写onMeasure()和onDraw(),在没有现成的View,需要自己实现的时候,就使用自定义View,一般继承自View,SurfaceView或 ...

  6. Android特效View之二之 闪闪发光Shimmer字体特效

    Android特效View之二之 闪闪发光Shimmer字体特效 Facebook开源了一款加载效果工具Shimmer,可以实现字体的闪闪发光效果,效果如下 链接地址在这里https://github ...

  7. Android OpenGL ES 学习(二) -- 图形渲染管线和GLSL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  8. Android自定义View 学习整理

    Paint类:画笔 Canvas类:画布,画出成品:与屏幕显示不是一个概念,相当于一个透明图层 ARGB 不在onDraw()中创建变量:因为当需要重绘时就会调用onDraw(),创建的变量会一直被重 ...

  9. Android进阶之自定义View实战(二)九宫格手势解锁实现

    一.引言 在上篇博客Android进阶之自定义View实战(一)仿iOS UISwitch控件实现中我们主要介绍了自定义View的最基本的实现方法.作为自定义View的入门篇,仅仅介绍了Canvas的 ...

  10. 学习自定义View(二)仿58同城加载

    之前用58同城app的时候看到它的加载界面不错,但是那时候还不知道如何实现~接触自定义View后,于是自己试着模仿写了一个 先看效果图: 录制的GIF上有一点卡,其实在真机上面运行很流畅的~ 其实感觉 ...

最新文章

  1. App启动闪屏黑屏问题
  2. 大学期间可以获得哪些荣誉_大学期间没有什么荣誉经历,该怎么写简历呢?找工作会很难吗?...
  3. spark yarn任务的executor 无故 timeout之原因分析
  4. Android 第十一课 SQlite 数据库存储
  5. 设计模式 - Mediator
  6. 【安卓开发 】Android初级开发(四)ListView
  7. 你需要administrators提供的权限才能删除_终于解决了:你需要来自XXX的权限才能对此文件进行更改
  8. mysql自动获取时间列_mysql自动获取时间日期的方法
  9. java 死锁_java死锁分析
  10. 霸王级”寒潮来袭 神华国华“智能供热”送温暖
  11. 离线编译安装lrzsz
  12. Word文档封面填写打字时字体下方出现空格如何解决
  13. 原始socket实现局域网ARP欺骗
  14. [BZOJ]4755: [Jsoi2016]扭动的回文串
  15. BUUCTF·[网鼎杯 2020 青龙组]boom·WP
  16. AP计算机科学与AP计算机科学原理介绍
  17. Discuz论坛 创始人/超级管理员密码忘记解决办法!
  18. linux运维工程师培训课程_Linux运维工程师工作内容总结!
  19. Echarts - 去掉图表横纵坐标轴刻度线(小细条分割线)
  20. 计算机组装培训主要有什么,计算机组装与维护培训方案(10页)-原创力文档

热门文章

  1. mysql如何管理innodb元数据_1.1.20 可动态关闭InnoDB更新元数据的统计功能
  2. OpenShift 4 - DevSecOps Workshop (4) - 为 Task 增加参数和Workspace
  3. VS中代码格式及样式的统一处理
  4. Microsoft Blazor——快速开发与SQL Forms开源平台Platz.SqlForms
  5. Jupyter.net:使用Jupyter进行交互式计算的Windows应用程序
  6. PyTorch 1.6 发布:原生支持自动混合精度训练并进入稳定阶段
  7. 遍历同辈节电的方法_jQuery遍历节点
  8. hive后台启动_数据仓库组件:Hive环境搭建和基础用法
  9. sql实现自定义排序
  10. oracle fm s,FM连接oracle出错的问题??