An Introduction to Degrafa

本文介绍Degrafa——一种声明式图形框架,旨在提供静态和动态图形的最佳组合。通过使用MXML标记,开发者可以轻松创建复杂的图形效果,如填充、描边、形状等。文章还提供了如何将Degrafa集成到Flex或AIR项目中的指导。

原文链接:http://www.insideria.com/2008/05/an-introduction-to-degrafa-1.html

 

One of the most important aspects of delivering a rich user experience is what a user sees and interacts with on the screen. Graphics, whether static or dynamic, comprise the face of an application. Static graphics can definitely suffice for creating the necessary visual parts of an application, but to change them you must replace them with other static graphics. Dynamic graphics, created with programmatic drawing are very powerful because it can be manipulated at run-time, but it can involve more advanced knowledge of the Drawing API. Degrafa is a declarative graphics framework that aims to offer the best of both worlds.

In this article you will be introduced to some of the theory behind Degrafa, the basics of composition, advanced implementations, and how the framework may fit into your Flex or AIR projects. There are many uses for Degrafa, all of which can’t be covered in this article, but the hope is that this information may reveal something useful for you.

Degrafa is an open-source project created by developers in the RIA community. One of the primary goals is to allow designers and developers to forego the complexities of ActionScript to create dynamic graphics in MXML markup. With Degrafa you can define fills, strokes, shapes, complex paths, and more in the same way you would define a Flex component in MXML. Degrafa can be used to create skins, data visualizations, maps, or meet any other graphics need.


Some of the features of Degrafa include:


• A library of pre-composed shapes for you to use as well as the ability to create your own.
• Use SVG path data to create complete reusable shapes.
• Flexible options for fills and strokes.
• Binding of properties for Fills, Strokes and Geometry.
• Advanced CSS support for layered backgrounds, complex border control and background image positioning based on CSS 3.
• Productive features like derivatives, composition reuse, shape libraries, repeaters, and other utilities that allow you to do more with less code.
• Light weight model-based architecture.
• Compatibility with Flex 2 and Flex 3.
• A "pay-as-you-go" implementation.
• Much, much more...


Terminology
In the following examples there will be terminology used that you may or may not be familiar with. Some terms revolve around graphics, Flex, or the tags used in Degrafa. Before you get started, here's some definitions of some of those terms you'll see used in the remainder of this article:

geometry - A general term referring to any shape, path or graphic.

graphics context - A drawing destination where vector drawing commands can occur and stores information on how commands get rendered like line styles or fill styles. Any objects derived from Shape, Sprite or Movie Clip have a graphics property. Anything visual is drawn to or stored within a graphics context.

graphicsTarget - A property available to Degrafa geometry, like Circle, RegularRectangle, Polygon, etc. It allows you to specify the target(s) as a destination for Degrafa to render to. Acceptable targets must have a graphics context.

Surface - A tag in Degrafa provided as a base UIComponent for composing Degrafa elements.

GeometryGroup - A tag is used within the Surface tag and allows you to group Degrafa objects together. GeometryGroup is based on Sprite, so you can take advantage of the properties and events supported by Sprite.

GeometryComposition - A Degrafa tag that works similarly to GeometryGroup, but it allows you to compose or group elements at any level within your MXML file, including the root. You can optionally render those graphics to any object containing a graphics property using the graphicsTarget property.

Fill - A fill is a graphics term for the treatment of the inner area of an object. Fills are applied to the shapes you create. Degrafa has a variety of fills you can take advantage of like Solid, Linear Gradient, Radial Gradient, Bitmap, Blend and Complex fills.

Stroke - A stroke is a graphics term for the treatment of the edge of an object, usually defined with a thickness. Degrafa provides Solid, Linear Gradient and Radial Gradients strokes.


Getting Started with Degrafa
To use Degrafa in your projects you have two options; you can either download the latest version of Degrafa as a compiled SWC, or tap in directly to the Degrafa SVN. Both of these options are hosted openly on

Google Code . For the purposes of this article you can use the compiled Degrafa SWC by following these steps:


1. Go to Google Code where the Degrafa code is hosted and download the latest version of the Degrafa SWC for the version of Flex you’re running. There is a version for Flex 2 and Flex 3. After you’ve downloaded the Degrafa SWC, open up Flex Builder and create a new project called DegrafaExample.

