ios开发图形绘制
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
????引入了Core Graphices框架功能,演示如何畫線條,文本,改變線條的額粗細(xì),顏色,以及保存和恢復(fù)圖形上下文。
要在一個視圖中進(jìn)行自定義繪制,我們必須首先獲得當(dāng)前圖形上下文。圖形上下文(CGContext)是一個繪圖畫布,它存放繪圖信息,如顏色,線條寬度和字體。在調(diào)用drawRect:之前,由UIView配置當(dāng)前圖形上下文。UIGraphicsGetCurrentContext函數(shù)返回已經(jīng)為當(dāng)前UIView所配置的圖形上下文。
//獲取當(dāng)前圖形上下文CGContextRef context = UIGraphicsGetCurrentContext();//保存這個上下文,因?yàn)槲覀冃枰舷路D(zhuǎn)它CGContextSaveGState(context); /*通過調(diào)用CGContextRef中的CGContextTranslateCTM函數(shù)把坐標(biāo)原點(diǎn)轉(zhuǎn)換到左下角,該函數(shù)有兩個參數(shù),即水平和垂直方 向的變換數(shù)值。然后使用CGContextScaleCTM函數(shù)顛倒y軸,該函數(shù)有兩個參數(shù),即x軸和y軸的變換比例,第一個參數(shù)為1,保 持x軸不變,而第二個參數(shù)為-1,表示顛倒y軸*/ //向下移動該上下文坐標(biāo)原點(diǎn)CGContextTranslateCTM(context, 0, self.view.bounds.size.height);CGContextScaleCTM(context, 1.0, -1.0); //向上翻轉(zhuǎn)圖像上下文//以剩余時間來創(chuàng)建一個字符串NSString *str = [NSString stringWithFormat:@"Time remaining:%i seconds", timeLeft];//選擇字體為16pt HelveticaCGContextSelectFont(context, "Helvetica", 16, kCGEncodingMacRoman);CGContextSetTextDrawingMode(context, kCGTextFill); //設(shè)置繪制模式//設(shè)置文本顏色為黑色CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0);//轉(zhuǎn)換str為一個C 字符串并顯示它CGContextShowTextAtPoint(context, 10.0, 10.0, [str cStringUsingEncoding:[NSString defaultCStringEncoding]], str.length);CGContextRestoreGState(context); //恢復(fù)上下文//如果炮彈在屏幕上if (cannonballOnScreen) {//創(chuàng)建矩形并在其中繪制炮彈CGRect cannonballRect = CGRectMake(cannonball.x, cannonball.y, CANNON_BASE_RADIUS * 2, CANNON_BASE_RADIUS * 2);UIImage *image = [UIImage imageNamed:@"cannonball80.png"];//繪制圖片到矩形中CGContextDrawImage(context, cannonballRect, image.CGImage);}//繪制加農(nóng)炮炮管//移動加農(nóng)炮底座到視圖中間的位置CGContextMoveToPoint(context, 0 , self.view.frame.size.height / 2);//添加一根到加農(nóng)炮炮管終端的線條CGContextAddLineToPoint(context, barrelEnd.x , barrelEnd.y);CGContextSetLineWidth(context, 20); //設(shè)置線條粗細(xì)CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0); //黑色CGContextStrokePath(context); //繪制線條//為加農(nóng)炮底座創(chuàng)建矩形CGRect cannonBase = CGRectMake(0, self.view.frame.size.height / 2 - CANNON_BASE_RADIUS, CANNON_BASE_RADIUS, CANNON_BASE_RADIUS * 2);//加載加農(nóng)炮底座圖片UIImage *baseImage = [UIImage imageNamed:@"cannon_base.png"];//把加農(nóng)炮底座圖片繪制到矩形中CGContextDrawImage(context, cannonBase, baseImage.CGImage);//在攔截器兩個端點(diǎn)之間添加一根線CGContextMoveToPoint(context, blocker.start.x, blocker.start.y);CGContextAddLineToPoint(context, blocker.end.x, blocker.end.y);CGContextSetLineWidth(context, LINE_WIDTH);CGContextStrokePath(context); //繪制線條//計算目標(biāo)每個分段的長度float pieceLength = (TARGET_END - TARGET_BEGINING) / TARGET_PIECES;//移到目標(biāo)起點(diǎn)CGContextMoveToPoint(context, target.start.x, target.start.y);//繪制每個目標(biāo)分段for (int i = 1; i <= TARGET_PIECES; i++){//相鄰分段以黃、藍(lán)色區(qū)分開if(i % 2 == 0){CGContextSetRGBStrokeColor(context, 1, 1, 0, 1);}else {CGContextSetRGBStrokeColor(context, 0, 0, 0.5, 1);}//移到下一個分段的端點(diǎn)CGContextMoveToPoint(context, target.end.x, target.start.y + pieceLength * (i - 1));//如果這個分段還沒有被擊中if(!targetPieceHit[i - 1]){//為該分段添加一條線CGContextAddLineToPoint(context, target.end.x, target.start.y + pieceLength * i);CGContextStrokePath(context); //繪制分段}}
轉(zhuǎn)載于:https://my.oschina.net/mjRao/blog/71457
總結(jié)
- 上一篇: 关于nginx信号控制的“故障”案例
- 下一篇: Qt下的OpenGL 编程(3)绘制平面