我使用 moveTo 和 lineTo 图形方法在 Canvas 对象上画了一条线。如果线条的一端位于 Canvas 之外,则线条会溢出并绘制在应用程序中的其他元素之上或之下。
如何使 Canvas 将线条包含在其内部?
谢谢!
我使用 moveTo 和 lineTo 图形方法在 Canvas 对象上画了一条线。如果线条的一端位于 Canvas 之外,则线条会溢出并绘制在应用程序中的其他元素之上或之下。
如何使 Canvas 将线条包含在其内部?
谢谢!
前段时间我遇到了类似的问题。您需要在画布中嵌入另一个容器,并在其中绘制原始图形。我相信这是因为 Canvas 组件只剪辑子组件,而不是原始图形。
此处示例:http: //www.adobe.com/cfusion/webforums/forum/messageview.cfm ?forumid=60&catid=585&threadid=1421196 。它在页面的一半左右包含一些示例代码。
<mx:Canvas id="canvas" top="0" right="51" left="0" bottom="32">
<mx:Canvas x="-1" y="0" width="0" height="0"> <!-- This is a HACK to make the canvas clip -->
</mx:Canvas>
</mx:Canvas>
推荐答案中的链接已损坏。我通过在我的画布内放置另一个比外部画布大的画布解决了这个问题。
例子:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="onComplete()">
<mx:Script><![CDATA[
private function onComplete():void
{
canvas.graphics.lineStyle(1);
canvas.graphics.moveTo( -100, -100);
canvas.graphics.lineTo(400, 400);
}
]]></mx:Script>
<mx:Canvas id="window"
height="300"
width="300"
clipContent="true"
horizontalScrollPolicy="off"
verticalScrollPolicy="off"
backgroundColor="white">
<mx:Canvas id="canvas" width="301" height="301">
</mx:Canvas>
</mx:Canvas>
</mx:Application>
如果要在运行时调整窗口 Canvas 的大小,请添加一个 resize 事件侦听器来调整画布 Canvas 的大小。
我刚刚开发了一个 Flex Box 组件,它充当了一个常规的组件容器,但绘制了一个圆角矩形背景,另一个圆角矩形表示填充级别。为此,我需要夹住不应填充的上部。由于圆角不匹配,因此无法将填充矩形绘制到填充高度。
我学到的是:
这是一些代码:
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
// super
super.updateDisplayList(unscaledWidth, unscaledHeight);
// prep
var g:Graphics = this.graphics;
var fgColor:int = this.getStyle("fillColor");
var bgColor:int = this.getStyle("backgroundFillColor");
var radius:int = this.getStyle("cornerRadius");
// clear
g.clear();
// draw background
g.beginFill(bgColor, 1);
g.drawRoundRect(0, 0, unscaledWidth, unscaledHeight, radius, radius);
g.endFill();
// draw fill level
if (this._fillLevel > 0) {
var fillHeight:int = int(unscaledHeight * this._fillLevel);
// extra component for drawing fill-level, so we can apply mask just to this
if (this._fillLevelCanvas == null) {
this._fillLevelCanvas = new Canvas();
this._fillLevelCanvas.x = 0;
this._fillLevelCanvas.y = 0;
this._fillLevelCanvas.includeInLayout = false;
this.addChildAt(this._fillLevelCanvas, 0);
}
this._fillLevelCanvas.width = unscaledWidth;
this._fillLevelCanvas.height = unscaledHeight;
// mask
if (this._fillLevelMask == null) {
this._fillLevelMask = new Canvas();
this._fillLevelMask.x = 0;
this._fillLevelMask.y = 0;
this._fillLevelCanvas.addChild(this._fillLevelMask);
this._fillLevelCanvas.mask = this._fillLevelMask;
}
this._fillLevelMask.width = this.width;
this._fillLevelMask.height = this.height;
this._fillLevelMask.graphics.beginFill(0xFFFFFF);
this._fillLevelMask.graphics.drawRect(0, this.height-fillHeight, this._fillLevelMask.width, this._fillLevelMask.height);
this._fillLevelMask.graphics.endFill();
this._fillLevelCanvas.graphics.beginFill(fgColor, 1);
this._fillLevelCanvas.graphics.drawRoundRect(0, 0, unscaledWidth, unscaledHeight, radius, radius);
this._fillLevelCanvas.graphics.endFill();
}
}
将 Canvas 的 ClipToBounds 属性设置为 true:
<Canvas ClipToBounds="True">... Content ...</Canvas>