12.7.1 问题
你需要创建一个在图片之间置换的渐变效果。
12.7.2 解决办法
继承TweenEffect 和TweenEffectInstance 类,创建一个具有最终置换值的TweenEffect 实例,然后将这些最终置换值传给它所创建的TweenEffectInstance 类实例。在自定义的TweenEffectInstance 类里,创建一个DisplacementMapFilter 对象并且使用Flex 框架的渐变引擎通过在每个onTweenUpdate 事件上生成新的过滤器来达到预期的置换值。
12.7.3 讨论
DisplacementMapFilter 通过使用另一张图片的象素点决定变形的位置和量来置换或者变形当前图片的像素点。
置换的位置和量到设定的像素是通过置换目标图片的像素点色值决定的。
DisplacementMapFilter 的构造方法如下:
-ActionScript
public function DisplacementMapFilter(mapBitmap:BitmapData = null,
mapPoint:Point = null, componentX:uint = 0, componentY:uint = 0,
scaleX:Number = 0.0, scaleY:Number = 0.0, mode:String = "wrap",
color:uint = 0, alpha:Number = 0.0)
如此长的一行代码拆开理解较为简单:
-ActionScript
BitmapData (default = null)
这是过滤器应用到的置换目标图片或组件所用到的BitmapData 对象。
mapPoint
这个是被过滤图片的位置,对应于过滤器要应用到的置换图片的左上角位置。如果仅仅过滤图片的一部分的话,可以使用这个参数。
componentX
该参数指定作用x 位置上的图片象素颜色通道。BitmapDataChannel 定义了所有有效的常量选项值:BitmapDataChannel.BLUE 或4, BitmapDataChannel.RED 或1,BitmapDataChannel.GREEN 或2, or BitmapDataChannel.ALPHA 或8。
componentY
指定作用y 位置上的图片象素颜色通道。取值范围和componentX 的相同。
scaleX
这个参数值指定X 轴方向上的置换强度。
scaleY
这个参数值指定Y 轴方向上的置换强度。
mode
这是一个字符串,它决定怎样处理置换像素后形成的空白空间。可选值申明为DisplacementMapFilterMode 类的常量,用以显示原始的像素(mode = IGNORE)、从图片另一边封装边缘像素点(mode = WRAP,默认值)、使用最近的置换像素(mode = CLAMP)或者使用某个颜色填充这些空间(mode = COLOR)。
CustomDisplacementEffect 例示CustomDisplacementInstance。如下:
-ActionScript
package oreilly.cookbook{
import mx.effects.IEffectInstance;
import mx.effects.TweenEffect;
import mx.events.EffectEvent;
public class CustomDisplacementEffect extends TweenEffect
{
public var image:Class;
public var yToDisplace:Number;
public var xToDisplace:Number;
public function CustomDisplacementEffect(target:Object=null)
{
super(target);
this.instanceClass = CustomDisplacementInstance;
}
override protected function
initInstance(instance:IEffectInstance):void {
trace(" instance initialized ");
super.initInstance(instance);
// now that we've instantiated our instance, we can set
its properties
CustomDisplacementInstance(instance).image = image;
CustomDisplacementInstance(instance).xToDisplace =
this.xToDisplace;
CustomDisplacementInstance(instance).yToDisplace =
this.yToDisplace;
}
override public function getAffectedProperties():Array {
trace(" return all the target properties ");
return [];
}
}
}
实际上CustomDisplacementInstance 负责进行创建应用到目标的DisplacementEffect 对象。而位图对象,过滤器在DisplacementEffect 使用的,以及CustomDisplacementTween 的x 与y置换量都应用到该实例并传给DisplacementEffect。
CustomTweenEffect 创建CustomDisplacementInstance 的实例,如下:
-ActionScript
package oreilly.cookbook{
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.display.DisplayObject;
import flash.filters.DisplacementMapFilter;
import flash.filters.DisplacementMapFilterMode;
import flash.geom.Point;
import mx.effects.Tween;
import mx.effects.effectClasses.TweenEffectInstance;
public class CustomDisplacementInstance extends
TweenEffectInstance
{
public var image:Class;
public var xToDisplace:Number;
public var yToDisplace:Number;
public var filterMode:String =
DisplacementMapFilterMode.WRAP;
private var filter:DisplacementMapFilter;
private var img:DisplayObject;
private var bmd:BitmapData;
public function CustomDisplacementInstance(target:Object)
{
super(target);
}
override public function play():void {
super.play();
//make our embedded image accessible to use
img = new image();
bmd = new BitmapData(img.width, img.height, true);
//draw the actual byte data into the image
bmd.draw(img);
这个新过滤器被创建,将被设置初始状态的所有值:
-ActionScript
filter = new DisplacementMapFilter(bmd, new
Point(DisplayObject(target).wi
dth/2 - (img.width/2), DisplayObject(target).height/2 -
(img.height/2))),
BitmapDataChannel.RED, BitmapDataChannel.RED, 0, 0,
filterMode, 0.0, 1.0);
//copy any filters already exisiting on the target so
that we don't
destroy them when we add our new filter
var targetFilters:Array = (target as
DisplayObject).filters;
targetFilters.push(filter);
//set the actual filter onto the target
(target as DisplayObject).filters = targetFilters;
//create a tween that will begin to generate the next
values of each frame of our effect
this.tween = new Tween(this, [0, 0], [xToDisplace,
yToDisplace],
duration);
}
该类的很多繁重工作都在setDisplacementFilter 中完成。因为过滤器是累积的(它们是叠加应用的),前面的DisplacementMapFilter 必须移除。这需要通过循环遍历目标对象的过滤器数组来完成,移除所有DisplacementMapFilter 的实例。然后使用Tween 传过来的值创建一个新的过滤器并且将此过滤器应用到目标对象上。注意要让过滤器适当的显示,过滤器数组必须要重置。使用Array.push 方法添加过滤器到数组中不会引起目标DisplayObject 使用过滤器重绘。
-ActionScript
private function setDisplacementFilter(displacement:Object):void{
var filters:Array = target.filters;
// Remove any existing Displacement filter to ensure that
ours is the only one
var n:int = filters.length;
for (var i:int = 0; i < n; i++) {
if (filters[i] is DisplacementMapFilter)
filters.splice(i, 1);
}
//create the new filter with the values passed in from
the tween
filter = new DisplacementMapFilter(bmd, new Point(0, 0),
BitmapDataChannel.RED, BitmapDataChannel.RED,
displacement[0] as Number, displacement[1] as
Number, filterMode, 0.0, 0);
//add the filter to the filters on the target
filters.push(filter);
target.filters = filters;
}
//each time we're ready to update, re-create the
displacement map filter
override public function onTweenUpdate(value:Object):void
{
setDisplacementFilter(value);
}
//set the filter one last time and then dispatch the tween
end event
override public function onTweenEnd(value:Object):void
{
setDisplacementFilter(value);
super.onTweenEnd(value);
}
}
}
当渐变结束时,DisplacementMapFilter 的最终值用来设置目标DisplayObject 的最终外观,同时调用TweenEffectInstance 类的onTweenEnd 方法。
分享到:
相关推荐
12.7节在Flex Effect里使用DisplacementMapFilter过滤器 12.8节创建AnimateColor 特效 12.9节使用Convolution Filter创建渐变效果 第十三章. 集合(439) 13.1节. 为ArrayCollection添加,排序和获取数据 13.2节. ...
内容概要:本文档详细介绍了Netty框架的核心概念、特点、线程模型、序列化协议选择及其实现细节。首先对比了BIO、NIO和AIO的区别,重点阐述了NIO的非阻塞特性及其基于事件驱动的工作原理。接着深入讲解了Netty的高性能表现,包括零拷贝技术、心跳机制、内存管理、流量整形等方面。文档还探讨了Netty的线程模型,包括单线程、多线程和主从多线程模型,并解释了NIOEventLoopGroup的源码实现。此外,文档讨论了TCP粘包/拆包问题及其解决方案,以及常见的序列化协议(如JSON、Protobuf、Thrift等)的特点和适用场景。 适合人群:具备一定网络编程基础,特别是对Java NIO和Netty框架有一定了解的研发人员和技术专家。 使用场景及目标:①理解NIO与传统BIO的区别,掌握NIO的非阻塞特性和事件驱动模型;②深入了解Netty的高性能设计原则,包括零拷贝、心跳检测、内存管理和线程模型;③掌握TCP粘包/拆包的原理及解决方案;④根据具体应用场景选择合适的序列化协议。 阅读建议:本文档内容较为深入,建议读者在阅读过程中结合实际代码和应用场景进行理解。对于Netty的线程模型和序列化协议部分,可以通过实际编程练习加深理解。特别地,理解NIOEventLoopGroup的源码实现需要有一定的Java多线程编程基础。
美高森美提供的SmartFusion2 SoC FPGA双轴电机控制套件带有模块化电机控制IP集和参考设计.doc
内容概要:本文详细介绍了使用三菱FX1S系列PLC和威纶通触摸屏构建双伺服打孔机控制系统的开发过程。主要内容涵盖系统架构、PLC程序设计、触摸屏配置以及开发中常见的注意事项。系统的核心在于通过PLC控制伺服电机完成精确的打孔动作,触摸屏则用于参数设置和运行监控。文中还讨论了伺服电机的参数配置、循环控制逻辑、MODBUS通信配置、界面设计及实时数据更新等方面的内容。此外,作者分享了一些实际开发中的经验和教训,如伺服电机的过冲和欠冲问题、程序稳定性的保障措施以及触摸屏响应速度的优化。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是对PLC编程和伺服控制有一定基础的人群。 使用场景及目标:适用于需要高精度定位和控制的工业应用场景,如钣金加工车间。目标是帮助读者掌握双伺服打孔机的开发流程,提高系统的稳定性和效率。 其他说明:文中提到的技术细节和实践经验对于理解和解决类似项目的难题非常有帮助。建议读者在实践中结合具体情况进行调整和优化。
街道级行政区划shp矢量数据,wgs84坐标系,下载直接使用
街道级行政区划shp矢量数据,wgs84坐标系,下载直接使用
呼伦贝尔市-满洲里市-街道行政区划_150781_Shp数据-wgs84坐标系.rar
街道级行政区划shp矢量数据,wgs84坐标系,下载直接使用
Java基于springboot+vue的资产管理系统源码+数据库(高分项目),个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业。 Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据库(高分项目)Java基于springboot+vue的资产管理系统源码+数据
街道级行政区划shp矢量数据,wgs84坐标系,下载直接使用
街道级行政区划shp数据,wgs84坐标系,直接下载使用。
街道级行政区划shp数据,wgs84坐标系,直接下载使用。
街道级行政区划shp数据,wgs84坐标系,直接使用。
街道级行政区划shp矢量数据,wgs84坐标系,下载直接使用
街道级行政区划shp数据,wgs84坐标系,直接下载使用。
鄂尔多斯市-乌审旗-街道行政区划_150626_Shp数据-wgs84坐标系.rar
适用范围:Thinkphp蓝色响应式后台源码 系统设置、导航管理、配置管理、上传管理、用户管理、功能模块和插件管理 源码开发语言:PHP+MYSQL 源码描述说明: thinkphp蓝色大气的响应式后台模板,常用的后台功能有:系统设置、导航管理、配置管理、上传管理、用户管理、功能模块和插件管理等。
大同市-云冈区-街道行政区划_140214_Shp数据-wgs84坐标系.rar
内容概要:本文详细介绍了在FBCCA算法中应用贝叶斯优化的完整代码实现,基于高斯过程优化,代码可直接运行。首先配置环境,安装所需的Python库如scikit-optimize、scipy、numpy、torch等。核心实现部分包括数据生成模块,通过SSVEPGenerator类生成带谐波的SSVEP信号FBCCABayes分类器模块,定义了滤波器组的动态创建、CCA相关系数的计算,并实现了贝叶斯优化过程。最后,通过贝叶斯优化执行模块,对FBCCABayes分类器的关键参数(滤波器阶数、频带宽度、CCA权重系数)进行优化,输出最佳参数组合及最高验证准确率,并对优化过程进行可视化展示,包括收敛曲线和参数影响热力图。 适合人群:有一定机器学习基础,特别是熟悉Python编程和贝叶斯优化理论的研究人员或工程师。 使用场景及目标:①理解FBCCA算法的工作原理及其在脑机接口领域的应用;②掌握贝叶斯优化在调参中的具体应用,提高模型性能;③学习如何将理论知识转化为实际可运行的代码,并通过可视化工具直观地展示优化效果。 其他说明:代码已在Python 3.10 + CUDA 11.8/CPU环境下验证通过,安装指定版本依赖后可直接运行。建议读者在实践中调整参数设置,探索不同配置下的模型表现。
GD32F407VET6单片机实验程序1.GPIO输出驱动LED与GD32F4的Keil5软件Pack