用c/c++编程有些年了,十个指头可以数齐,在涉入iOS objc开发后,有种无比舒服的感觉,尤其在UI开发上。

在QuartzCore.framework下动画和透明窗口等许多效果的事都变得那么方便和自然。因为在windows窗口机制中没有动画和透明窗口(Aero 除外)等效果的引擎层,还有GDI中不支持ARGB,开发中都要依靠不断重复而且大量的BitBlt和Timer来完成,工作量与开发iOS不可比。

大体上就是尝试引入UIKit.framework那样的编程体验。首先要有QuartzCore.framework的CALayer和CATransition,以及objc的NSObject支持。

第一阶段已经完成了下面些基本功能:

NSObject.h,

NSObjectRuntime.h, (obj_class)

NSAutoreleasePool.h,

NSArrary,

CALayer.h,

CGContext.h,

CGAffineTransform.h,

CAAnimation.h,

CoreGraphics.h(CGPoint等的定义)

因为不是objc,runtime中的实现的是obj_class而不是objc_class。

现阶段可以在windows窗口中组建层动画。

代码风格如下:

  1. _testLayer = NSObject::allocT<CATestLayer>();
  2. _testLayer->setFrame(CGRect(.f, .f, .f, .f));
  3. _testLayer->set_backgroundColor(CGColor(CGColor::Pink));
  4. _normalLayer = NSObject::allocT<CALayer>();
  5. _normalLayer->setFrame(CGRect(.f, .f, .f, .f));
  6. _normalLayer->set_backgroundColor(CGColor(CGColor::Pink));
  7. CATestLayer* _testLayer2 = (CATestLayer*) NSObject::allocT<CATestLayer>()->autorelease();
  8. _testLayer2->setFrame(CGRect(.f, .f, .f, .f));
  9. _testLayer2->set_backgroundColor(CGColor(, , ));
  10. _normalLayer->addSublayer(_testLayer2);
  11.  
  12. ::isKindOfClass<CALayer>(_testLayer2);
  13. ::isKindOfClass<NSArray>(_testLayer2);

投递动画:

  1. { _0_autoreleasepool
  2. _normalLayer->setFrame(CGRect(.f, .f, .f, .f));
  3. _normalLayer->setTransform(CGAffineTransform());
  4. ::CAAnimation* anime = CAAnimation::beginAnimating(_normalLayer, .f);
  5. {
  6. anime->setFrame(CGRect(.f, .f, .f, .f));
  7. anime->translate(.f, -.f);
  8. anime->rotate(.f);
  9. anime->commit();
  10. }
  11. _1_autoreleasepool
  12. }

