Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
HONOR Magic V6 è arrivato in Italia a 2.299,90 euro con una promessa precisa: unire 4 mm di spessore da aperto (8,75 mm chiuso nel modello White, 9 mm negli altri colori) a una batteria da 6.660 mAh, la più capiente mai vista su un pieghevole. Lo abbiamo usato per oltre una settimana in versione Red 16/512 GB per capire se lo Snapdragon 8 Elite Gen 5 tiene testa alla concorrenza anche fuori dai benchmark ufficiali
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-03-2012, 13:15   #1
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
[Java - Trick(eballacche)] Icone e Layout svg

Non che non abbia voglia di fare quello che devo e quindi io stia qui a far ballare la scimmia MA condivido due trucconi che ultimamente mi capita di usare spesso.

Libreria: http://svgsalamander.java.net/

Truccone numero uno: icone.

Pigliate un editor tipo inkscape, è facile disegnare icone. Esportarle, ridimensionarle, impacchettarle... è una palla tremenda. Che ti fa il bradiprogrammatore? Mi usa direttamente il file svg. Dato l'url di un file svg un'istanza della classe UIIcons che segue genera sottoimmagini:

Codice:
package it.tukano.utilities.ui;

import com.kitfox.svg.RenderableElement;
import com.kitfox.svg.SVGCache;
import com.kitfox.svg.SVGDiagram;
import com.kitfox.svg.SVGElement;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.net.URI;
import java.net.URL;
import javax.swing.ImageIcon;

/**
 * Generates a pack of icons from a svg document
 * @author utente4
 */
public class UIIcons {
    private final SVGDiagram diagram;
    
    public UIIcons(URL svgfile) {
        URI uri = SVGCache.getSVGUniverse().loadSVG(svgfile);
        diagram = SVGCache.getSVGUniverse().getDiagram(uri);
    }
    
    public ImageIcon getIcon(String id, Dimension size) {
        BufferedImage image = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB);
        SVGElement element = diagram.getElement(id);
        if(element == null) element = diagram.getElement(id.toLowerCase());
        if(element == null) element = diagram.getElement(id.toUpperCase());
        if(element instanceof RenderableElement) try {
            RenderableElement re = (RenderableElement) element;
            Rectangle bounds = re.getBoundingBox().getBounds();
            double scaleX = size.getWidth() / bounds.getWidth();
            double scaleY = size.getHeight() / bounds.getHeight();
            Graphics2D graphics = image.createGraphics();
            graphics.scale(scaleX, scaleY);
            graphics.translate(-bounds.getX(), -bounds.getY());
            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            re.render(graphics);
        } catch(Exception ignore) {}
        return new ImageIcon(image);
    }
}
Uso:

UIIcons icons = new UIIcons(someclass.getResource("pippo.svg"));
Icon salva24 = icons.getIcon("salva", new Dimension(24, 24));
Icon salva16 = icons.getIcon("salva", new Dimension(16, 16));

I "nomi" delle icone sono gli ID degli elementi SVG (di solito un gruppo, con inkscape si associano id con "proprietà oggetto") a cui corrispondono le immagini.

Truccone 2: layout.

Se si possono prendere immagini allora si possono anche prendere delle aree a con le aree si possono fare dei layout manager.

Codice:
package it.tukano.utilities.ui;