2. Once you’ve created your new Flex project, you need to drop the Degrafa SWC you just downloaded into the libs folder.

3. For the sake of keeping things clean in your MXML you can add a Degrafa XML namespace in the root MXML tag where you’ll be using Degrafa. For example, adding the Degrafa namespace in the Application tag of DegrafaExample.mxml could look like this:

Google Code. For the purposes of this article you can use the compiled Degrafa SWC by following these steps:


1. Go to Google Code where the Degrafa code is hosted and download the latest version of the Degrafa SWC for the version of Flex you’re running. There is a version for Flex 2 and Flex 3. After you’ve downloaded the Degrafa SWC, open up Flex Builder and create a new project called DegrafaExample.

2. Once you’ve created your new Flex project, you need to drop the Degrafa SWC you just downloaded into the libs folder.

3. For the sake of keeping things clean in your MXML you can add a Degrafa XML namespace in the root MXML tag where you’ll be using Degrafa. For example, adding the Degrafa namespace in the Application tag of DegrafaExample.mxml could look like this:

 

<?xml version="1.0" encoding="utf-8"?>
<mx:Application    
      xmlns:mx="http://www.adobe.com/2006/mxml"
      xmlns:Degrafa="http://www.degrafa.com/2007"    
      layout="absolute">     
</mx:Application>

The Basics of Composition By following those steps you can now access any of the Degrafa MXML tags for creating your graphics. Before you do though, there are a few fundamentals you’ll want to keep in mind when composing graphics. The following steps expose some of these fundamentals and walks through the basics of creating graphics with Degrafa resulting in a final composition of a single white Circle shown in Figure 1 and viewable here.

Figure 1 - Basic Circle

 

 

Figure 1 - Basic Circle
1. Graphic objects defined with Degrafa are drawn by a series of commands that require an object to be rendered upon. To define this you can either use a Degrafa GeometryGroup tag within a Surface tag, like this:

<Degrafa:Surface>    

    <Degrafa:GeometryGroup>        

    <!-- Add Degrafa Shapes Here -->    

    </Degrafa:GeometryGroup>

</Degrafa:Surface>

The Degrafa Surface tag is a UIComponent, which means you can set properties like verticalCenter, horizontalCenter, etc. and the GeometryGroup tag is a Sprite, which has fewer properties than UIComponent.

2. The other option you have for specifying an area to draw Degrafa graphics to is to use the graphicsTarget property with a GeometryComposition or other geometry tag like Circle, RegularRectangle, etc. This will allow you to define graphic objects outside of the component and target any graphics context, i.e., any component that accepts graphics, like a Canvas, Button, Image, etc. This will be the method used in this basic example.

3. Add a Canvas in the application MXML and give it an id of myCanvas. Also, add a GeometryComposition and specify myCanvas in the graphicsTarget property like this:

<Degrafa:GeometryComposition    

    graphicsTarget="{[ myCanvas ]}">    

    <!-- Add Degrafa Shapes Here -->

</Degrafa:GeometryComposition>    

<mx:Canvas   

    id="myCanvas"/>

4. Once you’ve specified the graphics context you want to draw to you can start drawing Degrafa geometry. There are a number of pre-created Degrafa geometry objects that you can use to create your compositions, like Circle, RegularRectangle, Path, LineRepeater, and more. These objects can be drawn within a GeometryGroup, GeometryComposition, or by themselves using the graphicsTarget property. For this example, add a Circle within the GeometryComposition:

<Degrafa:GeometryComposition    

    graphicsTarget="{[ myCanvas ]}">    

    <Degrafa:Circle         

        radius="100"        

        centerX="120"        

        centerY="120"/>

</Degrafa:GeometryComposition>     

<mx:Canvas    

    id="myCanvas"/>

5. That last bit of MXML draws a Circle, but you can’t see it because it needs to have a fill or stroke applied to it. Degrafa comes with a number of fill and stroke capabilities that are sure to meet the majority of your needs. There are Solid, Linear Gradient, Radial Gradient, Blend, and Complex Fills. Stroke types include Solid, Linear Gradient, and Radial Gradient options. To get the Circle in this example to show up you can apply a SolidFill within the Circle like this:

<Degrafa:GeometryComposition    

    graphicsTarget="{[ myCanvas ]}">    

    <Degrafa:Circle        

        radius="100"        

        centerX="120"        

        centerY="120" >        

        <Degrafa:fill>            

            <Degrafa:SolidFill                

                color="#FFF"/>        

        </Degrafa:fill>    

    </Degrafa:Circle>

