Autore Topic: Info su SurfaceView  (Letto 1216 volte)

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Info su SurfaceView
« il: 15 Dicembre 2015, 13:00:32 CET »
0
Qualcuno puo' indicarmi un buon tutorial sulla SurfaceView?

Prima di indicarmi il tutorial, qualcuno puo' spiegarmi brevemente cos'e' una SurfaceView, a cosa serve e come si utilizza?
Che rapporto c'e' tra SurfaceView e i Thread?

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Info su SurfaceView
« Risposta #1 il: 16 Dicembre 2015, 13:04:52 CET »
0
Qualcuno puo' rispondermi?

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Info su SurfaceView
« Risposta #2 il: 17 Dicembre 2015, 13:07:45 CET »
0
Nessuno mi risponde?

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Info su SurfaceView
« Risposta #3 il: 18 Dicembre 2015, 13:10:22 CET »
0
Non c'e' nessuno che sa rispondermi?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Info su SurfaceView
« Risposta #4 il: 18 Dicembre 2015, 13:24:04 CET »
0
È tutto spiegato nella documentazione ufficiale e se ci sono dubbi basta esaminare i sorgenti di Android per vedere come è stata implementata, difficile trovare qualcosa di meglio.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Info su SurfaceView
« Risposta #5 il: 18 Dicembre 2015, 13:34:35 CET »
0
Ho letto la documentazione ufficiale ma non e' che ho capito molto.
Puoi consigliarmi un tutorial?

Per favore per fissare il concetto potresti spiegarmi brevemente COS'E' una SurfaceView e che rapporto ha con i Thread?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Info su SurfaceView
« Risposta #6 il: 18 Dicembre 2015, 14:01:43 CET »
0
Mai visto o letto o cercato un tutorial su questo argomento.

I sorgenti sono qui http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/view/SurfaceView.java#SurfaceView

La documentazione ufficiale:

http://developer.android.com/reference/android/view/SurfaceView.html

Dal mio punto di vista è totalmente documenta e anche spiegata bene.

I Thread possono accedere a un oggetto che istanzi un Surfaceview se hanno dei compiti da eseguire su di essa.



Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Info su SurfaceView
« Risposta #7 il: 18 Dicembre 2015, 18:06:37 CET »
0
Con SurfaceView e SurfaceHolder e' possibile disegnare sullo schermo da un Thread IN BACKGROUND?

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Info su SurfaceView
« Risposta #8 il: 18 Dicembre 2015, 23:59:29 CET »
0
Che vuol dire in background?

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Info su SurfaceView
« Risposta #9 il: 19 Dicembre 2015, 01:34:35 CET »
0
In parallelo con altri Thread.

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Info su SurfaceView
« Risposta #10 il: 19 Dicembre 2015, 11:03:05 CET »
+1
Studiati la documentazione ufficiale su come interagire su di un oggetto SurfaceView da un thread:

http://developer.android.com/guide/topics/graphics/2d-graphics.html#draw-with-canvas

Consiglio di esaminare con attenzione gli esempi presenti nel SDK.



   

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Info su SurfaceView
« Risposta #11 il: 20 Dicembre 2015, 08:31:08 CET »
0
Il seguente programma disegna qualcosa sullo schermo sfruttando una SurfaceView.
Il programma usa i metodi drawText(), drawRect() e drawBitmap().

PERCHE' le coordinate devono essere di tipo "float" ? Non dovrebbero essere "int" ?


Un'altra domanda: se provo a usare drawOval() Android Studio mi dice:

"Call requires API level 21 (current min is 15): android.graphics.Canvas#drawOval less... (Ctrl+F1)"

mi sembra STRANO che non si possano disegnare ellissi prima dell'API level 21!



********** ProvaSurfaceView.java ***********
Codice (Java): [Seleziona]
package prove.myapplication68;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class ProvaSurfaceView extends SurfaceView
{
SurfaceHolder surfaceHolder;

    public ProvaSurfaceView(Context c)
    {
        super(c);
        disegna();
    }
    public ProvaSurfaceView(Context c,AttributeSet attrs)
    {
        super(c,attrs);
        disegna();
    }
    public ProvaSurfaceView(Context c,AttributeSet attrs,int defStyle)
    {
        super(c,attrs,defStyle);
        disegna();
    }

    public void disegna()
    {
        surfaceHolder = getHolder();
        surfaceHolder.addCallback(new SurfaceHolder.Callback()
        {
            @Override
            public void surfaceCreated(SurfaceHolder holder)
            {
                Canvas canvas = holder.lockCanvas(null);
                disegnaQualcosa(canvas);
                holder.unlockCanvasAndPost(canvas);
            }
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
            {
            }
            @Override
            public void surfaceDestroyed(SurfaceHolder holder)
            {
            }
        });

    }

    public void disegnaQualcosa(Canvas canvas)
    {
        Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
        Paint paint=new Paint();

        paint.setTextSize(50);
        paint.setColor(getResources().getColor(android.R.color.holo_red_light));

        canvas.drawText("Ciao",100f,100f,paint);
        canvas.drawRect(10f, 10f, 50f, 50f, paint);
        canvas.drawBitmap(bitmap,150f,150f,null);
        //canvas.drawOval(100F,100F,200F,200F,paint); // <--- Errore, PERCHE?
    }
}

********** activity_main.xml **********
Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
   android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView android:text="@string/hello_world" android:layout_width="wrap_content"
       android:layout_height="wrap_content" />

    <prove.myapplication68.ProvaSurfaceView
       android:layout_width="match_parent"
       android:layout_height="match_parent"
   />

</RelativeLayout>

********** MainActivity.java **********
Codice (Java): [Seleziona]
package prove.myapplication68;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;


public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

Offline oberdank

  • Utente normale
  • ***
  • Post: 287
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Core LTE
  • Play Store ID:
    BuzzOne
  • Sistema operativo:
    Windows 8.1
Re:Info su SurfaceView
« Risposta #12 il: 28 Dicembre 2015, 20:40:59 CET »
0
La soluzione a drawOval() l'ho trovata: prima dell'API level 21 bisogna usare un RectF, un rettangolo all'interno del quale l'ellissi viene disegnata, per esempio:

   Paint paint=new Paint();
   RectF rect=new RectF(10,10,100,200);
   drawOval(rect,paint);

pero' NON capisco PERCHE' le coordinate devono essere di tipo "float", qualcuno puo' SPIEGARMELO?