Torna indietro   Hardware Upgrade Forum > Software > Programmazione

4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso
Titan Army P2712V è un monitor da 27 pollici che unisce due anime in un unico prodotto: da un lato la qualità visiva del 4K UHD a 160 Hz, dall'altro la velocità estrema del Full HD a 320 Hz. Con pannello Fast IPS, HDR400, Adaptive-Sync, illuminazione RGB e regolazioni ergonomiche, punta a soddisfare sia i giocatori competitivi che i content creator
OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla
OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla
OPPO Watch X2 Mini è uno smartwatch compatto capace di offrire un'esperienza completa di monitoraggio della salute e fitness con una cassa da 43 mm che può adattarsi a qualsiasi tipo di polso, dal più grande al - soprattutto - più piccolo. Con l'architettura dual-chip e un'autonomia che può coprire due giorni con tranquillità, rappresenta la soluzione ideale per chi cerca prestazioni premium in un formato ridotto.
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione
Dopo il recente lancio della serie Xiaomi 15T di Monaco, vi parliamo oggi della versione più performante della nuova famiglia, ovvero Xiaomi 15 T Pro. Vi raccontiamo la nostra prova nel dettaglio, spiegando perché a questo prezzo e in questa fascia, questo smartphone ha davvero senso tenerlo in seria considerazione.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-04-2009, 18:24   #1
Genymus
Senior Member
 
L'Avatar di Genymus
 
Iscritto dal: Oct 2007
Messaggi: 364
[ Applet Java ] Scorrimento Immagini - Genymus

Salve, avrei bisogno di una applet java che faccia scorrere orrizzontalmente verso destra una serie di immagini in continuazione ripartendo dalla prima quando le ha visualizzate tutte.
Grazie

Genymus
__________________
Genymus!!!
"Che cosa vorreste far incidere sulla vostra tomba?". "Torno fra 5 minuti."
"Lucido" è quando credi soltanto a metà di ciò che ti dicono. "Brillante" è quando sai a quale metà credere.
"Pensa, ogni volta che respiro muore un uomo." "Hai provato a fare qualcosa per l'alito?"

Aforismieaforismi.it
Genymus è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 19:41   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Si tratta semplicemente di usare un offset per spostare l'origine degli assi tra un'invocazione e l'altra di:

Codice:
for(int i = 0; i < maxFramesPerPage; i++) {
    g.drawImage(frames[i], offsetX, 0, null);
}
Qui maxFramesPerPage è calcolato come il numero massimo di immagini visualizzabili in un un'unica schermata più uno.

L'offset varia da 0 a -frames[0].getWidth() (supponendo che frames sia un array di BufferedImage).

Quando l'offset raggiunge -frames[0].getWidth() fai scorrere il vettore a sinistra e aggiungi tante immagini quante sono necessarie a riempire nuovamente lo schermo.

Nulla di particolarmente esotico.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2009, 21:12   #3
Genymus
Senior Member
 
L'Avatar di Genymus
 
Iscritto dal: Oct 2007
Messaggi: 364
penso di aver capito...
può postarmi il codice completo?
__________________
Genymus!!!
"Che cosa vorreste far incidere sulla vostra tomba?". "Torno fra 5 minuti."
"Lucido" è quando credi soltanto a metà di ciò che ti dicono. "Brillante" è quando sai a quale metà credere.
"Pensa, ogni volta che respiro muore un uomo." "Hai provato a fare qualcosa per l'alito?"

Aforismieaforismi.it
Genymus è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 00:16   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Come no, eccolo qua.

Codice:
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import javax.imageio.*;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.util.*;

public class SlideApplet extends JApplet {
	private final Screen SCREEN = new ScreenImpl();
	
	private void initializeUI() {
		add(SCREEN.getComponent());
		String speedValue = getParameter("speed");
		if(speedValue != null) {
			try {
				SCREEN.setSpeed(Float.parseFloat(speedValue));
			} catch(NumberFormatException ex) {
				System.err.println("speed property " + speedValue + " not a float. Using default.");
			}
		}
		try {
			URL list = new URL(getCodeBase() + "/" + getParameter("imagelist"));
			SCREEN.setImages(list);
			SCREEN.start();
			System.out.println("screen on line");
		} catch(MalformedURLException ex) {
			System.err.println("whops, wrong url!");
			ex.printStackTrace();
		}
	}
	
