Converted Tween Animation Class in AS3

本文介绍了一个用ActionScript 3重写的过渡动画类,该类允许电影片段在不同位置间移动,并支持缩放、旋转及透明度变化等多种动画效果。此外,还提供了自定义事件分发器用于监听动画进度和完成状态。

Converted Tween Animation Class in AS3


是一个挺酷的过度效果,大家可以到原站点看看


http://www.reflektions.com/miniml/template_permalink.asp?id=441




A few months ago I had released an easing tween class  that I wrote in AS2 based on the easing formula posts.  The basic principle is to get a clip to move, scale or rotate from point A to B with different movement equations. this is an alternative class similar to the fuse kit, the Robert Penner equations, the Zeh Fernando MC tween, the Zigo/Laco or the tween classes found in Flash.  Here is the principle

	import com.reflektions.tween.*;	

var tween:Tween = new Tween();
var tobj:Object = {mc:mc,x:x,dx:dx}; //x init and dx final position
tween.initTween(tobj);

I rewrote the class in AS3 and you can download it here.  I also added custom event dispatchers that dispatch events when the clip is animating and when tween completed.  The  movieclip reference and time (0 to 1) are also passed through the custom event.

	// Add Listener to tween events
tween.addEventListener(TweenEventDispatcher.TWEEN_PROGRESS, progressListener);
tween.addEventListener(TweenEventDispatcher.TWEEN_COMPLETE, completeListener);

n.b: as far as passing properties go you can pass (x:,dx:) for x tweening, (y:,dy:) for y tweening, (r:,dr:) for rotation, (a:,da:) for transparency and (xscale:,dxscale:) and (y:,dyscale:) for scaling on both axis.  Enjoy, here is an examples that tweens 5 different clips with different equations at different speeds.


 


import com.reflektions.tween.*; // <-- import for tween
import com.reflektions.tween.equations.*; // <-- import all  tween equations


function initAnimation():void {


 // define properties
 var mc:MovieClip = follow_mc_1;  // clip to tween
 var x:Number = mc.x;
 var dx:Number = (x == point_1.x) ? point_0.x : point_1.x;  //switch target accordfing to position


 var tween:Tween = new Tween();
 var tobj:Object = {mc:mc,x:x,dx:dx};
 tween.initTween(tobj,Shubring.easeInOut,10);  // or pass extra parameters sucha as equation and speed


 // Add Listener to tween events
 tween.addEventListener(TweenEventDispatcher.TWEEN_PROGRESS, tweenProgressListener);
 tween.addEventListener(TweenEventDispatcher.TWEEN_COMPLETE, tweenCompleteListener);
}


// Check Complete
function tweenCompleteListener(e:TweenEventDispatcher):void { 
 // Accordig to completed reset animation
 if (e.params.target.name == "follow_mc_1") { // check to see if target is clip we animated (optional)
  initAnimation();
 }
}


// Check progress
function tweenProgressListener(e:TweenEventDispatcher):void {
 trace(["progress... ",e.params.target,e.params.time])
}



// Initiate
initAnimation();

