Autore Topic: canvas + layout è possibile?  (Letto 516 volte)

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
canvas + layout è possibile?
« il: 09 Luglio 2013, 20:04:10 CEST »
0
premetto che sono alle prime armi, finora ho semre usato o solo canvas o solo layout, ora avrei bisogno di creare un'applicazione dove la metà alta dello schermo è costituita da pulsanti e textview, mentre nella parte bassa dovrei creare delle semplici animazioni(magar con canvas), mi potreste spiegare a grandi linee come fare o quali API usare?

Offline Melanogaster

  • Utente normale
  • ***
  • Post: 260
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    SII
  • Sistema operativo:
    Kubuntu
Re:canvas + layout è possibile?
« Risposta #1 il: 10 Luglio 2013, 11:31:18 CEST »
0
Io per queste cose estendo una View direttamente

Offline TheRedFox

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus one
  • Play Store ID:
    RedFox Labs
  • Sistema operativo:
    Debian lenny 5.0, Windows XP
Re:canvas + layout è possibile?
« Risposta #2 il: 10 Luglio 2013, 12:42:22 CEST »
0
fai come dice melanogaster e cosi' puoi utilizzare il canvas come una normale view da inserire nel tuo layout.
sul sito ufficiale trovi la guida su come creare le custom view ecco il link:
http://developer.android.com/training/custom-views/index.html

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
Re:canvas + layout è possibile?
« Risposta #3 il: 10 Luglio 2013, 21:21:26 CEST »
0
ho dato un'occhiata alla guida, ma non ho ben capito a cosa potrebbe servirmi la custom View, forse anche perchè ho provato a fare gli esempi guidati e mi si blocca l'app..
comunque... a grandi linee:
creo una nuova classe che estende view, poi per inserirla immagino vada aggiunto del codice in onCreate:

Codice (Java): [Seleziona]
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initVars();
        //cosa inserisco qui????

qual'è il codice per aggiungere la view? addView(View v) esiste?

Offline Melanogaster

  • Utente normale
  • ***
  • Post: 260
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    SII
  • Sistema operativo:
    Kubuntu
Re:canvas + layout è possibile?
« Risposta #4 il: 11 Luglio 2013, 11:05:53 CEST »
0
Devi usare proprio addview(v):
TuoLayout.addview(new myCustomCanvasView());

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
Re:canvas + layout è possibile?
« Risposta #5 il: 11 Luglio 2013, 14:13:13 CEST »
0
Scusa l'ignoranza, ma come lo inizializzo TuoLayout?

Offline Melanogaster

  • Utente normale
  • ***
  • Post: 260
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    SII
  • Sistema operativo:
    Kubuntu
Re:canvas + layout è possibile?
« Risposta #6 il: 11 Luglio 2013, 14:26:19 CEST »
+1
Tuolayout é un semplice LinearLayout istanziato nel codice xml e che richiami tramite findViewById() ;)

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
Re:canvas + layout è possibile?
« Risposta #7 il: 11 Luglio 2013, 15:12:16 CEST »
0
Ah, ok, piu semplice si quel che pensavo, appena arrivo a casa provo :)

Post unito: 11 Luglio 2013, 17:07:48 CEST
mmm... non va ancora, non da eccezioni ma non vedo la view, o forse onDraw non disegna.. ho fatto così:
nella classe principale:
Codice (Java): [Seleziona]
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initVars();
        llMain= (LinearLayout) findViewById(R.id.llMain);
        setLevel(currentLevel,tvLevel,tvBig,tvSmall);
        chips=new Chips(this);
        llMain.addView(chips);//llMain è il layout principale, e chips è un istanza della classe che estende view
    }
e nella view (chips):
Codice (Java): [Seleziona]
package com.rudylanzarini;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;

public class Chips extends View {
    private Paint orange;

