Autore Topic: Come mettere un disegno personalizzato come background di un bottone  (Letto 1052 volte)

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Ho creato una classe che estende una View e che disegna un triangolo nel seguente modo:

Codice (Java): [Seleziona]
public class TriangleView extends View {

        private Paint paint;

        public TriangleView(Context context) {
                super(context);
                paint = new Paint();
        }

        @Override
        protected void onDraw(Canvas canvas) {
                paint.setStyle(Paint.Style.STROKE);
                        paint.setStrokeWidth(2);
                        paint.setColor(Color.RED);
                        Path path = new Path();
                        path.moveTo(0, -10);
                        path.lineTo(5, 0);
                        path.lineTo(-5, 0);
                        path.close();
                        path.offset(10, 40);
                        canvas.drawPath(path, paint);
                        path.offset(50, 100);
                        canvas.drawPath(path, paint);
                        // offset is cumlative
                        // next draw displaces 50,100 from previous
                        path.offset(50, 100);
                        canvas.drawPath(path, paint);
        }
}

Volevo sapere come fare a mettere questo disegno come bacground di un bottone, ho scritto questo codice ma non so come completarlo:

Codice (Java): [Seleziona]
Button trangleButton = (Button) findViewById(R.id.triangle;
View plus = new TriangleView(this);
trangleButton.set ????

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Come mettere un disegno personalizzato come background di un bottone
« Risposta #1 il: 14 Gennaio 2011, 16:38:15 CET »
0
Hai bisogno di disegnare il canvas su una bitmap, e usarla come background.

Codice (Java): [Seleziona]
Bitmap bitMap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas c = new Canvas(bitMap);

Puoi chiamare quello che c'è all'interno di onDraw su questo canvas creato.

Alla fine bitMap conterrà il disegno che hai fatto, e potrà essere usata come background.

« Ultima modifica: 14 Gennaio 2011, 16:42:39 CET da 7h38ugg3r, Reason: Spieghiamo meglio. »
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Re:Come mettere un disegno personalizzato come background di un bottone
« Risposta #2 il: 14 Gennaio 2011, 17:03:05 CET »
0
Ciao 7h38ugg3r

non ho capito come fare a usare il tuo codice:

Codice (Java): [Seleziona]
Bitmap bitMap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas= new Canvas(bitMap);

Button trangleButton = (Button) findViewById(R.id.triangle;
View plus = new TriangleView(this);
trangleButton.setBackground(canvas !?!!?);

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Come mettere un disegno personalizzato come background di un bottone
« Risposta #3 il: 14 Gennaio 2011, 17:16:33 CET »
0
Puoi chiamare quello che c'è all'interno di onDraw su questo canvas creato.

La funzione onDraw che hai presentato in precedenza, utilizza un Canvas per disegnare.
Se invochi direttamente onDraw(canvas) sul Canvas appena creato, disegni sulla bitmap associata al canvas.

A questo punto non ti serve a niente la TringleView, ma hai bisogno solo di quello che c'è all'interno del metodo onDraw.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Re:Come mettere un disegno personalizzato come background di un bottone
« Risposta #4 il: 14 Gennaio 2011, 17:40:01 CET »
0
Ok una volta scritte queste linee di codice

Bitmap bitMap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas= new Canvas(bitMap);

come faccio a metterle come background del mio bottone?

dovrei fare l'ovverride del metodo onDraw del mio bottone?

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Come mettere un disegno personalizzato come background di un bottone
« Risposta #5 il: 14 Gennaio 2011, 17:51:03 CET »
+1
Ti ricordo che width ed height sono le dimension idella bitmap.

Codice (Java): [Seleziona]
Bitmap bitMap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas= new Canvas(bitMap);

Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(2);
paint.setColor(Color.RED);
Path path = new Path();
path.moveTo(0, -10);
path.lineTo(5, 0);
path.lineTo(-5, 0);
path.close();
path.offset(10, 40);
canvas.drawPath(path, paint);
path.offset(50, 100);
canvas.drawPath(path, paint);
path.offset(50, 100);
canvas.drawPath(path, paint);

Ho fatto quello che ho scritto prima.....


A questo punto dobbiamo settare come background del button un drawable: per questo ci viene in aiuto l'oggetto BitmapDrawable, che estende drawable e si può instanziare passandogli una bitmap:

Codice (Java): [Seleziona]
BitmapDrawable bDrawable = new BitmapDrawable(bitMap);
A questo punto puoi passare questo oggetto come drawable per il button, oppure prendere il drawable direttamente attraverso bDrawable.getCurrent();





7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Re:Come mettere un disegno personalizzato come background di un bottone
« Risposta #6 il: 14 Gennaio 2011, 18:07:03 CET »
0
Ho scritto questo

Button triangleButton = (Button) findViewById(R.id.triangleButton);
triangleButton.setBackgroundDrawable(bDrawable);

ho eseguito la mia app
il risultato è stato che il bottone è scomparso dal mio layout
ho provato a cliccare nel punto in cui prima c'era il bottone ma non succede nulla
se tolgo le linee di codice sopra rirportate il bottone riappare

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Come mettere un disegno personalizzato come background di un bottone
« Risposta #7 il: 15 Gennaio 2011, 12:10:47 CET »
0
ok, ora comincia la fase di debug :)

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:Come mettere un disegno personalizzato come background di un bottone
« Risposta #8 il: 15 Gennaio 2011, 13:18:56 CET »
0
Scusate ma, se l'obbiettivo è solo quello di impostare un background personalizzato ad un Button, perchè non realizzi un'immagine PNG e la imposti come background attraverso l'attributo android:background direttamente nel layout XML.
Se invece hai la necessità di ridisegnare le View per via programmatica, dovrai "forzare" la View a ridisegnarsi chiamando il metodo invalidate()

Per maggiori info Android Guide | Graphics

Offline andream1977

  • Utente normale
  • ***
  • Post: 260
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    windows xp
Re:Come mettere un disegno personalizzato come background di un bottone
« Risposta #9 il: 15 Gennaio 2011, 13:26:15 CET »
0
Teskio ho la necessità di ridisegnare il background non posso mettere un'immagine
Puoi farmi un esempio della tua idea?


7h38ugg3r ho provato il codice in un app separata da tutto il resto e funziona quindi passo a debuggare come mai non mi fa nella mia app
una domanda: l'altezza e la larghezza che devo dare alla Bitmap è la stessa di quella del bottone che la conterrà? cioè se il bottone è
largo 100dip devo specficare
int width=100;
oppure devo specificare la larghezza in base al tipo di terminale cioè così:
per ldpi -> int width=100*0.75;
per mdpi ->int width=100;
per hdpi ->int width=100*1.5;

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Come mettere un disegno personalizzato come background di un bottone
« Risposta #10 il: 15 Gennaio 2011, 18:11:27 CET »
+1
Creati un custom button in cui sovrascrivi l'onDraw...

Codice (Java): [Seleziona]
public class TriangleButton extends  Button {

        private Paint paint;

        public TriangleButton(Context context) {
                super(context);
                paint = new Paint();
        }

        @Override
        protected void onDraw(Canvas canvas) {
                paint.setStyle(Paint.Style.STROKE);
                        paint.setStrokeWidth(2);
                        paint.setColor(Color.RED);
                        Path path = new Path();
                        path.moveTo(0, -10);
                        path.lineTo(5, 0);
                        path.lineTo(-5, 0);
                        path.close();
                        path.offset(10, 40);
                        canvas.drawPath(path, paint);
                        path.offset(50, 100);
                        canvas.drawPath(path, paint);
                        // offset is cumlative
                        // next draw displaces 50,100 from previous
                        path.offset(50, 100);
                        canvas.drawPath(path, paint);
        }
}