内容概要:本文提出了一种基于融合鱼鹰算法和柯西变异的改进麻雀优化算法(OCSSA),用于优化变分模态分解(VMD)的参数,进而结合卷积神经网络(CNN)与双向长短期记忆网络(BiLSTM)构建OCSSA-VMD-CNN-BILSTM模型,实现对轴承故障的高【轴承故障诊断】基于融合鱼鹰和柯西变异的麻雀优化算法OCSSA-VMD-CNN-BILSTM轴承诊断研究【西储大学数据】(Matlab代码实现)精度诊断。研究采用西储大学公开的轴承故障数据集进行实验验证,通过优化VMD的模态数和惩罚因子,有效提升了信号分解的准确性与稳定性,随后利用CNN提取故障特征,BiLSTM捕捉时间序列的深层依赖关系,最终实现故障类型的智能识别。该方法在提升故障诊断精度与鲁棒性方面表现出优越性能。; 适合人群:具备一定信号处理、机器学习基础,从事机械故障诊断、智能运维、工业大数据分析等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决传统VMD参数依赖人工经验选取的问题,实现参数自适应优化;②提升复杂工况下滚动轴承早期故障的识别准确率;③为智能制造与预测性维护提供可靠的技术支持。; 阅读建议:建议读者结合Matlab代码实现过程,深入理解OCSSA优化机制、VMD信号分解流程以及CNN-BiLSTM网络架构的设计逻辑,重点关注参数优化与故障分类的联动关系,并可通过更换数据集进一步验证模型泛化能力。
<think>我们正在解决一个Java类型转换错误:BlackScreen cannot be converted to Class<?> 错误原因分析: 1. 错误通常发生在试图将一个类实例(BlackScreen对象)当作Class对象使用时。 2. 常见场景:在反射操作中,误将类的实例传递给需要Class类型参数的方法。 示例错误代码: BlackScreen blackScreen = new BlackScreen(); // 错误:将BlackScreen对象当作Class对象使用 Class<?> clazz = blackScreen; // 编译错误:类型不匹配 正确做法: 使用.class语法或getClass()方法获取Class对象 解决方案: 方案1:使用.class语法 Class<?> clazz = BlackScreen.class; 方案2:通过实例的getClass()方法(需注意null安全) BlackScreen blackScreen = ...; if (blackScreen != null) { Class<?> clazz = blackScreen.getClass(); } else { // 处理null情况 } 方案3:使用Class.forName()(需要完整类名) try { Class<?> clazz = Class.forName("com.example.BlackScreen"); } catch (ClassNotFoundException e) { e.printStackTrace(); } 根据用户之前的错误日志(NoSuchFieldException)推测: 用户可能在反射代码中错误地传递了BlackScreen的实例而不是BlackScreen.class。 例如,在测试类ImStandbyServiceTest中,tearDown方法可能包含类似代码: Object target = BlackScreen.getInstance(); // 获取BlackScreen实例 setPrivateField(target, "sInstance", null); // 错误:target应该是Class对象 正确写法应为: setPrivateField(BlackScreen.class, "sInstance", null); 因此,需要检查测试代码中传递给反射方法的参数类型。 反射工具方法setPrivateField的实现可能如下(原错误代码): public void setPrivateField(Object target, String fieldName, Object value) { // 错误:如果target是实例而不是Class,则无法获取静态字段 Field field = target.getClass().getDeclaredField(fieldName); ... } 修正反射工具方法以同时支持实例字段和静态字段: public void setField(Object target, String fieldName, Object value) { Class<?> clazz; boolean isStatic = false; if (target instanceof Class) { // 静态字段:target是Class对象 clazz = (Class<?>) target; isStatic = true; } else { // 实例字段:target是实例对象 clazz = target.getClass(); } Field field = clazz.getDeclaredField(fieldName); field.setAccessible(true); if (isStatic) { field.set(null, value); // 静态字段设置时,忽略对象,使用null } else { field.set(target, value); } } 然后,在测试中调用: // 重置静态字段sInstance(属于BlackScreen类) setField(BlackScreen.class, "sInstance", null); // 设置实例字段(需要对象实例) BlackScreen screen = new BlackScreen(); setField(screen, "instanceField", 123); 总结:错误是因为将BlackScreen实例(对象)用在了需要Class类型的地方。修正为传递BlackScreen.class即可。 相关问题: 1. Java中如何获取一个类的Class对象? 2. 反射如何区分静态字段和实例字段? 3. 如何安全地重置单例对象以便于单元测试? 4. 在Android开发中,如何处理系统服务的反射调用? 5. 如何避免Java反射中的ClassNotFoundException?</think>### 解决 "BlackScreen cannot be converted to Class<?>" 类型转换错误 #### 错误原因分析 1. **类型不匹配**:尝试将 `BlackScreen` 对象实例当作 `Class<?>` 类型使用 2. **反射误用**:在需要传递类对象的地方错误地传递了实例对象 3. **单例设计问题**:`BlackScreen` 可能是单例类,但测试中错误处理了其实例 #### 解决方案 ##### 方法1:正确获取类对象(推荐) ```java // ✅ 正确:使用 .class 语法获取 Class 对象 Class<?> targetClass = BlackScreen.class; // ✅ 正确:通过实例获取 Class 对象 BlackScreen instance = BlackScreen.getInstance(); Class<?> targetClass = instance.getClass(); ``` ##### 方法2:修复反射工具方法 ```java // 修改后的工具方法(支持静态字段) public static void setStaticField(Class<?> targetClass, String fieldName, Object value) { try { Field field = targetClass.getDeclaredField(fieldName); field.setAccessible(true); // 静态字段使用 null 作为目标对象 field.set(null, value); } catch (Exception e) { throw new RuntimeException("设置字段失败: " + fieldName, e); } } // 正确调用方式 @After public void tearDown() { // 传递类对象而非实例 setStaticField(BlackScreen.class, "sInstance", null); } ``` ##### 方法3:添加类型安全转换 ```java // 安全转换方法 public static <T> Class<T> safeCast(Object obj) { if (obj instanceof Class) { return (Class<T>) obj; } throw new IllegalArgumentException("需要 Class 类型对象"); } // 使用示例 Class<BlackScreen> clazz = safeCast(BlackScreen.class); ``` #### 错误代码示例与修正 ```java // ❌ 错误:尝试将实例转换为 Class BlackScreen instance = new BlackScreen(); Class<?> wrongClass = (Class<?>) instance; // ClassCastException // ✅ 正确:直接使用 .class 语法 Class<?> correctClass = BlackScreen.class; ``` #### 最佳实践 1. **区分实例与类对象**: - 实例:`new BlackScreen()` - 类对象:`BlackScreen.class` 2. **单例测试规范**: ```java public class BlackScreen { private static BlackScreen sInstance; // 添加测试专用重置方法 @VisibleForTesting public static void resetForTesting() { sInstance = null; } } // 测试中直接调用 @After public void tearDown() { BlackScreen.resetForTesting(); // 避免反射 } ``` 3. **使用类型安全框架**: ```java // Mockito 安全模拟 @Mock BlackScreen mockScreen; @Before public void setup() { // 注入模拟实例 ReflectionTestUtils.setField(BlackScreen.class, "sInstance", mockScreen); } ``` #### 常见应用场景 1. **单元测试中重置单例状态** 2. **依赖注入框架的扩展实现** 3. **动态代理创建** 4. **插件系统加载类** 5. **序列化/反序列化处理** > **关键点**:Java 中类对象(`Class<?>`)和类实例是完全不同的概念。反射操作静态字段时应使用 `类名.class`,操作实例字段时才需要对象实例[^1]。 --- ### 相关问题 1. **如何安全地将字符串转换为 Class 对象?** ```java Class<?> clazz = Class.forName("com.example.BlackScreen"); ``` 2. **Java 反射中 getClass() 和 .class 有什么区别?** `getClass()` 获取运行时类型,`.class` 获取编译时类型 3. **如何检查一个对象是否特定类的实例?** ```java if (obj instanceof BlackScreen) { // 安全处理 } ``` 4. **Android 开发中如何处理系统服务的类加载问题?** 使用 `Context.getSystemService()` 或 `Class.forName()` 结合系统权限 5. **如何避免 Java 反射中的 ClassCastException?** 使用泛型类型检查和安全的类型转换方法: ```java public static <T> T cast(Class<T> clazz, Object obj) { return clazz.isInstance(obj) ? clazz.cast(obj) : null; } ``` 6. **单例模式在单元测试中如何避免状态污染?** 添加测试专用的 `reset()` 方法或使用依赖注入框架
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值