`
cenphoenix
  • 浏览: 161442 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Layer Programming with Quartz Core

阅读更多

《转载》

2009/6/25  我来自恐龙蛋    简称:恐龙蛋 or konglongdan。
请保留我的网名,也是对我劳动的肯定嘛。谢谢,希望这个对你有帮助。

Chapter 5.Layer Programming with Quartz Core
Quartz Core 框架就像是Leopard 桌面的Core Animation。Quartz Core提供了基本的类来管理UIView对象里面的层。这也用于创建二维对象的三维变换,会有惊人的动画和效果。

要使用Quartz Core框架,您将需要添加到您的Xcode项目。右键单击您的项目的框架文件夹,然后选择添加框架。导航到QuartzCore.framework文件夹,然后单击添加。

要找到Quartz Core框架,您可以浏览到或是手动/Developer/Platforms/iPhoneOS.platform或/Developer/Platforms/iPhoneSimulator.platform并找到你的SDK中框架文件夹。

5.1理解层
层是一个低级组件,可以在可显示的类里面找到。层像是铺在一个内容固定对象上的一个片。
他非常灵活的支持在一个对象上显示内容,可在屏幕上弯曲或扭曲内容等许多方面。从UIView衍生的类,每个对象都渲染他自己,他们的内容都是粘合的。


例它可以被当作透明;各有不同的内容,堆叠顶端彼此产生一个综合 的图象。如, UIImageView类包含的所有基本信息的二维图像的显示区域,分解和各项渲染图像的方法。图片本身是粘在父母UIView类的层上,就像在一个图片框架上。大多数最基本的层次表现就像一个单一的纸板,只是介绍了图像原样。层也可以包含多个层,


因为他们是灵活的,可以使用层操纵内容贴在他们上面。该层的类, CALayer ,控制这种灵活的支持,因为它是操纵的显示。如果您弯曲层,图像就和它一起弯曲。如果您旋转层,图像也会随着一起。你可以把层,添加动画,或旋转,扭曲,或 缩放图片。对象坐在上方的层是完全无视它是如何被操纵,从而使您的应用程序继续与显示物体仿佛仍在二维对象。当用户看到的 图像,但是,它已经转化为任何方向的层已被扭到。图层可以改变不仅仅是图像。显示输出的所有其他观点班章中涉及第3章和第10章还剩下最重要的一层。


要访问层,读取UIView类的 layer属性

CALayer *layer = myView.layer;

所有从UIView基础来的对象都继承了这个属性。这意味着你可以转换,缩放,旋转,甚至可以再navigation bars, tables, text boxes,等其它的view类上增加动画。

最重要的是要记住,每个UIView都有一个层,他们控制着他们的内容最终被显示在屏幕上的方式。

层都有一些通用的方法和属性来管理子层和执行渲染。这些方法可以让您“存储”若干不同层次的个别画面,是他们合作,全力为一个合成的屏幕图像。

单个层可以有很多子层。子层可以在最终屏幕渲染的时候被管理和缝合在一起。考虑的第一人称射击游戏。您的游戏可能包括一层负责游戏人物,一个层负责背景,和一个复杂head-up display( HUD ) 。您可能为每一个专门设计一个UIView级和这四个层构成了游戏画面:

UIView *gameView = [ [ UIView alloc ] initWithFrame:
    [ [ UIScreen mainScreen ] applicationFrame ]
];

UIView *backgroundView = [ [ UIView alloc ] initWithFrame...
UIView *characterView = [ [ UIView alloc ] initWithFrame...
UIView *HUDView = [ [ UIView alloc ] initWithFrame...

你可以用CALayer中的addSublayer 方法来在gameView增加每个UIView中的层
#import <QuartzCore/QuartzCore.h>

CALayer *gameLayer = gameView.layer;
[ gameLayer addSublayer: backgroundView.layer ];
[ gameLayer addSublayer: characterView.layer ];
[ gameLayer addSublayer: HUDView.layer ];


当gameView物体在屏幕上显示时,所有三个层将合并渲染。每类负责自己的层,但是当gameLayer被画到屏幕上的时候,所有三个将合并在一起。

该gameView不是可以唯一添加的层。子层可以有自己的子层,这样整个有层次的体系才能被建立。例如,你可以向HUDView增加一个层,来显示HUD的组件。例如一个团队的标志。

UIImageView *teamLogoView = [ [ UIImageView alloc ] initWithImage: myTeamLogo ];
[ HUDView.layer addSublayer: teamLogoView.layer ];


每当HUDView层被渲染的时候,其它的所有层都将被渲染。

5.1.2 大小和位置
要改变一个已经被渲染的层的大小和位置可以设置layer的frame属性。Layer的frame属性在某种情况和windows,view的frame有相似之处。通过接受一个x/y的坐标来改变大小和位置。下面的例子设置teamLogoView层位置(150,100 ),其大小为50x75 :

CGRect teamLogoFrame = CGRectMake(150.0, 100.0, 50.0, 75.0);
teamLogoView.layer.frame = teamLogoFrame;

另外,你可以通过设置position来调整一个层的位置而不改变它的大小。此属性接受CGPoint结构,从而确定在屏幕的什么位置显示。不像frame属性,position属性指定的是层的中间点,而不是左上角了。

CGPoint logoPosition = CGPointMake(75.0, 50.0);
teamLogoView.layer.position = logoPositin;
5.1.3管理和显示
除了增加层,CALayer类提供了一些不同的方法来插入,安排,并移除层。

当你使用addSublayer来添加一个子层的是,在把这个子层添加到父层层结构的最上层。所以它将会显示在任何现有层的上面。使用insertSublayer方法可以再层结构中插入层。

要在一个特殊的索引里面插入层,可以使用atIndex 参数。

[ gameLayer insertSublayer: HUDView.layer atIndex: 1 ];

要在另一个层的上面或者下面插入层,可以使用above 或者 below 参数

[ gameLayer insertSublayer: HUDView.layer below: backgroundView.layer ];
[ gameLayer insertSublayer: HUDView.layer above: characterView.layer ];

要把一个层从父层中删除,可以调用此层的removeFromSuperlayer来删除。

[ HUDView.layer removeFromSuperlayer ];

要用一个不同的层来替换一个已存在的层,可以使用replaceSublayer方法。

[ gameLayer replaceSublayer: backgroundView.layer with: newBackgroundView.layer ];

要把一个层留在父层的层结构中,但是不显示它,可以使用层的hidden属性。你可以使用下面的代码来隐藏HUDView显示的内容,而不用去删除它。

- (void) ToggleHUD {
    HUDView.layer.hidden = (HUDView.layer.hidden == NO) ? YES : NO;
}

5.1.4 渲染

当更新层,改变不能立即显示在屏幕上。这允许你私下对层做大量的修改,而所有的操作都完成时不必立即显示给用户。当所有的层都准备好从画时,可以调用setNeedsDisplay了。

[ gameLayer setNeedsDisplay ];

有时候,可能需要只有重绘的一部分层的内容。重绘整个屏幕可以减缓性能。重绘只有部分的屏幕,需要更新,请使用setNeedsDisplayInRect方法,通过在CGRect结构的区域更新:

CGRect teamLogoFrame = CGRectMake(150.0, 100.0, 50.0, 75.0);
[ gameLayer setNeedsDisplayInRect: teamLogoFrame ];


如果你是用的Core Graphics框架来执行渲染的话,你可以直接渲染Core Graphics的内容。
用renderInContext来做这件事。

CGContextRef myCGContext = UIGraphicsGetCurrentContext();
[ gameLayer renderInContext: myCGContext ];

5.1.5 变换
要在一个层中添加一个3D或仿射变换,可以分别设置层的transform或affineTransform属性,。在这章中,稍后您可以了解更多关于变换:

characterView.layer.transform = CATransform3DMakeScale(-1.0, -1.0, 1.0);

CGAffineTransform transform = CGAffineTransformMakeRotation(45.0);
backgroundView.layer.affineTransform = transform;

5.1.6 层动画
Quartz Core的能力不仅仅粘性层(sticky layer),而且是远远超出粘性层。它可用于用令人惊叹的3D纹理转换一个二维物体,可以用来产生美妙的变换。

第三章介绍了作为一种变换方法,怎样在两个UIView之间变换。你直接在一个层或者子层中应用了变换和动画。正如你还记得,在第3章,动画是为CATransition对象创建的。

层变换是一个实例CATransition类提供了一个方法使用Quartz Core的动画引擎来添加动画。这可以让开发者使用Quartz Core提供的高级3D效果,而不用大量的修改代码。当一个层被应用动画的时候,一个CATransition或CAAnimation对象是附在层上。然后调用Quartz Core来产生一个新线程,来接管动画中所有的图像处理。开发者仅仅需要在增加一个理想的动画来加强层变换的效果。

你可以用以下的例子代码来创建一个变换:

CATransition *animation = [[CATransition alloc] init];
animation.duration = 1.0;
animation.timingFunction = [ CAMediaTimingFunction
    functionWithName: kCAMediaTimingFunctionEaseIn ];
animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromRight;


目前, iPhone的SDK提供了极为有限的变换类型,这些变换可以由用户创建。大约12名额外的变换,如页扭曲和缩放变换,是被Quartz Core框架支持的,但只限于使用在苹果公司自己的应用程序上面。



你可以通过创建一个CABasicAnimation对象来创建一个动画。下面的例子将创建了一个360度旋转层的动画:

CABasicAnimation *animation = [ CABasicAnimation
    animationWithKeyPath: @"transform" ];
animation.toValue = [ NSValue valueWithCATransform3D: CATransform3D
MakeRotation(3.1415, 0, 0, 1.0) ];
animation.duration = 2;
animation.cumulative = YES;
animation.repeatCount = 2;


一旦创建好以后,你就可以直接在层上应用动画或者变换了。

[ teamLogoView.layer addAnimation: animation forKey: @"animation" ];

5.1.7 变形
Quartz Core的渲染能力,使二维图像可以被自由操纵,就好像它是三维。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。CATransform3D的一套方法提供的魔术般的变换都落后于苹果的Cover Flow技术(在第12章)和在iPhone中使用的其他美学效果。

iPhone的支持缩放,旋转,仿射,翻转(translation)的转变,等等。这本书只提供了对层变换的一个介绍。Core Animation 是一个很大的东西,另外有许多关于这一主题的书籍。

Note
欲了解更多有关创建动画的信息,请看Bill Dudney的Core Animation for Mac OS X and the iPhone。

层变换时在独自的曾是执行的,并且允许多变换在多层面上同时发生。Quartz Core框架使用CATransform3D 对象来进行变换。这个对象应用在view的层的上面,来执行弯曲和层的其它操作,从而实现一个理想的3D效果。当它被提交给用户的时候,程序将继续把它当作一个2D对象。下面的例子创建了一个变换,目的是旋转层:

CATransform3D myTransform;
myTransform = CATransform3DMakeRotation(angle, x, y, z);

该CATransform3DMakeRotation函数创建了一个转变,将在三维轴坐标系以任意弧度旋转层。x-y-z轴的有个确定的范围(介于-1 和+1之间) 。相应的坐标轴指定的值告诉系统在该轴上旋转。例如,如果X轴是设置为-1或1 ,该对象将的X轴的方向上旋转,这意味着将把它垂直旋转。把这些值看做是插入在图像每个坐标轴上的秸秆(Think of these values as inserting straws through the image for each axis.)。如果秸秆插过x轴,图像将沿着秸秆垂直旋转。您可以使用坐标轴角度值创建更复杂的旋转。。对于大多数的用途,但是,值介于-1和+1已经足够。

要水平(垂直)旋转45度,您可以使用下面的代码:

myTransform = CATransform3DMakeRotation(0.78, 1.0, 0.0, 0.0);

要在Y轴上旋转相同的值:
myTransform = CATransform3DMakeRotation(0.78, 0.0, 1.0, 0.0);


0.78 ,用在前面的例子,是由角度值经计算转化为弧度值。要把角度值转化为弧度值,可以使用一个简单的公式Mπ/180 。例如, 45π/180 = 45 ( 3.1415 ) / 180 = 0.7853 。如果你打算在你的程序里面一直都用角度值的话,你可以写一个简单的转化方法,以帮助保持您的代码是可以理解的:

double radians(float degrees) {
    return ( degrees * 3.14159265 ) / 180.0;
}

当你创建一个转换的时候,你将要调用这个方法:

myTransform = CATransform3DMakeRotation(radians(45.0), 0.0, 1.0, 0.0);

当变换(transformation)被创建好了以后,应用在你正在操作的层上。CALayer对象提供了一个transform属性来连接转换。层将执行分配给transform属性的转换:

imageView.layer.transform = myTransform;

当对象被显示后,将会显示应用到它的转换效果。在你的代码中,你任然把它当做是个2D对象。但是它根据提供的转换类型来渲染。

5.1.8. BounceDemo: Layer Fun

这个例子将创建两个带有图片的层,两个图片下载自互联网。他们将随后attaches to a view controller,然后他们就很容易通过后来的计时器操作。计时器调整每个层在屏幕上的位置,并增加动画。这段代码是一个良好的,功能引入的好例子。它可以帮助你在你的程序里建立自己的层。如图所示,图5-1 。




你可以编译Example 5.1到Example 5.5所示的代码程序。用SDK创建一个叫BounceDemo的view-based application的工程。如果你想看看一个对象是怎样从零开始被创建的,一定要删除Interface Builder自动生成的代码。

Example 5-1. BouceDemo application delegate prototypes (BounceDemoAppDelegate.h)
#import <UIKit/UIKit.h>

@class BounceDemoViewController;

@interface BounceDemoAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    BounceDemoViewController *viewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet BounceDemoViewController *viewController;

@end

                                          

Example 5-2. BouceDemo application delegate (BounceDemoAppDelegate.m)
#import "BounceDemoAppDelegate.h"
#import "BounceDemoViewController.h"

@implementation BounceDemoAppDelegate

@synthesize window;
@synthesize viewController;


- (void)applicationDidFinishLaunching:(UIApplication *)application {
    CGRect screenBounds = [ [ UIScreen mainScreen ] applicationFrame ];

    self.window = [ [ [ UIWindow alloc ] initWithFrame: screenBounds ]
        autorelease
    ];

    viewController = [ [ BounceDemoViewController alloc ] init ];

    [ window addSubview: viewController.view ];
    [ window makeKeyAndVisible ];
}

- (void)dealloc {
    [ viewController release ];
    [ window release ];
    [ super dealloc ];
}

@end

Example 5-3. BouceDemo view controller prototypes (BounceDemoViewController.h)
#import <UIKit/UIKit.h>

@interface BounceDemoViewController : UIViewController {
    UIImageView *image1, *image2;
    CGPoint directionImage1, directionImage2;
    NSTimer *timer;
}
- (void) handleTimer: (NSTimer *) timer;
@end

Example 5-4. BouceDemo view controller (BounceDemoViewController.m)
#import "BounceDemoViewController.h"
#import <QuartzCore/QuartzCore.h>

@implementation BounceDemoViewController

- (id)init {
    self = [ super init ];
    if (self != nil) {
        UIImage *image;
        NSURL *url;

        url = [ NSURL URLWithString:
               @"http://www.zdziarski.com/demo/1.png" ];
        image = [ UIImage imageWithData: [ NSData dataWithContentsOfURL: url ] ];
        image1 = [ [ UIImageView alloc ] initWithImage: image ];
        directionImage1 = CGPointMake(-1.0, -1.0);
        image1.layer.position = CGPointMake((image.size.width / 2)+1,
                                          (image.size.width / 2)+1);

        url = [ NSURL URLWithString: @"http://www.zdziarski.com/demo/2s.png" ];
        image = [ UIImage imageWithData: [ NSData dataWithContentsOfURL: url ] ];
        image2 = [ [ UIImageView alloc ] initWithImage: image ];
        directionImage2 = CGPointMake(1.0, 1.0);
        image2.layer.position = CGPointMake((image.size.width / 2)+1,
                                          (image.size.width / 2)+1);

        [ self.view.layer addSublayer: image2.layer ];
        [ self.view.layer addSublayer: image1.layer ];
    }
    return self;
}

- (void)loadView {
    [ super loadView ];
}

- (void)viewDidLoad {
    [ super viewDidLoad ];

    timer = [ NSTimer scheduledTimerWithTimeInterval: 0.01
                                              target: self
                                            selector: @selector(handleTimer:)
                                            userInfo: nil
                                             repeats: YES
             ];

    CABasicAnimation *anim1 =
        [ CABasicAnimation animationWithKeyPath: @"transform" ];
    anim1.toValue = [ NSValue valueWithCATransform3D:
        CATransform3DMakeRotation(3.1415, 1.0, 0, 0)
    ];

    anim1.duration = 2;
    anim1.cumulative = YES;
    anim1.repeatCount = 1000;
    [ image1.layer addAnimation: anim1 forKey: @"transformAnimation" ];
}

- (void)didReceiveMemoryWarning {
    [ super didReceiveMemoryWarning ];
}

- (void)dealloc {
    [ timer invalidate ];
    [ image1 release ];
    [ image2 release ];
    [ super dealloc ];
}

- (void) handleTimer: (NSTimer *) timer {
    CGSize size;
    CGPoint origin;

   
    size = [ image1 image ].size;
    if (image1.layer.position.x <=
        ( (size.width / 2) + 1) - self.view.frame.origin.x)
        directionImage1.x = 1.0;
    if (image1.layer.position.x + (size.width / 2) + 1 >=
        (self.view.frame.size.width - self.view.frame.origin.x) - 1)
        directionImage1.x = -1.0;
    if (image1.layer.position.y <=
        ( (size.height / 2) + 1) - self.view.frame.origin.y)
        directionImage1.y = 1.0;
    if (image1.layer.position.y + (size.height / 2) + 1 >=
        (self.view.frame.size.height - self.view.frame.origin.y) - 1)
        directionImage1.y = -1.0;
    origin = image1.layer.position;
    origin.x += directionImage1.x;
    origin.y += directionImage1.y;
    image1.layer.position = origin;

   
    size = [ image2 image ].size;
    if (image2.layer.position.x <=
        ( (size.width / 2) + 1) - self.view.frame.origin.x)
        directionImage2.x = 1.0;
    if (image2.layer.position.x + (size.width / 2) + 1
        >= (self.view.frame.size.width - self.view.frame.origin.x) - 1)
        directionImage2.x = -1.0;
    if (image2.layer.position.y <=
        ( (size.height / 2) + 1) - self.view.frame.origin.y)
        directionImage2.y = 1.0;
    if (image2.layer.position.y + (size.height / 2) + 1 >=
        (self.view.frame.size.height - self.view.frame.origin.y) - 1)
        directionImage2.y = -1.0;
    origin = image2.layer.position;
    origin.x += directionImage2.x;
    origin.y += directionImage2.y;
    image2.layer.position = origin;

    [ self.view setNeedsDisplayInRect: image1.layer.frame ];
    [ self.view setNeedsDisplayInRect: image2.layer.frame ];
}
@end

                                          

Example 5-5. BouceDemo main (main.m)
#import <UIKit/UIKit.h>

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [ [ NSAutoreleasePool alloc ] init ];
    int retVal = UIApplicationMain(argc, argv, nil, @"BounceDemoAppDelegate");
    [ pool release ];
    return retVal;
}

5.1.9.它是怎么运行的:
这里告诉你bounce demo是怎样运行的:

1.当应用程序被加载时,其BounceDemoAppDelegate类获得applicationDidFinishLaunching方法的通知。该方法构造窗口和控制器实例。

2. 视图控制器(view controller)的初始化方法创建两个UIImageView对象并载入从互联网上下载的图像。这些视图对象上的层将作为子层添加到主视图的层上。

3.当视图被加载时,viewDidLoad方法就被调用,并创建一个计时器。计时器的目标, handleTimer ,当每次被调用的时候就调整每个层的位置一个像素,使图像在外观上看起来像是在屏幕是跳动。viewDidLoad还创建了两个动画,一个层垂直翻转和另一个横向翻动。动画被添加到目标对象上,并自动运行。


5.1.10 接下来学习

现在你已经了解了层的操纵和动画,尝试几件事之前:

•        Read up on Core Animation on the Apple Developer Connection website. Change the animations in the project to apply fades, resizes, and other animations.
•        Check out the following prototypes in your SDK's header files: CALayer.h, CAAnimation.h, and CATransform3D.h. You'll find these deep within /Developer/Platforms/iPhoneOS.platform, inside the Quartz Core framework's Headers directory.

分享到:
评论

相关推荐

    Programming with Quartz 2D and PDF Graphics in MacOS

    ### 编程与Quartz 2D及PDF图形在MacOS中的应用 #### 一、Quartz 2D概述 Quartz 2D是苹果公司为...对于那些希望深入了解MacOS图形处理机制的开发者来说,《Programming with Quartz》这本书无疑是一本宝贵的资源。

    Programming with Quartz 2D and PDF Graphics in Mac OS X

    ### 关于《使用Quartz 2D与PDF图形在Mac OS X编程》 #### 引言 本书由苹果公司的开发团队成员撰写,是第一本全面介绍Mac OS X强大的图形系统——Quartz 2D的书籍。它不仅适用于新进开发者,也是资深Mac OS X开发者...

    Programming with Quartz 2D and PDF Graphics in Mac OS X .pdf

    本书名为《Programming with Quartz 2D and PDF Graphics in Mac OS X》,是一本专门介绍如何在Mac OS X系统和iOS系统中使用Quartz 2D绘图和生成PDF文件的详细资料。Quartz 2D是Mac OS X中用于2D图形绘制的核心技术...

    Quartz 2D Programming Guide

    ### Quartz 2D编程指南知识点概述 #### 一、Quartz 2D 概述 - **Quartz 2D** 是苹果公司在Mac OS X和iOS操作系统中提供的一套图形处理框架,它允许开发者创建复杂的二维图形。Quartz 2D 提供了一系列的功能,包括...

    Quartz 2D Programming Guide 2007

    "Quartz 2D Programming Guide 2007"是一份详尽的文档,旨在帮助开发者深入了解并熟练掌握Quartz 2D API,从而在应用程序中实现高质量的图形和图像处理。 Quartz 2D的核心特性包括: 1. **矢量图形**:Quartz 2D...

    iOS UI Design with Quartz Composer and Origami

    标题中提到的“iOS UI Design with Quartz Composer and Origami”揭示了文章将围绕iOS用户界面设计、Quartz Composer和Origami这三个核心内容进行讨论。在描述中,我们了解到文章面向的是iOS应用原型设计的学习者,...

    quartz programming

    标题“quartz programming”与描述“quartz programming manual”指向了Quartz这一强大的开源任务调度框架的深入探讨与实践指南。Quartz作为首个全面的开源作业调度框架,为Java应用程序提供了在特定时间执行任务或...

    quartz-2.1.1 完整源码

    If you aren't yet familiar with Quartz 2.0, you may want to first read What's New In Quartz 2.0. We'd like to express thanks to the community contributors that performed a significant amount of the ...

    Quartz_2D_Programming_Guide.tar

    1. **Core Graphics Framework**: Quartz 2D是基于Core Graphics框架的,它提供了丰富的API来处理2D图形,包括路径、颜色、渐变、阴影、图像和文本。 2. **CGContext**: CGContext是Quartz 2D的核心,它是绘图上...

    Getting_Started_with_Quartz_Scheduler.pdf Version 2.2.1

    ### 关于Quartz Scheduler #### 什么是Quartz Scheduler? Quartz Scheduler是一款功能强大的开源作业调度框架,被广泛应用于Java应用程序中。它能够触发在指定时间运行的作业,并且支持复杂的工作流模式。Quartz ...

    quartz quartz-1.8.6 dbTables 建表sql

    Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。它提供了丰富的API和灵活性,使得开发者可以方便地定义、安排和管理各种任务。版本1.8.6是Quartz的一个稳定版本,它包含了对数据库...

    quartz-1.6.0.jar和quartz-all-1.6.0.jar

    Quartz是Java领域的一款强大的开源任务调度框架,它允许开发者创建和管理定时任务,从而实现应用程序的自动执行功能。在给定的压缩包文件中,我们有两个版本为1.6.0的Quartz JAR包:`quartz-1.6.0.jar`和`quartz-all...

    基于ASP.NET Core和Quartz.Net的后台批量定时任务处理系统设计源码

    本项目是基于ASP.NET Core和Quartz.Net的后台批量定时任务处理系统设计源码,包含3706个文件,其中1476个SVG文件,1334个PNG文件,234个JavaScript文件,227个CSS文件,79个GIF文件,77个C#文件,37个LESS文件,36个...

    Quartz.NET 官方源码及演示例子

    Quartz.NET 是一个开源的作业调度框架,它允许开发者在.NET环境中定义和执行定时任务。这个框架的强大之处在于它的灵活性和可扩展性,使得开发者能够创建复杂的调度逻辑,以满足各种自动化需求。以下是对Quartz.NET...

    quartz-2.2.3版本的quartz初始化sql语句

    Quartz是一款广泛使用的开源任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在Quartz 2.2.3版本中,初始化数据库是使用Quartz的关键步骤,因为Quartz依赖于一个持久化存储来保存作业和触发器的信息...

    quartz2.6.2+Common.Logging.Core+Common.Logging.rar

    在标题中提到的"quartz2.6.2+Common.Logging.Core+Common.Logging.rar",表明这个压缩包包含了Quartz.NET 2.6.2版本,以及两个与日志记录相关的库:Common.Logging.Core和Common.Logging。这些库是.NET开发中的重要...

    quartz创建表sql

    Quartz 是一个开源的作业调度框架,广泛应用于Java企业级应用中,用于自动化任务执行,如定时触发工作流、发送邮件、数据同步等。在Quartz的部署和配置过程中,为了存储作业和触发器的信息,我们需要在关系型数据库...

Global site tag (gtag.js) - Google Analytics