构思一个在windows下仿objc基于动画层ui编程的ui引擎
用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窗口中组建层动画。
代码风格如下:
_testLayer = NSObject::allocT<CATestLayer>();
_testLayer->setFrame(CGRect(.f, .f, .f, .f));
_testLayer->set_backgroundColor(CGColor(CGColor::Pink));
_normalLayer = NSObject::allocT<CALayer>();
_normalLayer->setFrame(CGRect(.f, .f, .f, .f));
_normalLayer->set_backgroundColor(CGColor(CGColor::Pink));
CATestLayer* _testLayer2 = (CATestLayer*) NSObject::allocT<CATestLayer>()->autorelease();
_testLayer2->setFrame(CGRect(.f, .f, .f, .f));
_testLayer2->set_backgroundColor(CGColor(, , ));
_normalLayer->addSublayer(_testLayer2); ::isKindOfClass<CALayer>(_testLayer2);
::isKindOfClass<NSArray>(_testLayer2);
投递动画:
{ _0_autoreleasepool
_normalLayer->setFrame(CGRect(.f, .f, .f, .f));
_normalLayer->setTransform(CGAffineTransform());
::CAAnimation* anime = CAAnimation::beginAnimating(_normalLayer, .f);
{
anime->setFrame(CGRect(.f, .f, .f, .f));
anime->translate(.f, -.f);
anime->rotate(.f);
anime->commit();
}
_1_autoreleasepool
}
类定义:
class CALayer : public NSObject
{
public:
virtual ~CALayer();
CALayer(); void setNeedslayout();
BOOL needsLayout();
void layoutIfNeeded();
virtual void layoutSublayers(); void display(CGContext* ctx);
virtual void drawInContext(CGContext* ctx);
void renderInContext(CGContext* ctx); void addSublayer(CALayer* layer);
private:
virtual void applyAnimating(); protected:
_0_property_setter01(setFrame, CGRect, frame);
_0_property_setter01(setBounds, CGRect, bounds);
_0_property_setter(setAnchorPoint, CGPoint, anchorPoint);
_0_property_setter(setZPosition, CGFloat, zPosition);
//_0_property_pri_pwi_pti(public:, transform, ;, public:, setTransform, ;, protected:, CGAffineTransform, transform);
_0_property_setter(setTransform, CGAffineTransform, transform);
_0_property_getset(isHidden,setHidden, BOOL, hidden);
_0_property_assign2(setSuperLayer, CALayer*, superLayer);
_0_property_retain2(setSublayers, NSArray*, sublayers);
_0_property_retain2(setMask, CALayer*, mask); // no impl
_0_property_getset(isMaskToBounds, setMaskToBounds, BOOL, maskToBounds); // no impl
#ifdef CALAYER_IMPL_CONTENTS
NSObject* _contents; // no impl
CGRect _contentRect;
NSString* _contentsGravity;
CGFloat _contentScale;
CGFloat _contentConter;
#endif
_0_property_getset(isOpaque, setOpaque, BOOL, opaque);
_0_property_getter(isNeedsDisplayOnBoundsChange, BOOL, needsDisplayOnBoundsChange);
_0_property_getter(isDrawsAsynchronously, BOOL, drawsAsynchronously); // no impl
_0_property(CGColor, backgroundColor);
_0_property(CGColor, cornerRadius);
_0_property(CGFloat, borderWidth);
_0_property(CGColor, borderColor);
_0_property(CGFloat, opacity);
_0_property_setter(isAllowsGroupOpacity, BOOL, allowsGroupOpacity);
_0_property_retain2(setFilters, NSArray*, filters);
_0_property_retain2(setBackgroundFilters, NSArray*, backgroundFilters);
_0_property_setter(isShouldRasterize, BOOL, shouldRasterize);
_0_property(CGFloat, rasterizationScale);
_0_property(CGColor, shadowColor);
_0_property(CGFloat, shadowOpacity);
_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引擎的更多相关文章
- 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一)
相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常用 Gulp 插件汇总 ...
- [开源项目]Shell4Win,一个在Windows下执行shell命令的解释器
背景 顺利拿到心目中的理想offer之后,心里的负担一下减轻了很多,希望利用还没毕业之前这段难得的悠闲时间做一点有意义的事情.于是希望能做一个长久以来都想做的开源项目,就是题中提到的Windows下的 ...
- windows下实现win32俄罗斯方块练手,编程的几点心得
编程珠玑2阅读笔记: 1.使用c语言性能监视器,完成对代码的调优工作 2.关联数组: 拓扑排序算法,可以用于当存在遮挡的时候决定三维场景的绘制顺序. 3.小型算法中的测试与调试工具 脚手架程序:&l ...
- 记Windows下初次使用dev C++进行socket编程过程
记初次接触socket编程,在devC++使用Winsock进行socket编程的一个过程,通过在devC++创建2个项目分别是server.client程序项目,感受通过socket使client与 ...
- windows下自制动画层引擎 - 放两个demo
一年前想写一个像cocoa那样,可以方便层动画开发的引擎,写着写着又逆向它的QuartzCore.framework,也就是CoreAnimation的底层,已经大半年没有搞windows这个引擎.大 ...
- winsock教程- windows下的socket编程(c语言实现)
winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程 这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...
- windows下安装swoole。
服务器是用了Linux环境,所以安装swoole的过程只要看看文档就好了. 由于编写代码环境是在windows上,需要在windows上安装swoole.以便测试. 好了废话不多说,我们看官网文档解决 ...
- 如何在Windows下用cpu模式跑通py-faster-rcnn 的demo.py
关键字:Windows.cpu模式.Python.faster-rcnn.demo.py 声明:本篇blog暂时未经二次实践验证,主要以本人第一次配置过程的经验写成.计划在7月底回家去电脑城借台机子试 ...
- windows下用wubi快速安装ubuntu
由于开发需要,我们可能要用到ubuntu,然而又不能完全抛弃windows,于是双系统是个不错选择. wubi是一个在windows下快速安装ubuntu双系统的工具,它包含在ubuntu 12及以前 ...
随机推荐
- TensorFlow2.0(9):TensorBoard可视化
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- Centos7.4环境下搭建Python开发环境(虚拟机安装+python安装+pycharm安装)
目录 一.安装 Centos7.4虚拟机 二.安装 python3.6.7 三.安装 pycharm 一般情况下,大家都是在 Windows平台下进行 Python开发,软件安装和环境搭建都非常&qu ...
- pycharm(社区版2019.1版本)打开README.md文件卡死解决办法
现象:pycharm(社区版2019.1版本)打开README.md文件卡死 解决办法: 将插件Markdown support前的勾选√去掉,保存修改后重启pycharm即可
- mongodb学习笔记系列一
一.简介和安装 ./bin/mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017 mongodb非常 ...
- ESP8266开发之旅 基础篇① 走进ESP8266的世界
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- LHH的acm奋斗史,至强的精神(转载)
还记得2年前的一个晚上,我和一个女孩一起写完了这篇文章.写完后,她哭了,我笑了.然后,她走了,我哭了.2年后,我又找到她,这次,我没有让她走掉,她成了我的新娘. 不知道什么时候,开始知道ACM:也不知 ...
- Leetcode Tags(8)Binary Search
一.475. Heaters 输入: [1,2,3],[2] 输出: 1 解释: 仅在位置2上有一个供暖器.如果我们将加热半径设为1,那么所有房屋就都能得到供暖. 输入: [1,2,3,4],[1,4 ...
- Java多线程编程(五)定时器Timer
一.定时器Timer的使用 在JDK库中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务.Timer类的主要作用就是设置计划任务,但封装任务的类确实TimerTask类,执行计 ...
- Golang的安装和编译
一.下载安装(Ubuntu16.04) 1.下载地址:https://golang.google.cn/dl/ 2.下载Linux版本的安装包go1.10.3.linux-amd64.tar.gz并复 ...
- 使用VS2013操作MYSQL8 (ADO.NET方式 & EF6)
今天有时间测试了一下通过.net环境操作MYSQL数据库,测试过程及结果记录如下: 1.MYSQL安装 (1)我是从MYSQL官网下载的最新版,即MYSQL8.0,在MySql官网的下载页面,找到“M ...