import com.kitfox.svg.*;
import java.awt.*;
import java.net.URI;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SvgLayoutManager implements LayoutManager {

    private final Map<Component, Rectangle> boundsMap = new HashMap<>();
    private final SVGDiagram diagram;
    private final boolean useSvgWidth;
    
    public SvgLayoutManager(String resource) {
        this(SvgLayoutManager.class.getResource(resource), false);
    }
    
    /**
     * Instance initializer
     */
    public SvgLayoutManager(URL svguri, boolean useSvgWidth) {
        URI uri = SVGCache.getSVGUniverse().loadSVG(svguri);
        diagram = SVGCache.getSVGUniverse().getDiagram(uri);
        this.useSvgWidth = useSvgWidth;
    }
    
    public SvgLayoutManager(URL svguri) {
        this(svguri, false);
    }

    @Override
    public void addLayoutComponent(String name, Component comp) {
        SVGElement element = findDiagramElement(name);
        if(element instanceof RenderableElement) {
            RenderableElement re = (RenderableElement) element;
            try {
                Rectangle bounds = re.getBoundingBox().getBounds();
                if(bounds != null && name != null) {
                    boundsMap.put(comp, bounds);
                } else {
                    Logger.getLogger(SvgLayoutManager.class.getName()).log(Level.INFO, "NO BOUNDS FOR COMPONENT " + name);
                }
            } catch (SVGException ex) {
                Logger.getLogger(SvgLayoutManager.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            Logger.getLogger(SvgLayoutManager.class.getName()).log(Level.INFO, "NOT RENDERABLE " + element);
        }
    }

    @Override
    public void removeLayoutComponent(Component comp) {
        boundsMap.remove(comp);
    }

    @Override
    public Dimension preferredLayoutSize(Container parent) {
        return minimumLayoutSize(parent);
    }

    @Override
    public Dimension minimumLayoutSize(Container parent) {
        synchronized(parent.getTreeLock()) {
            final Insets insets = parent.getInsets();
            int w = 0;
            int h = 0;
            for (Rectangle rectangle : boundsMap.values()) {
                w = Math.max(w, rectangle.x + rectangle.width);
                h = Math.max(h, rectangle.y + rectangle.height);
            }
            if(useSvgWidth) {
                w = (int) diagram.getWidth();
            }
            w += insets.left + insets.right;
            h += insets.top + insets.bottom;
            return new Dimension(w, h);
        }
    }

    @Override
    public void layoutContainer(Container parent) {
        synchronized (parent.getTreeLock()) {
            final Insets insets = parent.getInsets();
            final int x = insets.left;
            final int y = insets.top;
            for (Component component : parent.getComponents()) {
                Rectangle bounds = boundsMap.get(component);
                if(bounds != null) {
                    component.setBounds(x + bounds.x, y + bounds.y, bounds.width, bounds.height);
                }
            }
        }
    }

    private SVGElement findDiagramElement(String name) {
        SVGElement child = diagram.getElement(name);
        if(child == null) child = diagram.getElement(name.toLowerCase());
        if(child == null) child = diagram.getElement(name.toUpperCase());
        return child;
    }
}
Che fa 'sta cosa. Dato un documento svg lo usa come una mappa nome-area rettangolare. Il nome è l'id di un qualsiasi elemento del documento svg.

Quando dico:

JPanel p = new JPanel(new SVGLayoutManager(url documento svg));
p.add("pulsante", new JButton("..:"))

Il layout manager piglia la stringa "pulsante", va a vedere nel documento svg se c'è un elemento di id "pulsante", se c'è calcola l'area di quell'elemento e la associa al pulsante.

Non è esattamente una bella cosa da fare, perchè le aree in questo modo sono fisse - al massimo le si potrebbe fare proporzionali - ma nel contesto in cui l'ho scritto - un programma con uno svalangone di form che oltretutto cambiano un giorno sì e l'altro pure - definire la struttura del form con inkscape è molto più comodo che non farlo con l'editor di form o a mano.

E via a divertirsi di nuovo...
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 19-03-2012, 13:37   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Aww... fichissime le icone svg a dimensione variabile on-demand; valanghe di tempo (e frustrazione) risparmiate, grazie PGI-Bis
EDIT:
non conosco bene il formato svg, per cui chiedo: nel disegnare l'elemento originale pensando di derivarne poi degli altri ridimensionati è neccessario/consigliabile usare una qualche dimensione specifica (es.: la più grande che si pensa di usare) oppure la questione è assolutamente irrilevante (vector graphic)?
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 19-03-2012 alle 13:42.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-03-2012, 14:26   #3
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
E' irrilevante, svg è vettoriale e viene "disegnato" da salamander usando le corrispondenti funzioni di Java2D
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
'Non ci interessano i segreti di Apple':...
Genitori troppo connessi: uno studio riv...
Motorola conferma l'arrivo del nuovo Edg...
Smascherata la truffa dei finti SSD da 1...
Xiaomi 18 Pro: chip a 2 nm, Privacy Disp...
Il 71% degli autovelox italiani era fuor...
La Cina svela descrive la sua arma a mic...
Le 12 offerte Amazon TOP del weekend: ai...
Mini proiettore portatile a 36,99€: otti...
RTX 5070 a 599€ e RTX 5060 Ti a 357€, do...
In Cina il mega-impianto solare a sali f...
Xiaomi Air Fryer Essential 6L: ha tutto ...
Apple riduce la produzione di iPhone 17:...
Lancio del razzo spaziale cinese Lunga M...
SpaceX Starship: Super Heavy Booster 20 ...
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: 10:53.


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