Просмотр полной версии : плейлист (как правильно сделать?)
Вопрос по правильной организации плейлиста.
Для создания плейлиста песен (например, как в винампе) необходимо для каждой песни создавать текстфилд, который будет ловить события мыши, и располагать их друг под другом, организуя таким образом список?
Или есть способы более правильные? :)
ramshteks
29.08.2008, 17:29
а все друг мой зависит от твоих нужд.
в определенных условиях описанный тобой способ вполне хорош
ramshteks
Спасибо, функции самые обычные, при наведении на название песни, рядом с ней появляется кнопка удалить из плейлиста, а при клике на название песня играет, вроде больше ничего и не придумать.
Способ, который я предложил, мне кажется не самым правильным, но может так все и делают? Если кто-то уже делал что-то подобное или имеет представление буду рад услышать ваше мнение.
ramshteks
29.08.2008, 18:07
нормальнй способ, что тебя смущает не пойму...
Ну, можно отдельный класс playlistItem сделать на основе Sprite, в котором будет текстфилд с названием песни, кнопки для удаления плейлиста и т.д.
Если не устраивает производительность, можно поизвращаться с рендингом текста в растр :)
Это ж каких размеров должен быть плейлист, чтобы текстфилды в нем начали тормозить :)
Всем спасибо, пишу, уже что-то получается)
†‡Paladin‡†
30.08.2008, 19:48
Это ж каких размеров должен быть плейлист, чтобы текстфилды в нем начали тормозить :)
Он небудет тормозить даже если там будет 10000 строк. Просто нужно отрисовывать только те поля которые видны в данный момент.
Руководствуясь хэлпом флэша написал вроде, но на экране ничего не появляется.
public class Main extends MovieClip
{
public var playList:Array;
public function Main()
{
init();
};
private function init():void
{
playList = new Array();
playList.push("A", "B", "C", "D");
for (var i:int = 0; i < playList.length; i++)
{
var playlistButton:MyButton = new MyButton();
playlistButton.x = 50;
playlistButton.y = i*25;
playlistButton.addEventListener(MouseEvent.CLICK, handleButtonClick);
addChild(playlistButton);
};
};
};
public class MyButton extends MovieClip
{
public var songButton:MovieClip;
public var songname:TextField;
public function MyButton()
{
init();
};
private function init():void
{
songname = new TextField();
addChild(songname);
songname.autoSize = TextFieldAutoSize.LEFT;
songname.border=true;
songname.htmlText = "песня";
songButton = new MovieClip();
songButton.graphics.drawRect(songname.x, songname.y, songname.width, songname.height);
songButton.graphics.endFill();
songButton.addChild(songname);
songname.mouseEnabled = false;
songButton.buttonMode = true;
};
};
Подскажите, в чем ошибка? :)
ramshteks
30.08.2008, 20:17
private function init():void
{
songname = new TextField();
addChild(songname);
songname.autoSize = TextFieldAutoSize.LEFT;
songname.border=true;
songname.htmlText = "песня";
songButton = new MovieClip();
songButton.graphics.drawRect(songname.x, songname.y, songname.width, songname.height);
songButton.graphics.endFill();
songButton.addChild(songname);
songname.mouseEnabled = false;
songButton.buttonMode = true;
addChild(songButton)
};
ramshteks, спасибо! Теперь всё понятно, буду действовать дальше)
Вот на таком простом примере не могу получить номер кнопки на которую нажал, так чтобы эта переменная была доступна в классе Main
public class Main extends MovieClip
{
public var playList:Array;
public function Main()
{
init();
};
private function init():void
{
playList = new Array();
playList.push("A", "B", "C", "D");
for (var i:int = 0; i < playList.length; i++)
{
var playlistButton:MyButton = new MyButton(i);
playlistButton.x = 50;
playlistButton.y = i*25;
playlistButton.songname.text = "hello"+i;
playlistButton.addEventListener(MouseEvent.CLICK, handleButtonClick);
addChild(playlistButton);
};
};
private function handleButtonClick(e:MouseEvent):void
{
trace(playlistButton.buttonNumber);
};
};
public class MyButton extends MovieClip
{
public var songButton:MovieClip;
public var songname:TextField;
public var buttonNumber:int;
public function MyButton()
{
this.buttonNumber = i;
init();
};
private function init():void
{
songname = new TextField();
songButton = new MovieClip();
songButton.graphics.drawRect(songname.x, songname.y, songname.width, songname.height);
songButton.graphics.endFill();
songButton.addChild(songname);
songname.mouseEnabled = false;
songButton.buttonMode = true;
addChild(songButton)
};
все компилируется, но при клике
1119: Access of possibly undefined property buttonNumber through a reference with static type classes:MyButton.
прочитал, что при создании экземпляров лучше заносить каждую кнопку в массив, но получается чтобы к ней обратится надо знать номер элемента массива, что соответствует номеру кнопки, который я хочу найти.
ramshteks
01.09.2008, 18:17
во первых послушай старших и сделай массив!
во вторых странно другой почему компилятор не выдает ошибки про получение параметра конструктором, тк как
var playlistButton:MyButton = new MyButton(i);
ты присваиваешь номер
public function MyButton(ПУСТО О_о)
скажи честно у тя кнопочки то появляются?
ramshteks
Появляются) Я просто сам не знаю откуда я скопировал так криво. :rolleyes: public function MyButton(i:int)
На самом деле подумал, почитал, узнал о чудесной штуке e.target и написал через массив, все работает, буду делать дальше)
public function createButtons()
{
buttonArray = new Array();
for (var i:int = 0; i < playList.length; i++)
{
var playlistButton:MyButton = new MyButton(i);
buttonArray.push(playlistButton);
buttonArray[i].x = 50;
buttonArray[i].y = i*25;
buttonArray[i].songname.text = "hello"+i;
buttonArray[i].addEventListener(MouseEvent.CLICK, handleButtonClick);
addChild(buttonArray[i]);
};
};
private function handleButtonClick(e:MouseEvent):void
{
trace(e.target.buttonNumber);
};
ramshteks
01.09.2008, 18:37
var playlistButton:MyButton = new MyButton(i);
замени на
buttonArray.push(new MyButton(i));
не зачем создавать бесполезную локальную переменную)
а buttonArray[i].x = 50;
buttonArray[i].y = i*25;
buttonArray[i].songname.text = "hello"+i;
вполне можно запихнуть в конструктор майбаттона.
Апну эту темку чтоб не создавать новую.
package {
import flash.display.MovieClip;
import flash.events.*;
import flash.geom.Rectangle;
import flash.text.TextField;
import flash.utils.getDefinitionByName;
public class MyButton extends MovieClip {
public var songButton:MovieClip;
public var songname:TextField;
public var buttonNumber:int;
public function MyButton(i:int) {
this.buttonNumber = i;
init();
}
private function init():void {
songname = new TextField();
songButton = new MovieClip();
songButton.graphics.drawRect(songname.x, songname.y, songname.width, songname.height);
songButton.graphics.endFill();
songButton.addChild(songname);
songname.mouseEnabled = false;
songButton.buttonMode = true;
addChild(songButton);
}
}
}
и
package {
import flash.display.MovieClip;
import flash.events.*;
import MyButton;
public class Main extends MovieClip {
public function Main() {
createButtons();
}
public function createButtons() {
var buttonArray:Array = new Array();
var i:int = 0;
for (i=0; i < 40; i++) {
var playlistButton:MyButton = new MyButton(i);
buttonArray.push(playlistButton);
buttonArray[i].x = 50;
buttonArray[i].y = i*25;
buttonArray[i].songname.text = "hello"+i;
buttonArray[i].addEventListener(MouseEvent.CLICK, handleButtonClick);
addChild(buttonArray[i]);
}
}
private function handleButtonClick(e:MouseEvent):void {
trace(e.target);
}
}
}
Трейс выводит [object MovieClip], а как получить доступ к обьекту MyButton и его переменным?
buttonArray[i].mouseChildren = false;
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.