	public void init() {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				initializeUI();
			}
		});
	}
	
	public void stop() {
		SCREEN.stop();
	}
}

interface Screen {
	void setSpeed(float value);
	void setImages(URL pathListUrl);
	void start();
	void stop();
	JComponent getComponent();
}

class Ticker {
	private long then;
	private long tick;
	
	public void start() {
		then = System.nanoTime();
	}
	
	public void update() {
		long now = System.nanoTime();
		tick = (now - then) / 1000000;
		then = now;
	}
	
	public long getTick() {
		return tick;
	}
}

class ScreenImpl extends JPanel implements Screen {
	private final ActionListener LOOP = new ActionListener() {
		public void actionPerformed(ActionEvent e) { slide(); }
	};
	private final javax.swing.Timer ANIMATOR = new javax.swing.Timer(5, LOOP);
	private final CopyOnWriteArrayList<String> IMAGES = new CopyOnWriteArrayList<String>();
	private final ImageLoader IMAGE_LOADER = new ImageLoaderImpl();
	private final AtomicInteger OFFSET_X = new AtomicInteger();
	private final AtomicInteger NEXT_IMAGE = new AtomicInteger();
	private final AtomicBoolean WAITING_LOAD = new AtomicBoolean();
	private volatile float speed = 0.05f;
	
	/** edt fields */
	private final Ticker TICKER = new Ticker();
	private final LinkedList<BufferedImage> FRAMES = new LinkedList<BufferedImage>();
	
	public void setSpeed(float value) {
		if(value < 0.01f) {
			System.err.println(value + " too low");
		} else {
			speed = value;
		}
	}
	
	public void setImages(final URL pathListUrl) {
		if(pathListUrl == null) {
			System.err.println("ScreenImpl, method setImages, url is null");
			return;
		}
		
		Thread runner = new Thread() {
			public void run() {
				try {
					LinkedList<String> list = new LinkedList<String>();
					Scanner in = new Scanner(pathListUrl.openStream());
					while(in.hasNextLine()) {
						list.add(in.nextLine());
					}
					setImages(list);
				} catch(IOException ex) {
					return;
				}
			}
		};
		runner.setDaemon(true);
		runner.start();
	}
	
	public void setImages(Collection<String> paths) {
		stop();
		IMAGES.clear();
		IMAGES.addAll(paths);
		OFFSET_X.set(0);
		NEXT_IMAGE.set(0);
		start();
	}
	
	public JComponent getComponent() {
		return this;
	}
	
	private void slide() {
		TICKER.update();
		int paintSize = OFFSET_X.get() - getWidth();
		for(int i = 0; i < FRAMES.size(); i++) {
			paintSize += FRAMES.get(i).getWidth();
		}
		if(paintSize <= getWidth()) {
			loadNextFrame();
		} else {
			int delta = -(int)Math.round(speed * TICKER.getTick());
			if(OFFSET_X.addAndGet(delta) + FRAMES.get(0).getWidth() <= 0) {
				OFFSET_X.set(0);
				FRAMES.remove(0);
			}
			repaint();
		}
	}
	
	private void loadNextFrame() {
		if(IMAGES.size() == 0) {
			return;
		}
		if(WAITING_LOAD.get()) {
			return;
		}
		WAITING_LOAD.set(true);
		
		URL address = getClass().getResource(IMAGES.get(NEXT_IMAGE.get()));
		IMAGE_LOADER.submit(new LoadImage(address, getGraphicsConfiguration()) {
			public void run() {
				FRAMES.add(getImage());
				WAITING_LOAD.set(false);
			}
		});
		if(address != null) {
			if(NEXT_IMAGE.incrementAndGet() == IMAGES.size()) {
				NEXT_IMAGE.set(0);
			}
		}
	}

	protected void paintComponent(Graphics graphics) {
		super.paintComponent(graphics);
		Graphics2D g = (Graphics2D)graphics;
		graphics.translate(OFFSET_X.get(), 0);
		int x = 0;
		
		for(BufferedImage image : FRAMES) {
			int y = getHeight() / 2 - image.getHeight() / 2;
			graphics.drawImage(image, x, y, null);
			x += image.getWidth();
		}
	}
	
