如何在Flash中反动态加载动态加载的PNG
我有一个Flash文件,用于加载透明PNG(线条图),并使用Flash来允许用户选择绘图的颜色,并立即更改颜色。如何在Flash中反动态加载动态加载的PNG
这是所有的工作,它应该是。我使用UILoader组件来加载通过flashvars接收的图像,然后根据需要更改颜色。
唯一的事情是,图像有时看起来不是很平滑。我看过各种文章,人们谈论在位图上使用smoothing = true。但我不确定在哪里设置它,或者它如何工作。
我是Flash和ActionScript的新手,任何人都可以帮助我吗?以下是我的代码(main.as)。我遗漏了changeColor()和getFlashvars()函数以及导入行。因为我认为这并不重要,并且尽可能保持简单和简短。
非常感谢任何帮助和或指针,你可以给我!
package {
public class Main extends MovieClip {
public function Main() {
init();
if(getFlashvars().img != undefined) {
if(getFlashvars().clr != undefined) {
loadImage(getFlashvars().img, getFlashvars().clr);
} else {
loadImage(getFlashvars().img);
}
} else {
loadImage('example.png', 'FFFFFF');
}
}
private function init() {
ExternalInterface.addCallback('changeColor', this.changeColor);
progressBar.visible = false;
progressBar.mode = 'manual';
progressBar.source = uiLoader;
uiLoader.scaleContent = true;
uiLoader.addEventListener(ProgressEvent.PROGRESS, eventImageProgress);
uiLoader.addEventListener(Event.COMPLETE, eventImageLoaded);
}
/**
* Load a new image from the given url. Replace the color in it with newColor
*/
public function loadImage(url:String, newColor:String='') {
//progressBar.visible = true;
uiLoader.load(new URLRequest(url));
if(newColor.length > 0) {
changeColor(newColor);
}
}
}
as stated clearly in the documentation,平滑是一个位图的公共属性。
myBitmap.smoothing = true;
调用一个新的位图的构造
var myBitmap:Bitmap = new Bitmap(myBitmapData, PixelSnapping.AUTO, true);
//where the last boolean represents the smoothing property
,你也可以尝试你的显示对象上设置一个光模糊滤镜,如果你觉得平滑不够时,也可以设置。
我在Flex中做的是创建一个新组件,如果可能的话,它会在其内部位图上设置平滑属性。类似的东西可能在Flash中可行。
public class SmoothImage extends Image
{
override protected function updateDisplayList(w:Number, h:Number):void
{
super.updateDisplayList(w, h);
if (content is Bitmap)
{
var bitmap : Bitmap = content as Bitmap;
if (bitmap != null &&
bitmap.smoothing == false)
{
bitmap.smoothing = true;
}
}
}
}
然后你可以使用它像:
image = new SmoothImage();
image.source = url;
可能有助于!主要想法是访问位图组件本身来设置平滑属性,无论是在您的文件还是单独的组件中发生,这就是您需要执行的操作。
如果您在使用此平滑代码时遇到问题,则仅适用于从相同域或已将您添加到其crossdomain.xml文件的域中获取图像的情况。
在你完成处理程序中,你可以做这样的事情
// First, you need to copy the loaded image.
var displayObject :DisplayObject = uiLoader.content;
var bitmapData :BitmapData = new BitmapData(displayObject.width, displayObject.height);
bitmapData.draw(displayObject);
// Then create a new image from the loaded image.
var bitmap :Bitmap = new Bitmap(bitmapData);
bitmap.smoothing = true; // This is what actually does the anti-aliasing.
addChild(bitmap);
但我安静不知道在哪里设置 这个
我要说的是,在最简单的形式,你可以在Event.COMPLETE的处理程序的加载图像(位图)上将平滑设置为true,因此eventImageLoaded就是您的情况。
事情是这样的例子:
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
loader.load(new URLRequest("http://www.google.com/images/logos/ps_logo.png"));
function imageLoaded(e:Event):void {
e.target.content.smoothing = true;
// Or Bitmap(e.target.content).smoothing = true; if you prefer.
}
几乎没有拉斯,解决的办法是
Bitmap(UILoaderTarget.content).smoothing = true;
谢谢,这样的事情是什么,我期待的!我试过了,只设置了imageLoaded()中的任一行。因为我已经通过UILoader加载了图像。但这似乎不起作用,但也不会给出任何错误。有没有可能在UILoader组件上设置它?或者我必须使用不同的组件来加载图像? - 如果可能,我想继续使用UILoader,因为它也会自动为我调整图像大小。 – 2010-10-24 07:25:57