类定义:

  1. class CALayer : public NSObject
  2. {
  3. public:
  4. virtual ~CALayer();
  5. CALayer();
  6.  
  7. void setNeedslayout();
  8. BOOL needsLayout();
  9. void layoutIfNeeded();
  10. virtual void layoutSublayers();
  11.  
  12. void display(CGContext* ctx);
  13. virtual void drawInContext(CGContext* ctx);
  14. void renderInContext(CGContext* ctx);
  15.  
  16. void addSublayer(CALayer* layer);
  17. private:
  18. virtual void applyAnimating();
  19.  
  20. protected:
  21. _0_property_setter01(setFrame, CGRect, frame);
  22. _0_property_setter01(setBounds, CGRect, bounds);
  23. _0_property_setter(setAnchorPoint, CGPoint, anchorPoint);
  24. _0_property_setter(setZPosition, CGFloat, zPosition);
  25. //_0_property_pri_pwi_pti(public:, transform, ;, public:, setTransform, ;, protected:, CGAffineTransform, transform);
  26. _0_property_setter(setTransform, CGAffineTransform, transform);
  27. _0_property_getset(isHidden,setHidden, BOOL, hidden);
  28. _0_property_assign2(setSuperLayer, CALayer*, superLayer);
  29. _0_property_retain2(setSublayers, NSArray*, sublayers);
  30. _0_property_retain2(setMask, CALayer*, mask); // no impl
  31. _0_property_getset(isMaskToBounds, setMaskToBounds, BOOL, maskToBounds); // no impl
  32. #ifdef CALAYER_IMPL_CONTENTS
  33. NSObject* _contents; // no impl
  34. CGRect _contentRect;
  35. NSString* _contentsGravity;
  36. CGFloat _contentScale;
  37. CGFloat _contentConter;
  38. #endif
  39. _0_property_getset(isOpaque, setOpaque, BOOL, opaque);
  40. _0_property_getter(isNeedsDisplayOnBoundsChange, BOOL, needsDisplayOnBoundsChange);
  41. _0_property_getter(isDrawsAsynchronously, BOOL, drawsAsynchronously); // no impl
  42. _0_property(CGColor, backgroundColor);
  43. _0_property(CGColor, cornerRadius);
  44. _0_property(CGFloat, borderWidth);
  45. _0_property(CGColor, borderColor);
  46. _0_property(CGFloat, opacity);
  47. _0_property_setter(isAllowsGroupOpacity, BOOL, allowsGroupOpacity);
  48. _0_property_retain2(setFilters, NSArray*, filters);
  49. _0_property_retain2(setBackgroundFilters, NSArray*, backgroundFilters);
  50. _0_property_setter(isShouldRasterize, BOOL, shouldRasterize);
  51. _0_property(CGFloat, rasterizationScale);
  52. _0_property(CGColor, shadowColor);
  53. _0_property(CGFloat, shadowOpacity);
  54. _0_property(CGFloat, shadowRadius);

1.由NSObject继承下来的类不能显式调用new, delete。必须通过模板NSObject::allocTx<typename T>(...)来分配对象,以及release()或autorelease()成员函数来释放。但是由于不是采用COM接口方式(接口和实现完全分离,工厂类构建对象返回接口),没有办法防止在局部和全局中构建对象。

2.支持autorelease(),以及局部范围内的autorelease()。

3.支持仿射变换,子层model变换坐标。

4.支持isKindOfClass方法,可以帮助按正确类型访问NSArray等容器中元素。

5.支持层与层之间的opaque,以及ARGB颜色。

下一阶段准备要引入UIView和UIViewController, FisrtResponder这些概念。完成一些像NSString, NSDictionary等基本功能类。

ps: 代码中_0_property_xxx是自动完成getter和setter的宏,因为宏定义不允许使用字母"@"只好用"_0_"来代替。

  时下像迅雷的UI开发库已经很多很好,本作只是兴趣和用于个人功底自我修炼。

ps@20200508:

构思阶段的代码在 https://github.com/bbqz007/xw

自己用引擎做了两个demo

1. 各种层动画效果示例

2. 仿QQ管家悬浮窗口

构思一个在windows下仿objc基于动画层ui编程的ui引擎的更多相关文章

  1. 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)

    相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...

  2. [开源项目]Shell4Win,一个在Windows下执行shell命令的解释器

    背景 顺利拿到心目中的理想offer之后,心里的负担一下减轻了很多,希望利用还没毕业之前这段难得的悠闲时间做一点有意义的事情.于是希望能做一个长久以来都想做的开源项目,就是题中提到的Windows下的 ...

  3. windows下实现win32俄罗斯方块练手,编程的几点心得

    编程珠玑2阅读笔记: 1.使用c语言性能监视器,完成对代码的调优工作 2.关联数组:  拓扑排序算法,可以用于当存在遮挡的时候决定三维场景的绘制顺序. 3.小型算法中的测试与调试工具 脚手架程序:&l ...

  4. 记Windows下初次使用dev C++进行socket编程过程

    记初次接触socket编程,在devC++使用Winsock进行socket编程的一个过程,通过在devC++创建2个项目分别是server.client程序项目,感受通过socket使client与 ...

  5. windows下自制动画层引擎 - 放两个demo

    一年前想写一个像cocoa那样,可以方便层动画开发的引擎,写着写着又逆向它的QuartzCore.framework,也就是CoreAnimation的底层,已经大半年没有搞windows这个引擎.大 ...

  6. winsock教程- windows下的socket编程(c语言实现)

    winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程     这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...

  7. windows下安装swoole。

    服务器是用了Linux环境,所以安装swoole的过程只要看看文档就好了. 由于编写代码环境是在windows上,需要在windows上安装swoole.以便测试. 好了废话不多说,我们看官网文档解决 ...

  8. 如何在Windows下用cpu模式跑通py-faster-rcnn 的demo.py

    关键字:Windows.cpu模式.Python.faster-rcnn.demo.py 声明:本篇blog暂时未经二次实践验证,主要以本人第一次配置过程的经验写成.计划在7月底回家去电脑城借台机子试 ...

  9. windows下用wubi快速安装ubuntu

    由于开发需要,我们可能要用到ubuntu,然而又不能完全抛弃windows,于是双系统是个不错选择. wubi是一个在windows下快速安装ubuntu双系统的工具,它包含在ubuntu 12及以前 ...

随机推荐

  1. Spring Boot项目中如何定制拦截器

    本文首发于个人网站:Spring Boot项目中如何定制拦截器 Servlet 过滤器属于Servlet API,和Spring关系不大.除了使用过滤器包装web请求,Spring MVC还提供Han ...

  2. mysql数据库limit分页,排序操作

    看到网上很多朋友在问,limit分页之后按照字段属性排序的问题,在这里分享一下我的用法: 1.网上答案: 每页显示5个,显示第三页信息,按照年龄从小到大排序 select * from student ...

  3. 你不知道的DIV+CSS的命名规则

    搜索引擎优化(seo)有很多工作要做,其中对代码的优化是一个很关键的步骤.为了更加符合SEO的规范,下面是目前比较好的CSS+DIV的命名规则 1DIV CLASS或者ID 页头:header 登录条 ...

  4. 百万年薪python之路 -- MySQL数据库之 Navicat工具和pymysql模块

    一. IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具,我们使用Navicat工具,这个工具本质上就是一个socket客户端,可视化的连接 ...

  5. webpack 4 移除 CommonsChunkPlugin,取而代之的是两个新的配置项(optimization.splitChunks 和 optimization.runtimeChunk

    默认方式 webpack模式模式现在已经做了一些通用性优化,适用于多数使用者. 需要注意的是:默认模式只影响按需(on-demand)加载的代码块(chunk),因为改变初始代码块会影响声明在HTML ...

  6. 轻量级CNN模型mobilenet v1

    mobilenet v1 论文解读 论文地址:https://arxiv.org/abs/1704.04861 核心思想就是通过depthwise conv替代普通conv. 有关depthwise ...

  7. 你好,Go语言

    本文是「vangoleo的Go语言学习笔记」系列文章之一. 官网: http://www.vangoleo.com/go/hello-golang/ 我在2015年第一次接触Go语言,完成了Hello ...

  8. Text 尺寸获取

    获取text在当前文本内容下应该尺寸: 宽度:text.preferredWidth 高度:text.preferredHeight

  9. linux sqlite安装

    wget http://www.sqlite.org/sqlite-3.6.16.tar.gz tar -zxvf sqlite-3.6.16.tar.gz  cd sqlite-3.6.16 ./c ...

  10. 深入理解.NET Core的基元(二) - 共享框架

    原文:Deep-dive into .NET Core primitives, part 2: the shared framework 作者:Nate McMaster 译文:深入理解.NET Co ...