	public void start() {
		TICKER.start();
		ANIMATOR.start();
	}
	
	public void stop() {
		IMAGE_LOADER.stop();
		ANIMATOR.stop();
	}
}

abstract class LoadImage implements Runnable {
	private final URL ADDRESS;
	private final GraphicsConfiguration GC;
	private BufferedImage image;
	
	LoadImage(URL address, GraphicsConfiguration gc) {
		ADDRESS = address;
		GC = gc;
	}
	
	URL getAddress() {
		return ADDRESS;
	}
	
	GraphicsConfiguration getGC() {
		return GC;
	}
	
	synchronized void setImage(BufferedImage image) {
		this.image = image;
	}
	
	synchronized BufferedImage getImage() {
		return image;
	}
}

interface ImageLoader {
	void submit(LoadImage task);
	void stop();
}

class ImageLoaderImpl implements ImageLoader{
	private LinkedBlockingQueue<LoadImage> TASK_QUEUE = new LinkedBlockingQueue<LoadImage>();
	private final AtomicBoolean RUN = new AtomicBoolean(false);
	private Thread runner;
	
	private synchronized void setRunner(Thread t) {
		runner = t;
	}
	
	private synchronized Thread getRunner() {
		return runner;
	}
	
	public void stop() {
		Thread t = getRunner();
		if(t != null) {
			t.interrupt();
		}
		RUN.set(false);
	}
	
	public void submit(LoadImage task) {
		if(RUN.get() == false) {
			RUN.set(true);
			setRunner(new Thread() { public void run() { loop(); } });
			getRunner().start();
		}
		for(LoadImage i : TASK_QUEUE) {
			if(i.getAddress().equals(task.getAddress())) return;
		}
		TASK_QUEUE.offer(task);
	}
	
	private void loop() {
		while(RUN.get()) {
			try {
				execute(TASK_QUEUE.take());
			} catch(InterruptedException ex) {
				return;
			}
		}
	}
	
	private void execute(LoadImage task) {
		try {
			System.out.println("loading " + task.getAddress());
			BufferedImage image = ImageIO.read(task.getAddress());
			task.setImage(optImage(image, task.getGC()));
			EventQueue.invokeLater(task);
		} catch(IOException ex) {
			ex.printStackTrace();
		}
	}
	
	private BufferedImage optImage(BufferedImage source, GraphicsConfiguration gc) {
		if(gc == null) {
			return source;
		} else {
			BufferedImage opt = gc.createCompatibleImage(source.getWidth(), source.getHeight(),
				source.getTransparency());
			Graphics2D g = opt.createGraphics();
			g.drawImage(source, 0, 0, null);
			g.dispose();
			source.flush();
			return opt;
		}
	}
}
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 13:48   #5
Genymus
Senior Member
 
L'Avatar di Genymus
 
Iscritto dal: Oct 2007
Messaggi: 364
Salve, la compilazione funziona alla perfezione...
mi può dire anche il codice html per i parametri?
Grazie
__________________
Genymus!!!
"Che cosa vorreste far incidere sulla vostra tomba?". "Torno fra 5 minuti."
"Lucido" è quando credi soltanto a metà di ciò che ti dicono. "Brillante" è quando sai a quale metà credere.
"Pensa, ogni volta che respiro muore un uomo." "Hai provato a fare qualcosa per l'alito?"

Aforismieaforismi.it
Genymus è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 14:20   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
l'applet richiede due parametri, uno è speed l'altro è imagelist.

Il valore di speed è numerico ed esprime la velocità dello scorrimento delle immagini in pixel al millisecondo.

Il valore di imagelist è il percorso relativo di un file di testo. Questo file di testo contiene un elenco di percorsi relativi di file immagini (png, jpg, gif, bmp per la piattaforma standard Java SE 5+). Ogni linea di testo nel file contiene un percorso di immagine. Ad esempio il file potrebbe essere:

