zoukankan      html  css  js  c++  java
  • 关于iPhone开发中的绘图

    iPhone中,主要通过下面的几个技术来绘图
    OpenGL, Quartz, UIKit or Core Animation

    UIKit 是非线程安全的,所以最好把所有的绘图都放在主线程上执行
    不管使用的哪个技术来绘图,所有的绘图都是在 UIView object 中进行, view决定绘图在那里进行

    绘画周期

    当一个view需要更新某一部分内容的时候,view会请求 drawRect: 方法
    在view第一次请求drawRect方法的时候,传递的rectangle 参数一般是view的整个rectangle ,后续更新的时候,传递的一般是需要更新的那部分rectangle

    在几种情况下,view会重新绘图

    1. 移动或者移除另外一个view
    2. 设置view的hidden 属性为NO, view重新出现
    3. 滚动view,当滚出或者滚进来的时候
    4. 明确的请求setNeedsDisplay和setNeedsDisplayInRect:方法

    当请求了一个 drawRect:方法,view会标志自己已经被更新了,然后等待下一个更新请求的到达

    坐标系统
    current transformation matrix (CTM)
    默认坐标原点是左上角

    如果需要改变坐标系统,有两种方法:

    1. CGContext Reference
    2. CGAffineTransform Reference

    图形上下文(Graphics Contexts)
    当请求drawRect:方法 ,view object会自动配置图形环境,作为环境的一部分,uiview会创建一个图形上下文(a CGContextRef opaque type)
    图形上下文定义基本图形属性,如颜色,剪切区域,线的宽度和样式信息,字体信息,合成选项,等等。
    也可以自己创建图形上下文用 CGBitmapContextCreate 或者 CGPDFContextCreate 函数
    需要注意的是,自己创建的图形上下文的原点是在左下角
    CGContextSetRGBStrokeColor和CGContextSetRGBFillColor两个函数设置当前的笔锋色和填充色。

    iPhone支持的图形格式

    • .png
    • .tiff/.tif
    • .jpeg/.jpg
    • .gif
    • .bmp/.BMPf
    • .ico
    • .cur
    • .xbm

    绘画技巧

    1. 部分更新:假如在 drawRect: 中,更新rectangle 中的部分
    2. 如果一个view中没有透明部分,那么把 opaque 属性设置为 YES,这样会省很多的CPU
    3. 如果一张png图片没有任何透明的部分,那么久删除alpha通道,这样渲染的时候会省很多功夫
    4. 滚动的时候重用table cells和views
    5. 正常情况下,在view请求 drawRect: 之前都会清除current context buffer,来更新相同区域.如果在滚动的时候,反复的清除,很浪费时间,这样的话就把view的clearsContextBeforeDrawing 设置成NO。
    6. 在绘图的时候,尽量少的图形状态改变.因为改变绘图状态需要window的server

    提高图片质量

    1. 首选png图片格式
    2. 使用图片的时候,尽量的不要去改变大小,假如需要使用这个图片在很多地方,那么尽量使用和他们比较接近的图片大小的图片

    Quartz是Core Graphics的心脏, 主要提供以下东西

    • Graphics contexts
    • Paths
    • Images and bitmaps
    • Transparency layers
    • Colors, pattern colors, and color spaces
    • Gradients and shadings
    • Fonts
    • PDF content

    更多详细内容在:Core Graphics Framework Reference

    UIKit是在Quartz的基本功能上的封装。他主要提供以下类

    • UIImage
    • UIColor
    • UIFont
    • UIScreen
    • 生成png或者jpeg,用UIImage表现出来的函数
    • 画矩形,和剪裁绘图区域的函数
    • 改变和获取当前的图形上下文

    更多详细内容在:UIKit Framework Reference

    配置图形上下文(CGContext)
    在drawRect:中,view已经自动的为我们创建了图形上下文,我们可以通过函数UIGraphicsGetCurrentContext获取。

    图形上下文使用堆栈来保存图像状态,CGContextSaveGState函数保存当前图像状态
    CGContextRestoreGState函数来回到前面的版本

    图片的绘画和创建
    下面的几个场景,最好使用下面的方法
    1>当view中只有一张图片,那么使用UIImageView来加载图片
    2>用代码创建一张图片
    两种方法:
    1. 先用UIGraphicsBeginImageContext创建一个基于图片的图形上下文,画好图形后,用UIGraphicsGetImageFromCurrentImageContext 函数,生成图片,画完,最后用UIGraphicsEndImageContext 关闭图形上下文。
    2. 用CGBitmapContextCreate创建图形上下文,在上面画图片,用CGBitmapContextCreateImage 创建CGImageRef,最后用CGImageRef来创建 UIImage。

    把一张图片保存为jpg或者png
    加载一张图片,然后用UIImageJPEGRepresentation或者UIImagePNGRepresentation函数获取加载的图片的NSData,然后用NSData生成png或者jpg。

    创建和绘制路径
    一个路径是一个二维几何场景,UIKit中包含UIRectFrame、UIRectFill这两个方法来创建简单的路径,比如矩形。Core Graphics中还包含了椭圆,等等。CGContextBeginPath来创建一个基于路径的图形上下文,然后开始创建路径。完事后,生成CGPathRef 或者CGMutablePathRef。最后用CGContextStrokePath和CGContextFillPath填充颜色。

    参考:Graphics and Drawing in iOS

  • 相关阅读:
    js_阶乘
    python 最新方案-解决编码错误问题:UnicodeEncodeError: 'ascii' codec can't encode characters in position
    RabbitMQ Python端发送消息给Java端 接受消息全数字问题
    【Hadoop】第六天 Hive
    【Hadoop 】第五天 Hadoop-HA 搭建
    Redis面试常问点
    python md5 salt 摘要算法
    【Hadoop】第四天 Shuffle MapReduce组件全貌
    【Hadoop】第三天 mapreduce的原理和编程
    【Hadoop 】第二天 hdfs的原理和使用操作、编程
  • 原文地址:https://www.cnblogs.com/careerman/p/2709028.html
Copyright © 2011-2022 走看看