博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用 Quartz 画聊天对话框背景实例
阅读量:6275 次
发布时间:2019-06-22

本文共 4455 字,大约阅读时间需要 14 分钟。

前段时间只看,没有手动写过代码,今天无聊就写了一个画聊天对话框的例子,其实还是蛮实用的,以后一定会有用到的地方。

主要用到Quartz的几个关键技术

路径,阴影,填充,描边,图像上下文环境的设置。

 

以下是代码:

 

 

CGContextRef MyCreateBitmapContext (int pixelsWide

int pixelsHigh)

{

    CGContextRef    context = NULL;

    CGColorSpaceRef colorSpace;

    void *          bitmapData;

    int             bitmapByteCount;

    int             bitmapBytesPerRow;

    

    //声明一个变量来代表每行的字节数。每一个位图像素的代表是4个字节,8bit红,8bit绿,8bit蓝,和8bit alpha通道信息(透明信息)。

    bitmapBytesPerRow   = (pixelsWide * 4);

    bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);

 

    colorSpace = CGColorSpaceCreateDeviceRGB();// 创建一个通用的RGB色彩空间

    bitmapData = malloc( bitmapByteCount );// 调用的malloc函数来创建的内存用来存储位图数据块

    if (bitmapData == NULL)

    {

        fprintf (stderr "Memory not allocated!");

        return NULL;

    }

    

    //创建一个位图图形上下文

    context = CGBitmapContextCreate (bitmapData

 pixelsWide

 pixelsHigh

 8      // bits per component

 bitmapBytesPerRow

 colorSpace

 kCGImageAlphaPremultipliedLast);

    if (context== NULL)

    {

        free (bitmapData);

        fprintf (stderr "Context not created!");

        return NULL;

    }

    //释放colorSpace 注意使用的函数

    CGColorSpaceRelease( colorSpace );

 

    return context;

}

 

/*

 生成一个聊天的对话框背景图

 参数

 myContext:一个图形上下文

 ox: 矩形左下角x坐标

 oy: 矩形左下角y坐标

 rw: 矩形宽度

 rh: 矩形高度

 r : 矩形圆角半径

 Orientation: 箭头方向,0-7 

 */

UIImage* createDialogBox (CGContextRef myContext float ox float oy float rw float rh float r  int Orientation)

{

CGMutablePathRef path = CGPathCreateMutable();

//画矩形

CGPathMoveToPoint(path NULLox oy+r);

CGPathAddArcToPoint(path NULL ox oy+rh ox+roy+rh r);

CGPathAddArcToPoint(path NULL ox+rw oy+rh ox+rw oy+rh-r r);

CGPathAddArcToPoint(path NULL ox+rw oy ox+rw-r oy r);

CGPathAddArcToPoint(path NULL ox oy oxoy+rr);

 

//画箭头

switch (Orientation) {

case 0:

CGPathMoveToPoint(path NULLox+r+10.0 oy+rh);

CGPathAddLineToPoint(path NULL ox+r+10.0 oy+rh+20);

CGPathAddLineToPoint(path NULL ox+r+30.0 oy+rh);

break;

case 1:

CGPathMoveToPoint(path NULLox+rw-r-10.0 oy+rh);

CGPathAddLineToPoint(path NULL ox+rw-r-10.0 oy+rh+20);

CGPathAddLineToPoint(path NULL ox+rw-r-30.0 oy+rh);

break;

case 2:

CGPathMoveToPoint(path NULLox+rw oy+rh-r-10);

CGPathAddLineToPoint(path NULL ox+rw+20 oy+rh-r-10);

CGPathAddLineToPoint(path NULL ox+rw oy+rh-r-30);

break;

case 3:

CGPathMoveToPoint(path NULLox+rw oy+r+10);

CGPathAddLineToPoint(path NULL ox+rw+20 oy+r+10);

CGPathAddLineToPoint(path NULL ox+rw oy+r+30);

break;

case 4:

CGPathMoveToPoint(path NULLox+rw-r-10.0 oy);

CGPathAddLineToPoint(path NULL ox+rw-r-10.0 oy-20);

CGPathAddLineToPoint(path NULL ox+rw-r-30.0 oy);

break;

case 5:

CGPathMoveToPoint(path NULLox+r+10.0 oy);

CGPathAddLineToPoint(path NULL ox+r+10.0 oy-20);

CGPathAddLineToPoint(path NULL ox+r+30.0 oy);

break;

case 6:

CGPathMoveToPoint(path NULLox oy+r+10);

CGPathAddLineToPoint(path NULL ox-20 oy+r+10);

CGPathAddLineToPoint(path NULL ox oy+r+30);

break;

case 7:

CGPathMoveToPoint(path NULLox oy+rh-r-10);

CGPathAddLineToPoint(path NULL ox-20 oy+rh-r-10);

CGPathAddLineToPoint(path NULL ox oy+rh-r-30);

break;

default:

break;

}

 

 

//描边 以及添加阴影效果

CGContextSetLineJoin(myContext kCGLineJoinRound);

CGFloat zStrokeColour[4]    = {180.0/255 180.0/255.0 180.0/255.0 1.0};

CGContextSetLineWidth(myContext 13.0);

CGContextAddPath(myContextpath);

CGContextSetStrokeColorSpace(myContext CGColorSpaceCreateDeviceRGB());

CGContextSetStrokeColor(myContext zStrokeColour);

CGContextStrokePath(myContext);

 

CGSize myShadowOffset = CGSizeMake (0  0);

    CGContextSaveGState(myContext);

 

    CGContextSetShadow (myContext myShadowOffset 5);

CGContextSetLineJoin(myContext kCGLineJoinRound);

CGFloat zStrokeColour1[4]    = {228.0/255 168.0/255.0 81.0/255.0 1.0};

CGContextSetLineWidth(myContext 3.0);

CGContextAddPath(myContextpath);

CGContextSetStrokeColorSpace(myContext CGColorSpaceCreateDeviceRGB());

CGContextSetStrokeColor(myContext zStrokeColour1);

CGContextStrokePath(myContext);

 

CGContextRestoreGState(myContext);

 

//填充矩形内部颜色

CGContextAddPath(myContextpath);

CGContextSetFillColorSpace(myContext CGColorSpaceCreateDeviceRGB());

CGFloat zFillColour1[4]    = {229.0/255 229.0/255.0 231.0/255.0 1};

CGContextSetFillColor(myContext zFillColour1);

CGContextEOFillPath(myContext);

 

//生成图像

CGImageRef myImage = CGBitmapContextCreateImage (myContext);

UIImage * image = [UIImage imageWithCGImage:myImage];

CGImageRelease(myImage);

return image;

}

 

 

 

 

- (void)viewDidLoad {

[super viewDidLoad];

float wd = 320.0;

float ht = 480.0;

CGContextRef myContext = MyCreateBitmapContext (wd ht);

 

UIImageView *iv = [[UIImageView alloc] initWithImage:createDialogBox(myContext 50 350 100 60 5 7)];

[self.view addSubview:iv]; 

转载于:https://www.cnblogs.com/pengyingh/articles/2378931.html

你可能感兴趣的文章
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
Android下创建一个sqlite数据库
查看>>
数组<=>xml 相互转换
查看>>
MFC单文档应用程序显示图像
查看>>
poj 2777(线段树的节点更新策略)
查看>>
Swift-EasingAnimation
查看>>