Codice:
/immagini/thumb001.png
/immagini/thumb002.png
/immagini/thum003.png
/immagini/thum004.png
e così via fino a dove si vuole. Durante l'esecuzione il programma usa questi percorsi per caricare le immagini da visualizzare. Supponendo che il file si chiami list.txt si trovi nella stessa cartella dell'applet il codice dell'applet potrebbe essere:

Codice:
<applet code="SlideApplet.class" width="400" height="400">
<param name="speed" value="0.05">
<param name="magelist" value="/list.txt">
</applet>
Non ho testato l'applet in linea. Adesso come adesso mi viene in mente che potrebbe esserci un problema nel caricamento delle immagini per via del getClass().getResource(). Forse sarebbe meglio usare dei percorsi assoluti.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 14:43   #7
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Ho testato l'applet in linea, il caricamento delle immagini è ok ma c'è una valutazione ottimistica della banda in dowload del client (quantomeno della mia).

Il codice del metodo slide() al momento attende il caricamento dell'immagine necessaria ad assicurare il riempimento dello schermo prima di procedere con l'animazione il che causa interruzione dello scorrimento.

Sostituendo il metodo slide con questa versione:

Codice:
	private void slide() {
		TICKER.update();
		int paintSize = OFFSET_X.get() - getWidth();
		for(int i = 0; i < FRAMES.size(); i++) {
			paintSize += FRAMES.get(i).getWidth();
		}
		if(paintSize <= getWidth()) {
			loadNextFrame();
		}
		
		if(FRAMES.size() == 0) return;
		
		int delta = -(int)Math.round(speed * TICKER.getTick());
		if(OFFSET_X.addAndGet(delta) + FRAMES.get(0).getWidth() <= 0) {
			OFFSET_X.set(0);
			FRAMES.remove(0);
		}
		repaint();
	}
l'animazione prosegue se esiste almeno un'immagine nel buffer FRAMES. L'effetto cambia perchè adesso l'applet non è più in grado di garantire che l'utente veda effettivamente almeno un'immagine. E' possibile cioè che una banda particolarmente orrenda o immagini di dimensioni rilevanti causino lo svuotamento dell'applet.

Qui è roba da alchimisti. Non si può proiettare un'immagine che non c'è e non si può caricare l'immagine più rapidamente di quanto permetta la connessione del client.

Una soluzione potrebbe essere la ripetizione di un'immagine scelta a caso tra quelle tolte dal buffer ma ancora memorizzate.

La trama si complica .
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 14:44   #8
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Ps. Se vuoi provare qui trovi l'applet in funzione (le immagini le ho praticamente recuperate dal cestino, non farci caso).
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2009, 20:53   #9
Genymus
Senior Member
 
L'Avatar di Genymus
 
Iscritto dal: Oct 2007
Messaggi: 364
Grazie
Funziona tutto alla perfezione.

Ps:Mi ha salvato la vita.

Genymus
__________________
Genymus!!!
"Che cosa vorreste far incidere sulla vostra tomba?". "Torno fra 5 minuti."
"Lucido" è quando credi soltanto a metà di ciò che ti dicono. "Brillante" è quando sai a quale metà credere.
"Pensa, ogni volta che respiro muore un uomo." "Hai provato a fare qualcosa per l'alito?"

Aforismieaforismi.it
Genymus è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla OPPO Watch X2 Mini, lo smartwatch compatto a cui...
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione Xiaomi 15T Pro, è lui il nuovo best buy? ...
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento Acer TravelMate P6 14 AI: il Copilot+ PC sotto i...
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
Realme celebra Game of Thrones con un nu...
Samsung Neo QLED 4K da 55'', offerta bom...
Iveco fornirà 129 minibus elettri...
Sbarter cambia le sfide nei videogiochi:...
Black Ops 6 gratuito nella settimana di ...
Rivian, più consegne che produzio...
40 aziende europee firmano contro Chat C...
Chrome: l'IA adesso controlla e revision...
Ionity lancia due nuovi abbonamenti per ...
Facebook cambia l'algoritmo dei Reels: e...
Higo è la scommessa 'smart' di Eu...
Corea del Nord accusata di aver rubato o...
Il PC portatile Lenovo IdeaPad Slim 5 co...
Antonio Felix Da Costa si unisce a Jagua...
Record mondiale di efficienza per le cel...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:52.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v