Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Menu usando le classi e riposizionamento bottoni

    Ciao a tutti/e, sto tentando di imparare l'uso delle classi ed ho un problema con un menu verticale che sto creando. In pratica l'effetto desiderato è questo: ho quattro bottoni allineati in verticale; ogni volta che avviene un rollover su un pulsante questo si allunga passando da 24px a 64px; ovviamente gli altri pulsanti devono riposizionarsi in modo da non sovrapporsi ed occupare globalmente la solita area dello stage.

    Le classi che utilizzo per l'animazione del bottone (ho usato classi trovate su "Flash Application Design Solutions - The Flash Usability Handbook" della serie FriendsOfEd e le ho riadattate in parte alle mie necessità, se ci fossero problemi di copyright cancellate pure il messaggio) sono le seguenti:

    SelectionSystem
    codice:
    class SelectionSystem extends MovieClip
    {
    	
    	// Array di dati passato al momento della creazione dell'istanza
    	private var systemData:Array;
    	
    	// nome di linkage del bottone
    	private var exportName:String;
    	
    	// Stato attuale espresso come valore numerico
    	private var currentSelection:Number;
    	
    	// Riferimento agli elementi
    	private var listItems:Array;
    	
    	// Costruttore
    	public function SelectionSystem()
    	{
    	}
    	
    	public function doInit(_systemData:Array, _exportName:String):Void
    	{
    		systemData = _systemData;
    		exportName = _exportName;
    		listItems = new Array();
    		attachButtonItems();
    	}
    	
    	/*
    	1) Allega un bottone clip per ogni elemento nell'array systemData.
    	2) Richiama init() sul nuovo clip, e passa ID ed elemento dati (label, etc.).
    	*/
    	private function attachButtonItems():Void
    	{
    		for(var i:Number = 0; i < systemData.length; i++)
    		{
    			var item:MovieClip = this.attachMovie(exportName,"Item_" + i,i);
    			item.init(this, i, systemData[i]);
    			listItems.push(item);
    		}
    	}
    	
    	/*
    	Richiamata dai bottoni per le variazioni di stato.
    	ID passata dal bottone che richiama il metodo.
    	*/
    	public function setSelection(_id:Number):Void
    	{
    		if(currentSelection!=_id)
    		{
    			listItems[currentSelection].setUnselected();
    			currentSelection = _id;
    			listItems[currentSelection].setSelected();
    			doAction();
    		}
    	}
    	
    	/*
    	Compie qualche azione in risposta alla nuova selezione;
    	override da parte della classe estesa.
    	*/
    	private function doAction():Void 
    	{ 
    	//override 
    	}
    	
    	public function getSystemData():Array
    	{
    		return systemData;
    	}
    	
    	public function getCurrentSelection():Number
    	{
    		return currentSelection;
    	}
    	
    	public function setCurrentSelection(_val:Number):Void
    	{
    		currentSelection = _val;
    	}
    }
    UIButton
    codice:
    import SelectionSystem;
    
    class UIButton extends MovieClip
    {
    	
    	//Riferimento ad un'istanza di SelectionSystem
    	private var selectionSystem:Object;
    	
    	//ID numerico passato da SelectionSystem 
    	private var id:Number;
    	
    	//Clip contenente il titolo
    	private var label_mc:MovieClip;
    	
    	//Clip contenente lo sfondo
    	private var sfondo_mc:MovieClip;
    	
    	//Controllo dello stato di selezione
    	private var selected:Boolean;
    	
    	//Contenitore delle informazioni visive personalizzate
    	private var itemData:Object;
    	
    	//Contenitore storia dell'oggetto
    	public var visited:Boolean;
    	
    	//Costruttore del bottone
    	public function UIButton()
    	{
    	}
    	
    	/* 
    	1) Impostazione di riferimento, ID, e dati 
    	2) Gestione dell'UI
    	*/
    	public function init(_selectionSystem:SelectionSystem, _id:Number, _itemData:Object):Void
    	{
    		_focusrect = false;
    		selectionSystem = _selectionSystem;
    		itemData = _itemData;
    		id = _id;
    		setLabel(itemData.label);
    		setPosition();
    		initMouseEvents();
    	}
    	
    	/*
    	Stato selezione: Rollover, Rollout
    	*/
    	public function setSelected():Void
    	{
    		selected = visited = true;
    		killMouseEvents();
    	}
    	
    	public function setUnselected():Void
    	{
    		selected = false;
    		initMouseEvents();
    	}
    	
    	private function setLabel():Void
    	{
    		label_mc.label_txt.text = itemData.label;
    	}
    	
    	private function setPosition():Void
    	{
    		// Override di questo metodo
    	}
    	
    	/*
    	Avverte selectionSystem del click e passa anche laID del clip
    	*/
    	private function handleRelease():Void
    	{
    		selectionSystem.setSelection(id);
    	}
    	
    	private function handlePress():Void 
    	{ 
    	// Override 
    	}
    	
    	private function handleRollOver():Void 
    	{ 
    	//override 
    	}
    	
    	private function handleRollOut():Void 
    	{ 
    	//override 
    	}
    	
    	/*
    	Cattura tutti i mouse events e li passa ai metodi interni dello handler
    	*/
    	
    	private function initMouseEvents() : Void
    	{
    		useHandCursor = true;
    		onRollOver = handleRollOver;
    		onRollOut = handleRollOut;
    		onReleaseOutside = handleRollOut;
    		onPress = handlePress;
    		onRelease = handleRelease;
    	}
    	
    	private function killMouseEvents():Void
    	{
    		useHandCursor = false;
    		delete onRollOver;
    		delete onRollOut;
    		delete onReleaseOutside;
    		delete this.onPress;
    		delete this.onRelease;
    	}
    	
    	public function getId():Number
    	{
    		return id;
    	}
    	
    	public function setId(_val:Number):Void
    	{
    		id = _val;
    	}
    }
    MenuButton
    codice:
    import UIButton;
    import mx.transitions.easing.*;
    import mx.transitions.Tween;
    
    class MenuButton extends UIButton
    {
    	private var sfondoTween:Tween;
    	
    	private var labelTween:Tween;
    	
    	public function MenuButton()
    	{
    	}
    	
    	private function setPosition():Void
    	{
    		_y = id * (_height + 8);
    	}
    	
    	private function handleRollOver():Void
    	{
    		sfondoTween = new Tween(sfondo_mc, "_alpha", Regular.easeOut, sfondo_mc._alpha, 50, .5, true);
    		sfondoTween += new Tween(sfondo_mc, "_height", Regular.easeOut, sfondo_mc._height, 48, .5, true);
    		labelTween = new Tween(label_mc, "_x", Regular.easeOut, label_mc._x, 15, .2, true);
    	}
    	
    	private function handleRollOut():Void
    	{
    		if (visited)
    		{
    			var fadeVal:Number = 25;
    		}
    		else
    		{
    			var fadeVal:Number = 25;
    		}
    		sfondoTween = new Tween(sfondo_mc, "_alpha", Regular.easeOut, sfondo_mc._alpha, fadeVal, .5, true);
    		sfondoTween += new Tween(sfondo_mc, "_height", Regular.easeOut, sfondo_mc._height, 24, .5, true);
    		labelTween = new Tween(label_mc, "_x", Regular.easeOut, label_mc._x, 5, .2, true);
    	}
    	
    	private function handlePress():Void
    	{
    		
    		sfondoTween = new Tween(sfondo_mc, "_alpha", Regular.easeOut, sfondo_mc._alpha, 25, .5, true);
    		sfondoTween += new Tween(sfondo_mc, "_height", Regular.easeOut, sfondo_mc._height, 24, .5, true);
    		labelTween = new Tween(label_mc, "_x", Regular.easeOut, label_mc._x, 5, .2, true);
    	}
    	
    	public function setUnselected():Void
    	{
    		super.setUnselected();
    		handleRollOut();
    	}
    }
    Come posso integrare le classi per ottenere il riposizionamento dei pulsanti?

  2. #2
    Quello che mi servirebbe è un codice da piazzare all'interno della classe MenuButton che ad ogni onRollOver, onRollOut e onPress comandi ad ognuno dei bottoni di riposizionarsi a seconda delle dimensioni e della posizione dei precedenti... un po' come succede per il menu del sito www.yugop.com ma in verticale invece che in orizzontale.

  3. #3
    Aggiornamento:

    Quello che servirebbe è che qualcuno mi spiegasse come fare in modo che, al momento del rollover su uno dei pulsanti creati tramite duplicateMovieClip, il codice ordini a tutte le istanze seguenti del bottone di compiere una certa azione (ovvero di riposizionarsi - per questo il codice l'ho già).

    Qualche anima pia che mi aiuti?

    Neanche un cane?
    Un gatto?
    Un ornitorinco?
    Uno spaturno?
    Due piccioni con una fava (quella tenetevela)?
    Mogli?
    Buoi?
    Paesi tuoi?


  4. #4
    Ho risolto, usando un bel po' di codice con una soluzione sicuramente non molto elegante.
    In compenso adesso ho il problema che non mi si caricano i clip delle pagine

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.