</Degrafa:GeometryComposition>     

<mx:Canvas    

    id="myCanvas"/>

Note: With the binding features of Degrafa you can also specify Fills and Strokes outside of geometry and assign the fill or stroke by referencing its id. This is a great way to repurpose fills and strokes across geometry objects. The following MXML snippet shows the same fill used above, but pulled outside of the Circle tag and assigned using the fill’s id of myFill:

<Degrafa:fills>    

    <Degrafa:SolidFill        

        id="myFill"        

        color="#FFF"/>

</Degrafa:fill>

 

<Degrafa:Circle    

    radius="100"    

    centerX="120"    

    centerY="120"    

    fill="{myFill}"/>

View the final product or view the source.

Thoughts on Binding
One of the features I use the most in Degrafa is binding. Binding means creating a relationship between two properties such that when one updates the other is dynamically updated. This can be a very powerful feature when you think about binding properties like width, height, radius, fill, stroke, etc. between geometry objects to create some very dynamic relationships for a variety of purposes.

A simple example would be binding the angle of a LinearGradientFill to a HorizontalSlider so that the angle of the gradient would change dynamically based on the updated value of the slider (don’t forget to set live dragging on the slider). A more complex example would be a list of items whose backgrounds change based on dynamic data.

When you start to think of all the data you could use to influence graphics drawn with Degrafa it seems the possibilities are endless; interfaces that change based on cursor coordinates, buttons that change at different stages in a process, icons that change based on time of day, and charts that change shape based on new data. All it takes is a little experimentation with your own data sets, various public APIs, and user input. With binding in Degrafa you’ll start to see opportunities to create dynamic graphics in Flex.

A More Advanced Implementation

Now that we’ve covered some of the capabilities of Degrafa and the basics of composing graphics, let’s take a look at more involved example. The following steps will walk through creating a Flex Clock (Figure 2) to illustrate some of the features of Degrafa mentioned throughout this article and create a more advanced graphics composition. You can see the final product
here.

 

Figure 1 - Flex Clock

Figure 1 - Flex Clock


1. To get started, create a new Flex application within your DegrafaExample folder and name it FlexClock.mxml. For convenience, add the same XML namespace mentioned in the previous example to your Application tag:

xmlns:Degrafa="http://www.degrafa.com/2007"

2. For this example, you’ll be composing the different parts of the Flex Clock as GeometryGroups to take advantage of some of the properties of Sprite, like rotation for the clock hands.

The first thing you need to do is set up the Surface tag so you can start adding the parts of the clock as GeometryGroups. Set the x and y of the Surface to 100 to position the clock within your application.

3. Add a GeometryGroup tag within the Surface tag and give it an id of clockFace. Within this GeometryGroup you’ll create the face of the clock, which is made up of the dark gradient background and letters “Fx”.

To create the dark grey face of the clock you can use a RegularRectangle object inside the clockFace GeometryGroup. Set the height and width of the RegularRectangle to 360. You also need to create that dark grey radial gradient fill for the RegularRectangle, but at this point the clockFace MXML should look like this:

<Degrafa:GeometryGroup    

    id="clockFace">    

    <Degrafa:RegularRectangle        

        width="300"        

        height="300"/>

</Degrafa:GeometryGroup>


4. Outside the clockFace GeometryGroup, create a new fills tag. Within that fills tag, add a RadialGradientFill tag and set the cx property to 40, cy to 20, radius to 440 and give it an id of greyRadFill. The last thing you need to do to finish this fill is assign gradient stops within the fill.

Gradient stops are the attributes that make up a gradient and have their own set of properties, including color, alpha, and ratio. In Degrafa, you use a GradientStop tag to create a gradient stop within a radial or linear gradient fill. You can set as many gradient stops as you need to get the desired effect you’re looking for. For the purposes of this example, just create two gradient stops. Give the first gradient stop a color of #444 and the second a color of #000.

