martedì 19 marzo 2013
Mantenere lo schermo acceso in Android
Per mantenere lo schermo acceso in una applicazione Android si puo' aggiungere la seguente riga nella funzione OnCreate
------------------------------------
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Wav file in Android
Per emettere suoni in un programma Android la prima cosa da fare e' trovare un file con il suono desiderato.
Una ottima fonte di suoni gratuiti e' Freesound.org
Una volta scaricato il file wav si clicca sulla cartella /res del progetto e si crea un nuovo folder denominato raw (si avra' quindi /res/raw) dove si copia il file del suono
a questo punto si puo' inserire questa funzione (copiata da qui) dove il suono in questo caso e' chiamato beep (da notare che si omette l'estensione)
-------------------------------------------------------------
private void playAlarm() {
MediaPlayer mp = MediaPlayer.create(this,R.raw.beep);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
Una ottima fonte di suoni gratuiti e' Freesound.org
Una volta scaricato il file wav si clicca sulla cartella /res del progetto e si crea un nuovo folder denominato raw (si avra' quindi /res/raw) dove si copia il file del suono
a questo punto si puo' inserire questa funzione (copiata da qui) dove il suono in questo caso e' chiamato beep (da notare che si omette l'estensione)
-------------------------------------------------------------
private void playAlarm() {
MediaPlayer mp = MediaPlayer.create(this,R.raw.beep);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
giovedì 14 marzo 2013
martedì 12 marzo 2013
Esempio di utilizzo di Itext in Java
Presento adesso un esempio reale dell'utilizzo della libreria IText per la creazione di pettorali per una corsa podistica.
La caratteristica dei pettorali era quella di dover contenere, oltre al numero, anche il relativo QrCode. Il pettorale e' quindi determinato dalla sovrapposizione di una immagine di base con i logo, il QrCode ed il numero. Il tutto e' gia' formattato per andare direttamente in tipografia (il foglio in formato Super A3 comprende 4 numeri che saranno successivamente tagliati)
Il codice per la generazione dei Pdf e' il seguente. Si deve precisare che le immagini dei QrCode erano gia' state create con il programma presentato in un precedente post e viene usato un font speciale (CITYB.ttf)
----------------------------------------------------------------------
package pettorale;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
/**
*
* @author l.innocenti
*/
public class Pettorale {
private static PdfWriter writer;
public static void main(String[] args) throws BadElementException, MalformedURLException, IOException {
//String numero = args[0];
String numero = "175";
int inizio = Integer.parseInt(numero);
BufferedOutputStream out = null;
try {
out = new BufferedOutputStream (new FileOutputStream (new File ("Pettorale_"+numero+"_"+Integer.toString(inizio+3) +".pdf")));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//Definisce le dimensioni del foglio come SuperA3 (45x32 cm)
//Itext usa una unita' di misura in punti tipografici
//1 cm = 28.35 unita' per cui le dimesioni del foglio sono
//45 cm = 1285 u
//32 cm = 907 u
Rectangle pagina = new Rectangle(1275, 907);
Document doc = new Document (pagina,0,0,0,0);
try
{
writer = PdfWriter.getInstance (doc, out);
doc.open ();
PdfContentByte canvas = writer.getDirectContent();
//inserisce lo sfondo
Image pettorale = Image.getInstance("pettorale/vuoto.png");
pettorale.setAbsolutePosition(0f, 0f);
pettorale.scalePercent(24.5f);
doc.add(pettorale);
//inserisce il QrCode del numero del pettorale
Image qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio) +".png");
qrcode.setAbsolutePosition(475f, 620f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//2° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+1) +".png");
qrcode.setAbsolutePosition(1125f, 620f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//3° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+2) +".png");
qrcode.setAbsolutePosition(475f, 170f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//4° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+3) +".png");
qrcode.setAbsolutePosition(1125f, 170f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//scrive il numero del pettorale alla giusta posizione
//1° numero
if (inizio <10) {
absText(Integer.toString(inizio),270,625);
}
if ((inizio >=10) && (inizio <= 99)) {
absText(Integer.toString(inizio),235,625);
}
if ((inizio >=100) && (inizio <= 999)) {
absText(Integer.toString(inizio),150,625);
}
//2°numero
if (inizio+1 <10) {
absText(Integer.toString(inizio+1),920,625);
}
if ((inizio+1 >=10) && (inizio+1 <= 99)) {
absText(Integer.toString(inizio+1),885,625);
}
if ((inizio+1 >=100) && (inizio+1 <= 999)) {
absText(Integer.toString(inizio+1),790,625);
}
//3°numero
if (inizio+2 <10) {
absText(Integer.toString(inizio+2),270,165);
}
if ((inizio+2 >=10) && (inizio+2 <= 99)) {
absText(Integer.toString(inizio+2),235,165);
}
if ((inizio+2 >=100) && (inizio+2 <= 999)) {
absText(Integer.toString(inizio+2),150,165);
}
//4°numero
if (inizio+3 <10) {
absText(Integer.toString(inizio+3),920,165);
}
if ((inizio+3 >=10) && (inizio+3 <= 99)) {
absText(Integer.toString(inizio+3),885,165);
}
if ((inizio+3 >=100) && (inizio+3 <= 999)) {
absText(Integer.toString(inizio+3),790,165);
}
}
catch (DocumentException e)
{
System.out.println ("Fatal PDF error: " + e);
}
doc.close ();
}
private static void absText(String text, int x, int y) {
try {
PdfContentByte cb = writer.getDirectContent();
BaseFont slam = BaseFont.createFont("CITYB.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
cb.saveState();
cb.beginText();
cb.moveText(x, y);
cb.setFontAndSize(slam, 200);
cb.showText(text);
cb.endText();
cb.restoreState();
} catch (DocumentException | IOException e) {
}
}
}
La caratteristica dei pettorali era quella di dover contenere, oltre al numero, anche il relativo QrCode. Il pettorale e' quindi determinato dalla sovrapposizione di una immagine di base con i logo, il QrCode ed il numero. Il tutto e' gia' formattato per andare direttamente in tipografia (il foglio in formato Super A3 comprende 4 numeri che saranno successivamente tagliati)
![]() |
| Immagine di fondo |
![]() |
| QrCode |
![]() |
| Il risultato finale |
Il codice per la generazione dei Pdf e' il seguente. Si deve precisare che le immagini dei QrCode erano gia' state create con il programma presentato in un precedente post e viene usato un font speciale (CITYB.ttf)
----------------------------------------------------------------------
package pettorale;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
/**
*
* @author l.innocenti
*/
public class Pettorale {
private static PdfWriter writer;
public static void main(String[] args) throws BadElementException, MalformedURLException, IOException {
//String numero = args[0];
String numero = "175";
int inizio = Integer.parseInt(numero);
BufferedOutputStream out = null;
try {
out = new BufferedOutputStream (new FileOutputStream (new File ("Pettorale_"+numero+"_"+Integer.toString(inizio+3) +".pdf")));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//Definisce le dimensioni del foglio come SuperA3 (45x32 cm)
//Itext usa una unita' di misura in punti tipografici
//1 cm = 28.35 unita' per cui le dimesioni del foglio sono
//45 cm = 1285 u
//32 cm = 907 u
Rectangle pagina = new Rectangle(1275, 907);
Document doc = new Document (pagina,0,0,0,0);
try
{
writer = PdfWriter.getInstance (doc, out);
doc.open ();
PdfContentByte canvas = writer.getDirectContent();
//inserisce lo sfondo
Image pettorale = Image.getInstance("pettorale/vuoto.png");
pettorale.setAbsolutePosition(0f, 0f);
pettorale.scalePercent(24.5f);
doc.add(pettorale);
//inserisce il QrCode del numero del pettorale
Image qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio) +".png");
qrcode.setAbsolutePosition(475f, 620f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//2° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+1) +".png");
qrcode.setAbsolutePosition(1125f, 620f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//3° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+2) +".png");
qrcode.setAbsolutePosition(475f, 170f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//4° numero
qrcode = Image.getInstance("qrcode/"+Integer.toString(inizio+3) +".png");
qrcode.setAbsolutePosition(1125f, 170f);
qrcode.scalePercent(120f);
doc.add(qrcode);
//scrive il numero del pettorale alla giusta posizione
//1° numero
if (inizio <10) {
absText(Integer.toString(inizio),270,625);
}
if ((inizio >=10) && (inizio <= 99)) {
absText(Integer.toString(inizio),235,625);
}
if ((inizio >=100) && (inizio <= 999)) {
absText(Integer.toString(inizio),150,625);
}
//2°numero
if (inizio+1 <10) {
absText(Integer.toString(inizio+1),920,625);
}
if ((inizio+1 >=10) && (inizio+1 <= 99)) {
absText(Integer.toString(inizio+1),885,625);
}
if ((inizio+1 >=100) && (inizio+1 <= 999)) {
absText(Integer.toString(inizio+1),790,625);
}
//3°numero
if (inizio+2 <10) {
absText(Integer.toString(inizio+2),270,165);
}
if ((inizio+2 >=10) && (inizio+2 <= 99)) {
absText(Integer.toString(inizio+2),235,165);
}
if ((inizio+2 >=100) && (inizio+2 <= 999)) {
absText(Integer.toString(inizio+2),150,165);
}
//4°numero
if (inizio+3 <10) {
absText(Integer.toString(inizio+3),920,165);
}
if ((inizio+3 >=10) && (inizio+3 <= 99)) {
absText(Integer.toString(inizio+3),885,165);
}
if ((inizio+3 >=100) && (inizio+3 <= 999)) {
absText(Integer.toString(inizio+3),790,165);
}
}
catch (DocumentException e)
{
System.out.println ("Fatal PDF error: " + e);
}
doc.close ();
}
private static void absText(String text, int x, int y) {
try {
PdfContentByte cb = writer.getDirectContent();
BaseFont slam = BaseFont.createFont("CITYB.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
cb.saveState();
cb.beginText();
cb.moveText(x, y);
cb.setFontAndSize(slam, 200);
cb.showText(text);
cb.endText();
cb.restoreState();
} catch (DocumentException | IOException e) {
}
}
}
----------------------------------------------------------------------
Aggiornamento software Lumix DMC-LS5
Non pensavo che mi sarei mai ritrovato ad aggiornare il firmware ad una macchina fotografica (sarebbe curioso farlo con una Voigtlander a rullino) ma e' accaduto con la Lumix DMC-LS5
In sostanza si deve scaricare il file di aggiornamento PDCE570a.elf ed inserirlo nella radice della scheda SD. Si accende quindi la macchina premendo contemporaneamente il tasto di scatto ed il tasto di accensione.
Dopo qualche secondo la macchina si spenge in automatico ed al nuovo riavvio si vede l'avvenuto aggiornamento
La prossima volta voglio i tasti CTRL+ALT+DEL insieme al pulsante di scatto
In sostanza si deve scaricare il file di aggiornamento PDCE570a.elf ed inserirlo nella radice della scheda SD. Si accende quindi la macchina premendo contemporaneamente il tasto di scatto ed il tasto di accensione.
Dopo qualche secondo la macchina si spenge in automatico ed al nuovo riavvio si vede l'avvenuto aggiornamento
La prossima volta voglio i tasti CTRL+ALT+DEL insieme al pulsante di scatto
Falsi (Fake) Casio F-91W e G-9200-Riseman
Recentemente mi si e' rotto il cinturino del mio Casio F-91W (cosa abbastanza per questo orologio che e' sostanzialmente indistruttibile) e cercando mi sono accorto che i cinturini vanno dai 5 ai 10 euro mentre l'orologio nuovo completo viene venduto dai 17 ai 25 euro....insomma non conviene sostituito il pezzo
Andando a giro su Alibaba ho trovato un modello di Casio F-91W a 3 dollari (spedizione compresa)...un affare. Una volta arrivato l'oggetto mi sono reso conto che non si tratta di un vero Casio ma di una replica, seppur ben fatta. Esternamente le differenze sono solo sul fondello (la copia indica Made in China mentre l'originale Made in Thailandia) e sulla luce dell'illuminazione (sulla replica e' blu)
Con lo stesso ordine ho preso anche un Casio G9200 a meno di 9 euro per una eventuale sostituzione del mio Casio W-753 (anche questo con problemi di cinturino). Francamente non sapevo che questo e' il modello di punta della serie G-Shock con prezzi di oltre 150 euro e la cosa mi doveva insospettire...io cercavo solo un orologio con un altimetro integrato.
Andando a giro su Alibaba ho trovato un modello di Casio F-91W a 3 dollari (spedizione compresa)...un affare. Una volta arrivato l'oggetto mi sono reso conto che non si tratta di un vero Casio ma di una replica, seppur ben fatta. Esternamente le differenze sono solo sul fondello (la copia indica Made in China mentre l'originale Made in Thailandia) e sulla luce dell'illuminazione (sulla replica e' blu)
| Originale a sinistra |
| Originale a sinistra |
Le funzioni dell'orologio sono le medesime nella copia e nell'originale
Inutile dire che anche questo e' una copia dell'oroginale ma le funzioni sono purtroppo differenti: non e' presente l'altimetro/barometro/termometro, non ha la calibrazione via radio e non possiede la cella solare
Il metodo piu' semplice per distinguere la copia dall'originale e' la presenza di una G nel cerchio rosso (che e' presente solo nella copia)
Insomma. ho speso 10 euro per due copie ma volendo in fondo avere due cinturini direi che la spesa e' stata congrua. In piu' ho imparato una lezione per il futuro
Il metodo piu' semplice per distinguere la copia dall'originale e' la presenza di una G nel cerchio rosso (che e' presente solo nella copia)
Insomma. ho speso 10 euro per due copie ma volendo in fondo avere due cinturini direi che la spesa e' stata congrua. In piu' ho imparato una lezione per il futuro
Selezionare scheda di rete per Internet su LInux
In questo post verra' descritto come gestire una scheda di rete wireless USB in Linux.
Nel caso, come il mio, il portatile non possegga un pulsante fisico per disattivare la scheda di rete integrata non e' proprio banale utilizzare la scheda di rete supplementare in quanto il sistema operativo riconosce per prima la scheda integrata e la usera' come default
Una soluzione semplice potrebbe essere quella di disattivare una interfaccia di rete con
ifconfig wlan0 down
in questo modo si spenge la scheda integrata (wlan0) ma ci si accorge subito che non e' la soluzione finale in quanto non si riesce a navigare su internet. In pratica si riesce ad utilizzare tutta la rete interna e si riesce a pingare il router ma nessun pacchetto viene instradato all'esterno
E' chiaro che deve essere configurata la tabella di routing
Se si digita route con le due schede attive si ottiene
---------------------------------------------------
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.0.1 0.0.0.0 UG 0 0 0 wlan0
link-local * 255.255.0.0 U 1000 0 0 wlan0
192.168.0.0 * 255.255.255.0 U 0 0 0 wlan0
disattivando la scheda integrata wlan0
---------------------------------------------------
si vede chiaramente la perdita dell'interfaccia di default
Supponendo che l'indirizzo del router di 192.168.168.0.1 si puo' scrivere
route add default gw 192.168.0.1 wlan1
a questo punto la tabella di routing viene cosi' modificata
---------------------------------------------------
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.0.1 0.0.0.0 UG 0 0 0 wlan1
link-local * 255.255.0.0 U 1000 0 0 wlan1
192.168.0.0 192.168.0.1 255.255.255.0 UG 0 0 0 wlan1
192.168.0.0 * 255.255.255.0 U 0 0 0 wlan1
Nel caso, come il mio, il portatile non possegga un pulsante fisico per disattivare la scheda di rete integrata non e' proprio banale utilizzare la scheda di rete supplementare in quanto il sistema operativo riconosce per prima la scheda integrata e la usera' come default
Una soluzione semplice potrebbe essere quella di disattivare una interfaccia di rete con
ifconfig wlan0 down
in questo modo si spenge la scheda integrata (wlan0) ma ci si accorge subito che non e' la soluzione finale in quanto non si riesce a navigare su internet. In pratica si riesce ad utilizzare tutta la rete interna e si riesce a pingare il router ma nessun pacchetto viene instradato all'esterno
E' chiaro che deve essere configurata la tabella di routing
Se si digita route con le due schede attive si ottiene
---------------------------------------------------
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.0.1 0.0.0.0 UG 0 0 0 wlan0
link-local * 255.255.0.0 U 1000 0 0 wlan0
192.168.0.0 * 255.255.255.0 U 0 0 0 wlan0
---------------------------------------------------
disattivando la scheda integrata wlan0
---------------------------------------------------
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
link-local * 255.255.0.0 U 1000 0 0 wlan1
192.168.0.0 * 255.255.255.0 U 0 0 0 wlan1
si vede chiaramente la perdita dell'interfaccia di default
Supponendo che l'indirizzo del router di 192.168.168.0.1 si puo' scrivere
route add default gw 192.168.0.1 wlan1
a questo punto la tabella di routing viene cosi' modificata
---------------------------------------------------
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.0.1 0.0.0.0 UG 0 0 0 wlan1
link-local * 255.255.0.0 U 1000 0 0 wlan1
192.168.0.0 192.168.0.1 255.255.255.0 UG 0 0 0 wlan1
192.168.0.0 * 255.255.255.0 U 0 0 0 wlan1
---------------------------------------------------
e si riesce a navigare in Internet
In conclusione la sequenza di comandi per utilizzare a pieno la scheda Usb e'
ifconfig wlan0 down
route add default gw 192.168.0.1 wlan1
e si riesce a navigare in Internet
In conclusione la sequenza di comandi per utilizzare a pieno la scheda Usb e'
ifconfig wlan0 down
route add default gw 192.168.0.1 wlan1
Errore Resource out of sync in Eclipse
Nel momento di esportare come file zip (Export to archive file) un progetto Android da Eclipse mi e' stato notificato l'errore di "Resource out of sync" su un file di cache del progetto.
La soluzione al problema risiede semplicemente nell'effettuare un Refresh del progetto
La soluzione al problema risiede semplicemente nell'effettuare un Refresh del progetto
venerdì 8 marzo 2013
Tastiera per MK808
Mi sono comprato per l'Mk808 una tastiera vera al posto del mouse Logitech che usavo fino ad ieri piu' che altro per la navigazione internet perche' digitare gli indirizzi con il topo e' piuttosto noioso
La scelta e' caduta su una Logitech K700 che, acquistata su un sito cinese, e' costata meno dei Fly Mouse (che adesso vanno cosi' di moda) ed ha un touchpad integrato sulla tastiera classica
La K700 funziona al volo sull'MK808 e sono riconosciuti quasi tutti i tasti (compresi i tasti volume, tasti cursore, tasto home e back)
La scelta e' caduta su una Logitech K700 che, acquistata su un sito cinese, e' costata meno dei Fly Mouse (che adesso vanno cosi' di moda) ed ha un touchpad integrato sulla tastiera classica
giovedì 7 marzo 2013
Creare file Jar con Eclipse
Per creare un file jar in Eclipse si deve prima cliccare sulla radice del progetto sulla finestra di sinistra e selezionare Export
Successivamente deve essere selezionato Runnable Jar File
Nell'ultima finestra, dal primo menu a tendina, deve essere selezionata la classe di lancio
Successivamente deve essere selezionato Runnable Jar File
Creare file Jar con Netbeans
Per ottenere dei file jar da distribuire di una propria applicazione da NetBeans e' sufficiente effettuare una Build del progetto (F11)
In questo modo viene creata una sottodirectory build nella quale sono contenuti tutti i file (librerie comprese) necessari per la redistribuzione dell'eseguibile
In questo modo viene creata una sottodirectory build nella quale sono contenuti tutti i file (librerie comprese) necessari per la redistribuzione dell'eseguibile
Creazione automatica QrCode in Java/Netbeans
Per generare QrCode in modo automatico in modo semplice si puo' utilizzare il metodo presentato a questo indirizzo
Si deve scaricare la libreria XZing e si devono aggiungere al progetto le librerie core e javase contenute nelle sottodirectory del file zip
il codice e' stato modificato in modo da accettare in input sulla riga di comando (nella variabile args) il contenuto del QrCode. Questa motiva permette mediante una procedura batch di creare in automatico quanti QrCode si desiderino
-----------------------------------------
package qrcode;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.util.Hashtable;
import com.google.zxing.client.j2se.MatrixToImageWriter;
/**
*
* @author l.innocenti
*/
public class QrCode {
public static void main(String[] args) {
Charset charset = Charset.forName("UTF-8");
CharsetEncoder encoder = charset.newEncoder();
byte[] b = null;
try {
// Convert a string to UTF-8 bytes in a ByteBuffer
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(args[0]));
b = bbuf.array();
} catch (CharacterCodingException e) {
System.out.println(e.getMessage());
}
String data;
try {
data = new String(b, "UTF-8");
// get a byte matrix for the data
BitMatrix matrix = null;
int h = 100;
int w = 100;
com.google.zxing.Writer writer = new MultiFormatWriter();
try {
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(2);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
matrix = writer.encode(data,
com.google.zxing.BarcodeFormat.QR_CODE, w, h, hints);
} catch (com.google.zxing.WriterException e) {
System.out.println(e.getMessage());
}
// change this path to match yours (this is my mac home folder, you can use: c:\\qr_png.png if you are on windows)
String filePath = args[0]+".png";
File file = new File(filePath);
try {
MatrixToImageWriter.writeToFile(matrix, "PNG", file);
System.out.println("printing to " + file.getAbsolutePath());
} catch (IOException e) {
System.out.println(e.getMessage());
}
} catch (UnsupportedEncodingException e) {
System.out.println(e.getMessage());
}
}
}
-----------------------------------------
Si deve scaricare la libreria XZing e si devono aggiungere al progetto le librerie core e javase contenute nelle sottodirectory del file zip
il codice e' stato modificato in modo da accettare in input sulla riga di comando (nella variabile args) il contenuto del QrCode. Questa motiva permette mediante una procedura batch di creare in automatico quanti QrCode si desiderino
-----------------------------------------
package qrcode;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.util.Hashtable;
import com.google.zxing.client.j2se.MatrixToImageWriter;
/**
*
* @author l.innocenti
*/
public class QrCode {
public static void main(String[] args) {
Charset charset = Charset.forName("UTF-8");
CharsetEncoder encoder = charset.newEncoder();
byte[] b = null;
try {
// Convert a string to UTF-8 bytes in a ByteBuffer
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(args[0]));
b = bbuf.array();
} catch (CharacterCodingException e) {
System.out.println(e.getMessage());
}
String data;
try {
data = new String(b, "UTF-8");
// get a byte matrix for the data
BitMatrix matrix = null;
int h = 100;
int w = 100;
com.google.zxing.Writer writer = new MultiFormatWriter();
try {
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(2);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
matrix = writer.encode(data,
com.google.zxing.BarcodeFormat.QR_CODE, w, h, hints);
} catch (com.google.zxing.WriterException e) {
System.out.println(e.getMessage());
}
// change this path to match yours (this is my mac home folder, you can use: c:\\qr_png.png if you are on windows)
String filePath = args[0]+".png";
File file = new File(filePath);
try {
MatrixToImageWriter.writeToFile(matrix, "PNG", file);
System.out.println("printing to " + file.getAbsolutePath());
} catch (IOException e) {
System.out.println(e.getMessage());
}
} catch (UnsupportedEncodingException e) {
System.out.println(e.getMessage());
}
}
}
-----------------------------------------
Il risultato e' una immagine Png con nome uguale al contenuto del QrCode
Per creare in automatico 1000 numeri QrCode di numeri progressivi si puo' creare un file batch su Windows con la seguente linea
-------------------------------------------------------------
FOR /L %%A IN (1,1,1000) DO java -jar Qrcode.jar %%A
mentre in Linux
-------------------------------------------------------------
#!/bin/bash
for i in {1..1000}
do
java -jar Qrcode.jar $i
done
--------------------------------------------------------------
-------------------------------------------------------------
FOR /L %%A IN (1,1,1000) DO java -jar Qrcode.jar %%A
-------------------------------------------------------------
mentre in Linux
-------------------------------------------------------------
#!/bin/bash
for i in {1..1000}
do
java -jar Qrcode.jar $i
done
--------------------------------------------------------------
mercoledì 6 marzo 2013
Prima applicazione in GDX
So bene che e' un giochino di una stupidita' allarmante ma considerando il fatto che e' stato fatto partendo da zero in meno di 3 ore e che puo' essere visualizzato su Android, Ios, Java (ovvero un indefinito universo di computer desktop e portatili) ed HTML5 la cosa diventa qualcosa di piu' di un giochino
Versione Desktop (Java)
Versione Android
la libreria riscala le dimensioni previste per la finestra alle reali dimensioni dello schermo del telefono, per questo motivo l'immagine risulta distorta (in origine la visualizzazione e' in landscape)
----------------------------------------------------
package com.me.mygdxgame;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.Sound;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector3;
public class MyGdxGame implements ApplicationListener {
private OrthographicCamera camera;
private SpriteBatch batch;
private Rectangle droid_s;
private Texture droidImage;
private Texture palloneImage;
private Rectangle pallone_s;
private int speed_x;
private int speed_y;
private Sound ballSound;
private int Screen_width;
private int Screen_height;
private int rimbalzi;
private SpriteBatch spriteBatch;
private BitmapFont font;
@Override
public void create() {
//carica il file degli sprite che sono nella directory assets
//gli sprite devono avere come dimensioni potenze di 2 (in questo caso sono 32x32 pixel)
droidImage = new Texture(Gdx.files.internal("data/droid.png"));
palloneImage = new Texture(Gdx.files.internal("data/pallone.png"));
//carica il font contenuto sempre dentro assets
font = new BitmapFont(Gdx.files.internal("data/arial.fnt"), Gdx.files.internal("data/arial.png"), false);
spriteBatch = new SpriteBatch(); //per la scritta
batch = new SpriteBatch(); // per gli sprite
//carica il suono
ballSound = Gdx.audio.newSound(Gdx.files.internal("data/palla.wav"));
//inizializza le variabili
Screen_width = 800;
Screen_height = 480;
rimbalzi = 0;
speed_x = 4 ; //velocita' della palla in pixel
speed_y = -4;
camera = new OrthographicCamera();
camera.setToOrtho(false, Screen_width, Screen_height);
//rettangolo del robottino
droid_s = new Rectangle();
droid_s.x = Screen_width/2 - 32 / 2;
droid_s.y = 10;
droid_s.width = 32;
droid_s.height = 32;
//rettangolo della palla
pallone_s = new Rectangle();
pallone_s.x = Screen_width/2 - 32 / 2;
pallone_s.y = Screen_height/2 - 32 / 2;;
pallone_s.width = 32;
pallone_s.height = 32;
}
@Override
//cancella tutto in uscita dal programma
public void dispose() {
droidImage.dispose();
palloneImage.dispose();
batch.dispose();
spriteBatch.dispose();
font.dispose();
ballSound.dispose();
}
@Override
public void render() {
Gdx.gl.glClearColor(0, 0, 0.2f, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
camera.update();
batch.setProjectionMatrix(camera.combined);
//controlla i rimbalzi
if (pallone_s.x < 0) speed_x = -speed_x;
if (pallone_s.x > 768) speed_x = -speed_x;
if (pallone_s.y == 64)
{
if ((pallone_s.x >= droid_s.x-32) && (pallone_s.x < droid_s.x+32))
{
//se rimbalza sul robottino inverte marcia e fa il suono
speed_y = -speed_y;
ballSound.play();
// aggiorna il numero di rimbalzi
rimbalzi++;
}
}
if (pallone_s.y < 0) //se il pallone esce dal basso reinizia da capo
{
pallone_s.x = Screen_width/2 - 32 / 2;
pallone_s.y = Screen_height/2 - 32 / 2;
speed_x = 4 ;
speed_y = -4;
rimbalzi = 0;
}
if (pallone_s.y > 448) speed_y = -speed_y;
//muove la palla
pallone_s.x = pallone_s.x-speed_x;
pallone_s.y = pallone_s.y-speed_y;
//aggiorna lo schermo
batch.begin();
batch.draw(droidImage,droid_s.x,droid_s.y);
batch.draw(palloneImage,pallone_s.x,pallone_s.y);
batch.end();
spriteBatch.begin();
font.draw(spriteBatch, Integer.toString(rimbalzi), 10, 320);
spriteBatch.end();
//gestisce l'input dell'utente e sposta il robottino
//se non si l'interfaccia touch il robottino si sposta tenendo premendo il tasto
//e muovendo il mouse
if(Gdx.input.isTouched()) {
Vector3 touchPos = new Vector3();
touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
camera.unproject(touchPos);
droid_s.x = touchPos.x;
}
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
----------------------------------------------------
Versione Desktop (Java)
Versione Android
la libreria riscala le dimensioni previste per la finestra alle reali dimensioni dello schermo del telefono, per questo motivo l'immagine risulta distorta (in origine la visualizzazione e' in landscape)
----------------------------------------------------
package com.me.mygdxgame;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.Sound;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector3;
public class MyGdxGame implements ApplicationListener {
private OrthographicCamera camera;
private SpriteBatch batch;
private Rectangle droid_s;
private Texture droidImage;
private Texture palloneImage;
private Rectangle pallone_s;
private int speed_x;
private int speed_y;
private Sound ballSound;
private int Screen_width;
private int Screen_height;
private int rimbalzi;
private SpriteBatch spriteBatch;
private BitmapFont font;
@Override
public void create() {
//carica il file degli sprite che sono nella directory assets
//gli sprite devono avere come dimensioni potenze di 2 (in questo caso sono 32x32 pixel)
droidImage = new Texture(Gdx.files.internal("data/droid.png"));
palloneImage = new Texture(Gdx.files.internal("data/pallone.png"));
//carica il font contenuto sempre dentro assets
font = new BitmapFont(Gdx.files.internal("data/arial.fnt"), Gdx.files.internal("data/arial.png"), false);
spriteBatch = new SpriteBatch(); //per la scritta
batch = new SpriteBatch(); // per gli sprite
//carica il suono
ballSound = Gdx.audio.newSound(Gdx.files.internal("data/palla.wav"));
//inizializza le variabili
Screen_width = 800;
Screen_height = 480;
rimbalzi = 0;
speed_x = 4 ; //velocita' della palla in pixel
speed_y = -4;
camera = new OrthographicCamera();
camera.setToOrtho(false, Screen_width, Screen_height);
//rettangolo del robottino
droid_s = new Rectangle();
droid_s.x = Screen_width/2 - 32 / 2;
droid_s.y = 10;
droid_s.width = 32;
droid_s.height = 32;
//rettangolo della palla
pallone_s = new Rectangle();
pallone_s.x = Screen_width/2 - 32 / 2;
pallone_s.y = Screen_height/2 - 32 / 2;;
pallone_s.width = 32;
pallone_s.height = 32;
}
@Override
//cancella tutto in uscita dal programma
public void dispose() {
droidImage.dispose();
palloneImage.dispose();
batch.dispose();
spriteBatch.dispose();
font.dispose();
ballSound.dispose();
}
@Override
public void render() {
Gdx.gl.glClearColor(0, 0, 0.2f, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
camera.update();
batch.setProjectionMatrix(camera.combined);
//controlla i rimbalzi
if (pallone_s.x < 0) speed_x = -speed_x;
if (pallone_s.x > 768) speed_x = -speed_x;
if (pallone_s.y == 64)
{
if ((pallone_s.x >= droid_s.x-32) && (pallone_s.x < droid_s.x+32))
{
//se rimbalza sul robottino inverte marcia e fa il suono
speed_y = -speed_y;
ballSound.play();
// aggiorna il numero di rimbalzi
rimbalzi++;
}
}
if (pallone_s.y < 0) //se il pallone esce dal basso reinizia da capo
{
pallone_s.x = Screen_width/2 - 32 / 2;
pallone_s.y = Screen_height/2 - 32 / 2;
speed_x = 4 ;
speed_y = -4;
rimbalzi = 0;
}
if (pallone_s.y > 448) speed_y = -speed_y;
//muove la palla
pallone_s.x = pallone_s.x-speed_x;
pallone_s.y = pallone_s.y-speed_y;
//aggiorna lo schermo
batch.begin();
batch.draw(droidImage,droid_s.x,droid_s.y);
batch.draw(palloneImage,pallone_s.x,pallone_s.y);
batch.end();
spriteBatch.begin();
font.draw(spriteBatch, Integer.toString(rimbalzi), 10, 320);
spriteBatch.end();
//gestisce l'input dell'utente e sposta il robottino
//se non si l'interfaccia touch il robottino si sposta tenendo premendo il tasto
//e muovendo il mouse
if(Gdx.input.isTouched()) {
Vector3 touchPos = new Vector3();
touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
camera.unproject(touchPos);
droid_s.x = touchPos.x;
}
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
----------------------------------------------------
Impostare i font per GDX con Hiero
La libreria grafica GDX necessita' che il formato grafico dei font sia di tipo particolare (con estensione fnt) e non il classico truetype od altri
per effettuare la conversione dai font gia' installati sulla macchina al formato GDX si puo' utilizzare il programma Hiero che si lancia
java -jar hiero.jar
Si apre la schermata sopra riportata dove si puo' scegliere il font e l'esportazione in fnt
Verranno creati due file che devono essere inseriti nella sottodirectory assets
Per utilizzare il font e creare una scritta su una finestra GDX il codice da inserire e'
----------------------------------
font = new BitmapFont(Gdx.files.internal("data/arial.fnt"), Gdx.files.internal("data/arial.png"), false);
spriteBatch = new SpriteBatch();
spriteBatch.begin();
font.draw(spriteBatch, "Luca", 10, 320);
spriteBatch.end();
per effettuare la conversione dai font gia' installati sulla macchina al formato GDX si puo' utilizzare il programma Hiero che si lancia
java -jar hiero.jar
Si apre la schermata sopra riportata dove si puo' scegliere il font e l'esportazione in fnt
Verranno creati due file che devono essere inseriti nella sottodirectory assets
Per utilizzare il font e creare una scritta su una finestra GDX il codice da inserire e'
----------------------------------
font = new BitmapFont(Gdx.files.internal("data/arial.fnt"), Gdx.files.internal("data/arial.png"), false);
spriteBatch = new SpriteBatch();
spriteBatch.begin();
font.draw(spriteBatch, "Luca", 10, 320);
spriteBatch.end();
Iscriviti a:
Post (Atom)
LLama3 Anita
A seguito di questo post ho provato a vedere ho provato a vedere cosa accadeva ad utilizzare un modello specifico per la lingua italiana in...
-
Aggiornamento questo e' la risposta degli sviluppatori First of all, almost all operating systems on both mobile and laptop/desktop n...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...