    public Chips (Context context) {
        super(context);
        orange=new Paint();
        orange.setARGB(1,255,100,50);
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(100,200,200,400,orange);//qui provo a disegnare un triangolo arancione per vedere se funziona
    }
« Ultima modifica: 11 Luglio 2013, 17:19:44 CEST da rudj »

Offline TheRedFox

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus one
  • Play Store ID:
    RedFox Labs
  • Sistema operativo:
    Debian lenny 5.0, Windows XP
Re:canvas + layout è possibile?
« Risposta #8 il: 11 Luglio 2013, 17:41:47 CEST »
+1
A mio parere l' invalidate() nel costruttore della classe non serve a niente e non c'e' bisogno di utilizzare addview puoi includere la tua custom view come una normale view attraverso xml.
per esempio:
Codice: [Seleziona]
<com.tuo.package.Chips
       android:id="@+id/chips"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>

Prova a inserire la view in quel modo.

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
Re:canvas + layout è possibile?
« Risposta #9 il: 11 Luglio 2013, 17:50:45 CEST »
0

alla fine la  custom view sono riuscito ad aggiungerla al layout, non avevo aggiunto il costruttore con gli attributi  :-P, resta però il problema che canvas non disegna, penso che l'errore sia nella classe chips
il metodo canvas.drawcolor(Color.Blue) funziona, lo sfondo della view diventa blu, anche drawBitmap, tutto il resto però, drawCircle, drawRect, drawText non va, a questo punto mi viene da pensare che ci sia qualcosa che non va nel Paint, può essere?:
Codice (Java): [Seleziona]
package com.rudylanzarini;

import android.content.Context;
import android.graphics.*;
import android.util.AttributeSet;
import android.view.View;

import java.util.Random;

public class Chips extends View implements View.OnClickListener{
    Paint orange;
    private Random rand=new Random();
    Bitmap bitmap;
    public Chips (Context context) {
        super(context);
        init();
    }
    public Chips (Context context,AttributeSet attrs) {
        super(context,attrs);
        init();
    }
    private void init() {
        orange=new Paint();
        orange.setARGB(1, 255, 100, 50);
        orange.setAntiAlias(true);
        this.setOnClickListener(this);

        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.c1000);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        init();
        canvas.drawColor(Color.BLUE);
        for (int i=0;i<100;i++)
        {
            int x=rand.nextInt(480);
            int y=rand.nextInt(800);
            canvas.drawCircle(x, y, 25, orange);
            canvas.drawText("dddd",x,y,orange);
            canvas.drawBitmap(this.bitmap,x,y,null);
        }
    }

    @Override
    public void onClick(View view) {
        invalidate();
        System.out.println("prova");
    }
}
chi mi aiuta?


Post unito: 11 Luglio 2013, 20:05:23 CEST
risolto, l'errore stupido era nel Paint.setARGG(1, 255, 100, 50), pensando che Alpha avesseun range float 0.0-1.0 come in java, invece è un int 0-255, lo avevo impostato a 1, difficile vedere cerchi con raggio 25px  :-)
« Ultima modifica: 11 Luglio 2013, 20:05:23 CEST da rudj, Reason: Merged DoublePost »

Offline TheRedFox

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus one
  • Play Store ID:
    RedFox Labs
  • Sistema operativo:
    Debian lenny 5.0, Windows XP
Re:canvas + layout è possibile?
« Risposta #10 il: 11 Luglio 2013, 20:12:07 CEST »
0
Io non so cosa inserisci prima del cerchio ma se c'e' altro nel layout che occupa spazio e dai un x e y che vanno oltre lo spazio visibile non vedrai mai i cerchi colorati.
nel tuo caso dovresti prima ottenere le misure della view con
Codice (Java): [Seleziona]
x = canvas.getWidth();
y = canvas.getHeight();

e disegnare i cerchi in base a quelle misure.

Offline rudj

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung s3 mini
  • Sistema operativo:
    mac os 10.75
Re:canvas + layout è possibile?
« Risposta #11 il: 11 Luglio 2013, 20:18:11 CEST »
0
sì, avevo anche quel dubbio, per quello ho usato il ciclo for che disegnerebbe 100 cerchi con coordinate casuali, a parte questo discorso, forse stavi già scrivendo la risposta ma pochi minuti prima di te, nel post di prima ho aggiunto:

Citazione
risolto, l'errore stupido era nel Paint.setARGG(1, 255, 100, 50), pensando che Alpha avesseun range float 0.0-1.0 come in java, invece è un int 0-255, lo avevo impostato a 1, difficile vedere cerchi con raggio 25px  :-)

 
grazie lo stesso per la pazienza ;-)

Offline TheRedFox

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus one
  • Play Store ID:
    RedFox Labs
  • Sistema operativo:
    Debian lenny 5.0, Windows XP
Re:canvas + layout è possibile?
« Risposta #12 il: 11 Luglio 2013, 20:20:48 CEST »
0
gia' hai ragione mi ero dimenticato anche io  O:-)