Note: You may have noticed that the colors for the gradient stops were defined using three digits rather than the six that Flex normally requires. This is similar to what is doable in HTML and another feature of Degrafa. In fact, you have several options for specifying colors within the color property. You can specify a color with a HEX value (#666), RGB value (60,60,60), color key (grey), or CMYK (0,0,0,60).

5. Now that you’ve created the dark grey fill, it must be applied to the RegularRectangle you created earlier. As mentioned previously in this article, you can apply a fill to an object using the fill property. The MXML for the RegularRectangle and RadialGradientFill should look like this:

<Degrafa:fills>    

    <Degrafa:RadialGradientFill        

        id="greyRadFill"        

        cx="40"        

        cy="20"        

        radius="340">        

        <Degrafa:GradientStop           

            color="#444"/>        

        <Degrafa:GradientStop            

            color="#000"/>    

    </Degrafa:RadialGradientFill>

</Degrafa:fills>     

<Degrafa:GeometryGroup    

    id="clockFace">   

    <Degrafa:RegularRectangle        

        width="300"        

        height="300"        

        fill="{ greyRadFill }"/>

</Degrafa:GeometryGroup>

6. If you run your application you should see the RegularRectangle you created filled with a dark grey radial gradient. There’s the base for the clock face.

Now you can create the remainder of the fills and strokes up front for the other elements of the clock and apply them as you go. You need to create a solid white fill for the “Fx” letters, a 10 pixel solid red stroke for the hour and minute hands, and a 2 pixel light grey stroke for the second hand. The fills tag has already been specified, but you need to add a strokes tag as well. Adding these new fills and strokes to the greyGradFill you already created should look like this in your MXML:

<Degrafa:fills>    

    <Degrafa:RadialGradientFill        

        id="greyRadFill"        

        cx="40"        

        cy="20"        

        radius="340">        

    <Degrafa:GradientStop             

        color="#444"/>        

    <Degrafa:GradientStop            

        color="#000"/>    

    </Degrafa:RadialGradientFill>    

    <Degrafa:SolidFill       

         id="whiteFill"        

        color="#FFF"/>

</Degrafa:fills>          

<Degrafa:strokes>    

    <Degrafa:SolidStroke        

        id="redStroke"        

        color="#C50"        

        weight="10"        

        caps="none"/>    

    <Degrafa:SolidStroke        

        id="greyStroke"        

        color="#666"        

        weight="2"        

        caps="none"/>

</Degrafa:strokes>


Note: You could expose Fill and Stroke properties to a designer to allow for customization without having them get involved with code.

7. With all the fills and strokes you’ll need for this example created, let’s add the remaining parts of the clock. You already have the dark grey background created, so now you need to finish the clock face and add the “Fx” letters. For these letters you will use a Polygon tag within the clockFace GeometryGroup.

For the “F” create a Polygon tag within the clockFace and assign whiteFill to the fill property. A Polygon takes shape by specifying a series of points, so rather than completely ending the Polygon tag, close it and set a points tag within. To specify the individual points, use a GraphicPoint tag for each point and specify the x and y values for each point. Instead of making you figure out the points to define the “F” I’ve defined them in the MXML block below along with the MXML for the “x”:

 

<!-- The White "F" Polygon -->

<Degrafa:Polygon    

    x="74"    

    y="90"    

    fill="{ whiteFill }">    

<Degrafa:points>       

    <Degrafa:GraphicPoint            

        x="1.716"           

        y=".868"/>         

    <Degrafa:GraphicPoint            

        x="91.638"            

        y=".868"/>        

    <Degrafa:GraphicPoint            

        x="92.329"            

        y="21.965"/>        

    <Degrafa:GraphicPoint            

        x="30.768"            

        y="21.965"/>        

    <Degrafa:GraphicPoint            

        x="30.768"            

        y="71.768"/>        

    <Degrafa:GraphicPoint            

        x="85.758"            

        y="71.768"/>        

    <Degrafa:GraphicPoint            

        x="85.758"            

        y="95.632"/>        

    <Degrafa:GraphicPoint            

        x="30.768"            

        y="95.632"/>        

    <Degrafa:GraphicPoint            

        x="30.768"            

        y="164.11"/>        

    <Degrafa:GraphicPoint            

        x="1.37"            

        y="164.11"/>    

    </Degrafa:points>

</Degrafa:Polygon>

<!-- The White "x" Polygon -->

<Degrafa:Polygon    

    x="178"    

    y="140"    

    fill="{ whiteFill }">    

    <Degrafa:points>        

    <Degrafa:GraphicPoint            

        x="1.107"            

        y=".147"/>        

    <Degrafa:GraphicPoint            

        x="32.926"            

        y=".147"/>        

    <Degrafa:GraphicPoint            

        x="54.022"            

        y="39.574"/>        

    <Degrafa:GraphicPoint            

        x="76.503"           

        y=".147"/>        

    <Degrafa:GraphicPoint            

        x="105.209"            

        y=".147"/>        

    <Degrafa:GraphicPoint           

        x="72.354"            

        y="54.446"/>        

    <Degrafa:GraphicPoint            

        x="108.322"            

        y="113.932"/>         

    <Degrafa:GraphicPoint            

        x="73.736"            

        y="113.932"/>        

    <Degrafa:GraphicPoint            

        x="52.256"            

        y="73.43"/>        

    <Degrafa:GraphicPoint            

        x="32.505"            

        y="113.241"/>        

    <Degrafa:GraphicPoint           

        x=".07"            

        y="113.241"/>        

    <Degrafa:GraphicPoint            

       

下载前可以先看下教程 https://pan.quark.cn/s/a426667488ae 标题“仿淘宝jquery图片左右切换带数字”揭示了这是一个关于运用jQuery技术完成的图片轮播机制,其特色在于具备淘宝在线平台普遍存在的图片切换表现,并且在整个切换环节中会展示当前图片的序列号。 此类功能一般应用于电子商务平台的产品呈现环节,使用户可以便捷地查看多张商品的照片。 说明中的“NULL”表示未提供进一步的信息,但我们可以借助标题来揣摩若干核心的技术要点。 在构建此类功能时,开发者通常会借助以下技术手段:1. **jQuery库**:jQuery是一个应用广泛的JavaScript框架,它简化了HTML文档的遍历、事件管理、动画效果以及Ajax通信。 在此项目中,jQuery将负责处理用户的点击动作(实现左右切换),并且制造流畅的过渡效果。 2. **图片轮播扩展工具**:开发者或许会采用现成的jQuery扩展,例如Slick、Bootstrap Carousel或个性化的轮播函数,以达成图片切换的功能。 这些扩展能够辅助迅速构建功能完善的轮播模块。 3. **即时数字呈现**:展示当前图片的序列号,这需要通过JavaScript或jQuery来追踪并调整。 每当图片切换时,相应的数字也会同步更新。 4. **CSS美化**:为了达成淘宝图片切换的视觉效果,可能需要设计特定的CSS样式,涵盖图片的排列方式、过渡效果、点状指示器等。 CSS3的动画和过渡特性(如`transition`和`animation`)在此过程中扮演关键角色。 5. **事件监测**:运用jQuery的`.on()`方法来监测用户的操作,比如点击左右控制按钮或自动按时间间隔切换。 根据用户的交互,触发相应的函数来执行...
垃圾实例分割数据集 一、基础信息 • 数据集名称:垃圾实例分割数据集 • 图片数量: 训练集:7,000张图片 验证集:426张图片 测试集:644张图片 • 训练集:7,000张图片 • 验证集:426张图片 • 测试集:644张图片 • 分类类别: 垃圾(Sampah) • 垃圾(Sampah) • 标注格式:YOLO格式,包含实例分割的多边形点坐标,适用于实例分割任务。 • 数据格式:图片文件 二、适用场景 • 智能垃圾检测系统开发:数据集支持实例分割任务,帮助构建能够自动识别和分割图像中垃圾区域的AI模型,适用于智能清洁机器人、自动垃圾桶等应用。 • 环境监控与管理:集成到监控系统中,用于实时检测公共区域的垃圾堆积,辅助环境清洁和治理决策。 • 计算机视觉研究:支持实例分割算法的研究和优化,特别是在垃圾识别领域,促进AI在环保方面的创新。 • 教育与实践:可用于高校或培训机构的AI课程,作为实例分割技术的实践数据集,帮助学生理解计算机视觉应用。 三、数据集优势 • 精确的实例分割标注:每个垃圾实例都使用详细的多边形点进行标注,确保分割边界准确,提升模型训练效果。 • 数据多样性:包含多种垃圾物品实例,覆盖不同场景,增强模型的泛化能力和鲁棒性。 • 格式兼容性强:YOLO标注格式易于与主流深度学习框架集成,如YOLO系列、PyTorch等,方便研究人员和开发者使用。 • 实际应用价值:直接针对现实世界的垃圾管理需求,为自动化环保解决方案提供可靠数据支持,具有重要的社会意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值