当前位置: 编程技术>移动开发
本页文章导读:
▪NSLog 施用 NSLog 使用
可能你曾经有过Windows编程的经验,通常在你调试程序的时候,如果希望看到某个中间结果,你会习惯使用MessageBox来显示中间的结果。有了Cocoa的NSLog,你在写Cocoa程序的时候,就.........
▪ MTK手机软件系统的索引结构 MTK手机软件系统的目录结构
MTK手机软件系统的主要目录如下所示,一些相对不重要的目录略去。.
|-- Fast_DL
|-- ROM
|-- adaptation
|-- applib
|-- bootloader
|-- config
|-- custom
| |-- app
| | `-- TOP_6227.........
▪ Animation Types-Grouping Animations Animation Types----Grouping Animations
- (id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
CGFloat xInset = 3.0f * (NSWidth(frame) / 8.0f);
CGFloat yInset = 3.0f * (NSHeight(frame) / 8.0f);
.........
[1]NSLog 施用
来源: 互联网 发布时间: 2014-02-18
NSLog 使用
可能你曾经有过Windows编程的经验,通常在你调试程序的时候,如果希望看到某个中间结果,你会习惯使用MessageBox来显示中间的结果。
有了Cocoa的NSLog,你在写Cocoa程序的时候,就可以无需每次都调用NSAlert来观察中间结果了。
NSLog的定义
NSLog定义在NSObjCRuntime.h中,如下所示:
void NSLog(NSString *format, …);
基本上,NSLog很像printf,同样会在console中输出显示结果。不同的是,传递进去的格式化字符是NSString的对象,而不是chat *这种字符串指针。
示例
NSLog可以如下面的方法使用:
NSLog (@"this is a test");
NSLog (@"string is :%@", string);
NSLog (@"x=%d, y=%d", 10, 20);
但是下面的写法是不行的:
int i = 12345;
NSLog( @"%@", i );
原因是, %@需要显示对象,而int i明显不是一个对象,要想正确显示,要写成:
int i = 12345;
NSLog( @"%d", i );
格式
NSLog的格式如下所示:
%@ 对象
%d, %i 整数
%u 无符整形
%f 浮点/双字
%x, %X 二进制整数
%o 八进制整数
%zu size_t
%p 指针
%e 浮点/双字 (科学计算)
%g 浮点/双字
%s C 字符串
%.*s Pascal字符串
%c 字符
%C unichar
%lld 64位长整数(long long)
%llu 无符64位长整数
%Lf 64位双字
可能你曾经有过Windows编程的经验,通常在你调试程序的时候,如果希望看到某个中间结果,你会习惯使用MessageBox来显示中间的结果。
有了Cocoa的NSLog,你在写Cocoa程序的时候,就可以无需每次都调用NSAlert来观察中间结果了。
NSLog的定义
NSLog定义在NSObjCRuntime.h中,如下所示:
void NSLog(NSString *format, …);
基本上,NSLog很像printf,同样会在console中输出显示结果。不同的是,传递进去的格式化字符是NSString的对象,而不是chat *这种字符串指针。
示例
NSLog可以如下面的方法使用:
NSLog (@"this is a test");
NSLog (@"string is :%@", string);
NSLog (@"x=%d, y=%d", 10, 20);
但是下面的写法是不行的:
int i = 12345;
NSLog( @"%@", i );
原因是, %@需要显示对象,而int i明显不是一个对象,要想正确显示,要写成:
int i = 12345;
NSLog( @"%d", i );
格式
NSLog的格式如下所示:
%@ 对象
%d, %i 整数
%u 无符整形
%f 浮点/双字
%x, %X 二进制整数
%o 八进制整数
%zu size_t
%p 指针
%e 浮点/双字 (科学计算)
%g 浮点/双字
%s C 字符串
%.*s Pascal字符串
%c 字符
%C unichar
%lld 64位长整数(long long)
%llu 无符64位长整数
%Lf 64位双字
[2] MTK手机软件系统的索引结构
来源: 互联网 发布时间: 2014-02-18
MTK手机软件系统的目录结构
MTK手机软件系统的主要目录如下所示,一些相对不重要的目录略去。
Fast_DL是开发时下载二进制映像和资源等的相关文件的目录。ROM是固化在ROM(可能是Flash的只读区)中的相关代码和头文件的目录,在给客户的发布版中大都只有一些导出函数的头文件,其中似乎还有一个跳转表的东西ROMSA_FuncTable。
kal是上面所说的内核抽象层的相关文件的目录。nvram是存取NV中的内容的相关代码的目录。nucleus是nucleus实时操作系统的目录,在给客户的发布版中只有头文件。drv是驱动相关的代码的目录。fs是文件系统相关的目录,好像只支持fat格式的。tools是工程相关工具的目录,包括MinGW。interface是系统各层的接口的目录,还包含重要模块的接口,如bluetooth、WIFI。config是一些系统和任务(task)相关头文件的目录,感觉不像是配置相关的目录。inc是中断控制和寄存器地址相关头文件的目录。
modis是PC模拟版的相关目录,包括了虚拟的GSM网络、SIM卡等,以及模拟器需要的字符串、图片等资源,还有PC模拟版的库、VC的相关工程文件。
mmi是一个缺省的空的MMI应用的目录,其中只是创建了一个什么也不干的MMI任务(线程),处理下层发送上来的消息。plutommi是pluto组织(也可能是原本的mmi应用的代号)所写的整套MMI应用所在的目录,而实际上也就是我们需要定制和修改的MMI应用。其中的mmi目录中是pluto原本写好的mmi应用,mtkapp中是mtk后来所写的mmi应用,而Customer中是图片、字符串等资源的定制目录,大部分只是修改了字符串和图片、声音等的项目只要修改这个目录下的资源即可。
mtk_lib中是已经编译链接好的ARM版的库。因整个工程过于庞大,若完整的全新构建一次需要很长的时间。为了减少构建的时间,将一些已经完全调试稳定且基本不再改动的库和MTK不开放源代码的库放到这个目录,这样每次构建时只需要将这些库和其他编译好的库链接起来就可以了。这些库一般是ARM版的,若有thumb版的,则再增加一个和ARM版相对的thumb版的库,一般叫第二个库,如media_sec.lib就是thumb版的多媒体库。
custom是所有客户化项目的驱动程序及系统和MMI应用定制相关的文件的目录。如你的手机主板的RAM、FLASH等存储器的尺寸和地址空间有改动,MMI应用的特性有不同,蓝牙、WAP的配置有变化,或是有项目相关的新应用,其相关文件都是放在这个目录中和特定项目对应的目录下,如项目CUST1_6227,则放在CUST1_6227_BB下。要注意的是custom也作为一个模块存在,这使得其可以通过make目录中的custom模块的四个文件进行客户化的一些定制。
applib、bootloader、init、media、j2me等是这个系统各个层次的相对独立的模块各自的目录,其实drv和fs等目录也可以看成是相对独立的模块,只不过其更重要些而在前面介绍。这些目录包含了这些模块的C文件和头文件。每个目录(模块)都在下面的make目录中有相对应的目录保存构建时的编译链接配置文件。
make是工程构建过程中最重要的一个目录了,工程构建用的Makefile和一些中间配置文件将放在这里,Makefile在讲解构建过程时再具体介绍。在每个模块对应的目录下,都有四个文件控制了编译链接时的过程和配置。分别是:
.def文件中是该模块构建过程中用的条件定义。
.inc文件中是该模块所有用到的头文件所在目录的路径,是相对整个工程根目录的路径。
.lis文件中列出了该模块的所有C文件,其路径也是相对整个工程根目录的。
.pth文件中是该模块的所有C文件所在目录的路径,是相对整个工程根目录的路径。
build目录中保存了构建过程中产生的目标文件和库文件,及其他一些中间文件。
MTK手机软件系统的主要目录如下所示,一些相对不重要的目录略去。
. |-- Fast_DL |-- ROM |-- adaptation |-- applib |-- bootloader |-- config |-- custom | |-- app | | `-- TOP_6227_BB | |-- common | |-- drv | | |-- LCD | | | `-- TOP_6227_LCM | | `-- image_sensor | | `-- MT9D011 |-- drv |-- fs |-- inc |-- init |-- interface |-- j2me |-- kal |-- make | |-- applib | | |-- applib.def | | |-- applib.inc | | |-- applib.lis | | `-- applib.pth | |-- bootloader | |-- config | |-- custom |-- media |-- mmi |-- modis |-- mtk_lib | `-- MT6227 | `-- S01 | `-- gprs | |-- abm.lib | |-- adaptation.lib | |-- applib_inet.lib |-- nucleus |-- nvram |-- plutommi |-- tools
Fast_DL是开发时下载二进制映像和资源等的相关文件的目录。ROM是固化在ROM(可能是Flash的只读区)中的相关代码和头文件的目录,在给客户的发布版中大都只有一些导出函数的头文件,其中似乎还有一个跳转表的东西ROMSA_FuncTable。
kal是上面所说的内核抽象层的相关文件的目录。nvram是存取NV中的内容的相关代码的目录。nucleus是nucleus实时操作系统的目录,在给客户的发布版中只有头文件。drv是驱动相关的代码的目录。fs是文件系统相关的目录,好像只支持fat格式的。tools是工程相关工具的目录,包括MinGW。interface是系统各层的接口的目录,还包含重要模块的接口,如bluetooth、WIFI。config是一些系统和任务(task)相关头文件的目录,感觉不像是配置相关的目录。inc是中断控制和寄存器地址相关头文件的目录。
modis是PC模拟版的相关目录,包括了虚拟的GSM网络、SIM卡等,以及模拟器需要的字符串、图片等资源,还有PC模拟版的库、VC的相关工程文件。
mmi是一个缺省的空的MMI应用的目录,其中只是创建了一个什么也不干的MMI任务(线程),处理下层发送上来的消息。plutommi是pluto组织(也可能是原本的mmi应用的代号)所写的整套MMI应用所在的目录,而实际上也就是我们需要定制和修改的MMI应用。其中的mmi目录中是pluto原本写好的mmi应用,mtkapp中是mtk后来所写的mmi应用,而Customer中是图片、字符串等资源的定制目录,大部分只是修改了字符串和图片、声音等的项目只要修改这个目录下的资源即可。
mtk_lib中是已经编译链接好的ARM版的库。因整个工程过于庞大,若完整的全新构建一次需要很长的时间。为了减少构建的时间,将一些已经完全调试稳定且基本不再改动的库和MTK不开放源代码的库放到这个目录,这样每次构建时只需要将这些库和其他编译好的库链接起来就可以了。这些库一般是ARM版的,若有thumb版的,则再增加一个和ARM版相对的thumb版的库,一般叫第二个库,如media_sec.lib就是thumb版的多媒体库。
custom是所有客户化项目的驱动程序及系统和MMI应用定制相关的文件的目录。如你的手机主板的RAM、FLASH等存储器的尺寸和地址空间有改动,MMI应用的特性有不同,蓝牙、WAP的配置有变化,或是有项目相关的新应用,其相关文件都是放在这个目录中和特定项目对应的目录下,如项目CUST1_6227,则放在CUST1_6227_BB下。要注意的是custom也作为一个模块存在,这使得其可以通过make目录中的custom模块的四个文件进行客户化的一些定制。
applib、bootloader、init、media、j2me等是这个系统各个层次的相对独立的模块各自的目录,其实drv和fs等目录也可以看成是相对独立的模块,只不过其更重要些而在前面介绍。这些目录包含了这些模块的C文件和头文件。每个目录(模块)都在下面的make目录中有相对应的目录保存构建时的编译链接配置文件。
make是工程构建过程中最重要的一个目录了,工程构建用的Makefile和一些中间配置文件将放在这里,Makefile在讲解构建过程时再具体介绍。在每个模块对应的目录下,都有四个文件控制了编译链接时的过程和配置。分别是:
.def文件中是该模块构建过程中用的条件定义。
.inc文件中是该模块所有用到的头文件所在目录的路径,是相对整个工程根目录的路径。
.lis文件中列出了该模块的所有C文件,其路径也是相对整个工程根目录的。
.pth文件中是该模块的所有C文件所在目录的路径,是相对整个工程根目录的路径。
build目录中保存了构建过程中产生的目标文件和库文件,及其他一些中间文件。
[3] Animation Types-Grouping Animations
来源: 互联网 发布时间: 2014-02-18
Animation Types----Grouping Animations
- (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (self) { CGFloat xInset = 3.0f * (NSWidth(frame) / 8.0f); CGFloat yInset = 3.0f * (NSHeight(frame) / 8.0f); NSRect moverFrame = NSInsetRect(frame, xInset, yInset); moverFrame.origin.x = NSMidX([self bounds]) -(NSWidth(moverFrame) / 2.0f); moverFrame.origin.y = NSMidY([self bounds]) -(NSHeight(moverFrame) / 2.0f); mover = [[NSImageView alloc] initWithFrame:moverFrame]; [mover setImageScaling:NSScaleToFit]; [mover setImage:[NSImage imageNamed:@"photo.jpg" ]]; NSDictionary *animations =[NSDictionary dictionaryWithObjectsAndKeys: [self groupAnimation:moverFrame], @"frameRotation" , nil]; [mover setAnimations:animations]; [self addSubview:mover]; } return self; }
- (CAAnimation *)frameAnimation:(NSRect)aniFrame { CAKeyframeAnimation *frameAnimation =[CAKeyframeAnimation animationWithKeyPath:@"frame" ]; NSRect start = aniFrame; NSRect end = NSInsetRect(aniFrame, -NSWidth(start) * 0.50,-NSHeight(start) * 0.50); frameAnimation.values = [NSArray arrayWithObjects:[NSValue valueWithRect:start],[NSValue valueWithRect:end], nil]; return frameAnimation; } - (CABasicAnimation *)rotationAnimation { CABasicAnimation *rotation =[CABasicAnimation animationWithKeyPath:@"frameRotation" ]; rotation.fromValue = [NSNumber numberWithFloat:0.0f]; rotation.toValue = [NSNumber numberWithFloat:45.0f]; return rotation; } - (CAAnimationGroup *)groupAnimation:(NSRect)frame { CAAnimationGroup *group = [CAAnimationGroup animation]; group.animations = [NSArray arrayWithObjects:[self frameAnimation:frame],[self rotationAnimation], nil]; group.duration = 1.0f; group.autoreverses = YES; return group; }
- (BOOL)acceptsFirstResponder { return YES; } - (void)keyDown:(NSEvent *)event { [[mover animator] setFrameRotation:[mover frameRotation]]; }
最新技术文章: