在我的.fla文件中,我包含了指令文件
中指示的外部actionscript文件import xxx.xxx.xxx.sound.MP3Player;
var mp3Player:MP3Player = new MP3Player();
addChild(mp3Player);
现在我想使用他的loadMp3函数
/**
* Start loading the mp3 file.
*/
private function loadMP3():void {
mp3.load(new URLRequest(MP3_URL));
mp3.addEventListener(IOErrorEvent.IO_ERROR, onIOError, false, 0, true);
channel = mp3.play();
channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0, true);
_isPlaying = true;
}
发现mp3完全加载并准备播放声音的时候 通过ExternalInterface函数。
我怎么办?感谢全班
package xxx.xxx.xxx.sound {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.geom.ColorTransform;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundMixer;
import flash.net.URLRequest;
import flash.utils.ByteArray;
import flash.text.TextField;
public class MP3Player extends MovieClip {
// Location of the config xml file
public static const CONFIG_XML_URL:String = "xml/config.xml";
// URL of the mp3 file
public static var MP3_URL:String = "mp3/track.mp3";
// Main color for the mp3 player
public static var MAIN_COLOR:uint = 0xFF0000;
// An XMLLoader to load the configuration file
private var xmlLoader:XMLLoader;
// Sound object to be played
private var mp3:Sound = new Sound();
// A sound channel to play the sound object
private var channel:SoundChannel;
// Holds the pause position
private var pausePos:Number;
// A byte array to read spectrum
private var bytes:ByteArray = new ByteArray();
// Indicates whether the mp3 player is playing or not.
private var _isPlaying:Boolean = false;
// Holds the previous label color
private var _prevColor:uint;
public function MP3Player() {
// Initialize the player
init();
}
/**
* Initializes the player.
*/
private function init():void {
// Use as a button
useHandCursor = true;
buttonMode = true;
mouseChildren = false;
equalizer.alpha = 0;
// Add necessary event listeners
addEventListener(Event.ENTER_FRAME, onEnterFrame, false, 0, true);
addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown, false, 0, true);
addEventListener(MouseEvent.MOUSE_OVER, onMouseOver, false, 0, true);
addEventListener(MouseEvent.MOUSE_OUT, onMouseOut, false, 0, true);
loadConfig();
}
/**
* Sets the color of the player to the given parameter.
*/
public function setColor(color:uint):void {
MAIN_COLOR = color;
// Change the color of the equalizer
var colorTransform:ColorTransform = equalizer.transform.colorTransform;
colorTransform.color = MAIN_COLOR;
equalizer.transform.colorTransform = colorTransform;
}
/**
* Loads the configuration file to the memory.
*/
private function loadConfig() {
// Start loading the config.xml file
xmlLoader = new XMLLoader(CONFIG_XML_URL);
xmlLoader.addEventListener(XMLLoader.XML_LOADED, onXMLLoaded);
xmlLoader.load();
}
/**
* This method is called when the xml file is loaded to the memory.
*/
private function onXMLLoaded(evt:Event):void {
// Get configuration parameters
var xml:XML = xmlLoader.getXML();
MP3_URL = xml.@mp3URL;
MAIN_COLOR = xml.@color;
// Change the color of the equalizer
equalizer.alpha = 1;
setColor(MAIN_COLOR);
// Start loading the mp3
loadMP3();
}
/**
* Start loading the mp3 file.
*/
private function loadMP3():void {
mp3.load(new URLRequest(MP3_URL));
mp3.addEventListener(IOErrorEvent.IO_ERROR, onIOError, false, 0, true);
channel = mp3.play();
channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0, true);
_isPlaying = true;
}
/**
* This method is called whenever a new enter frame event occurs.
*/
private function onEnterFrame(evt:Event):void {
try {
SoundMixer.computeSpectrum(bytes, true, 0);
} catch (e:Error) {
}
equalizer.update(bytes);
}
/**
* This method is called when playing the sound is finished.
*/
private function onSoundComplete(evt:Event):void {
// Loop
channel = mp3.play();
channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0, true);
_isPlaying = true;
}
/**
* This method is called when the mouse is over the mp3 player.
*/
private function onMouseOver(evt:MouseEvent):void {
// Change the color of the equalizer
_prevColor = label.textColor;
label.textColor = MAIN_COLOR;
}
/**
* This method is called when the mouse leaves the mp3 player.
*/
private function onMouseOut(evt:MouseEvent):void {
label.textColor = _prevColor;
}
/**
* This method is called when the mouse is clicked on the mp3 player.
*/
private function onMouseDown(evt:MouseEvent):void {
if (_isPlaying) {
pausePos = channel.position;
channel.stop();
_isPlaying = false;
label.text = "MUSIC OFF";
} else {
channel = mp3.play(pausePos);
channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0, true);
_isPlaying = true;
label.text = "MUSIC ON";
}
}
/**
* This method is called if an IO error occurs.
*/
private function onIOError(evt:IOErrorEvent):void {
}
}
}
答案 0 :(得分:1)
为了发现您的MP3已满载,您可以将以下几行添加到loadMP3()
功能中:
mp3.addEventListener(Event.COMPLETE, onLoadComplete);
你也应该这个功能。
private function onLoadComplete(e:Event):void {
// This will call a JavaScript function
ExternalInterface.call('toJS');
}
为了使ExternalInterface
正常工作,您应该导入类:
import flash.external.ExternalInterface;
在HTML中,您应该添加一个名为'toJS'的函数,以便在JavaScript中进行回调。 (你可以随意调用这个函数)。
答案 1 :(得分:0)
我插入了putvande向我建议的代码。
package xxx.xxx.xxx.sound {
..
..
import flash.external.ExternalInterface;
..
..
/**
* Start loading the mp3 file.
*/
private function loadMP3():void {
mp3.load(new URLRequest(MP3_URL));
mp3.addEventListener(IOErrorEvent.IO_ERROR, onIOError, false, 0, true);
channel = mp3.play();
channel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete, false, 0, true);
_isPlaying = true;
// Load complete function
mp3.addEventListener(Event.COMPLETE, onLoadComplete);
}
/**
* This method is called when load complete and sent call to js.
*/
private function onLoadComplete(e:Event):void {
// This will call a JavaScript function
if (ExternalInterface.available)
{
ExternalInterface.call("loadedCallback");
}
}
..
..
这个解决方案运行完美,但我也解决了编译swf时出现的问题,我收到了这条消息(一次在公共html页面中没有显示)
如何修复此警告消息?谢谢!