IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

Lié une Surfaceview à son layout


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut Lié une Surfaceview à son layout
    Bonjour,

    J'essaie d'adapter un exemple de Surfaceview, mais qui ne prend qu'une partie de l'écran, et surtout ne recouvre pas mes boutons.
    J'ai donc créé une Surfaceview dans mon layout.
    Mon xml en partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
        <SurfaceView
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:id="@+id/surfaceView"
            android:layout_alignParentTop="true" />
     
     
    </RelativeLayout>
    J'ai la classe "EcranDessin" avec les trois constructeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    public class EcranDessin extends SurfaceView implements Runnable{
            //--
            Thread t = null;
            //-- Déclaration du "Holder" utile pour les manipulations
            SurfaceHolder holder;
            //-- Drapeau de contrôle
            boolean isItOk = false;
     
            public EcranDessin(Context context) {
                super(context);
                //-- lancement du Holder
                holder = getHolder();
     
            }
     
            public EcranDessin(Context context, AttributeSet attrs) {
                super(context, attrs);
                holder = getHolder();
            }
            public EcranDessin(Context context, AttributeSet attrs, int defStyle) {
                super(context, attrs, defStyle);
                holder = getHolder();
            }
    Dans mon activité principale je déclare un objet v EcranDessin puis je l'instance en le liant à mon layout.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     v = (EcranDessin) findViewById(R.id.surfaceView);
    Mais il n'en veut pas "Unexpeted cast to EcranDessin"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    ublic class MainActivity extends Activity {
        Button btnstart, btnnext, btnquit;
        EcranDessin v ;                          //-- Définition d'une vue v de type EcranDessin
        Bitmap Bille;                           //-- BitMap
        float x,y;                              //-- Coordonnées du BitMap
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            btnstart  = (Button) findViewById(R.id.btnstart);
            btnnext  = (Button) findViewById(R.id.btnnext);
            btnquit  = (Button) findViewById(R.id.btnquit);
     
           v = (EcranDessin) findViewById(R.id.surfaceView);
    Qu'est ce qui ne va pas ?

    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Normal, tu réalise un downcast.

    Tu définis une SurfaceView, que tu tentes d'utiliser en tant qu'une de ses filles.
    Utilise directement un "EcranDessin" dans ton XML
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut
    Merci pour la réponse.
    J'ai changé mon xml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <com.example.jla.test_surfaceview.MainActivity.EcranDessin
            android:layout_width="fill_parent"
            android:layout_height="300dp"
            android:id="@+id/surfaceView"
            android:layout_alignParentTop="true" />
    ça passe, mais il plante et j'ai entre autres le message suivant:

    Suppressed: java.lang.ClassNotFoundException: com.example.jla.test_surfaceview.MainActivity.EcranDessin

    Ce qui signifierait qu'il ne trouve pas la classe EcranDessin qui est bien dans MainActivity !
    Y a t-il une erreur de syntaxe dans mon xml ?

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut
    Bonjour,

    Toujours le même message. En cherchant sur les custom "SurfaceView", il semblerait qu'il y ait un problème avec l'API 22 (sous réserve, car j'en ai beaucoup vu, et ne me rappelle pas de tout).

    Enfin j'ai fini par trouver un exemple qui fonctionne et correspond à mon besoin:

    http://javandroidevelop.blogspot.fr/...d-lessons.html

    Dans cette exemple, on peut dimensionner la surfaceview dans le xml. L'activité est implémentée en Runnable, ce qui permet de mettre le rafraîchissement du graphique dans la fonction run. On peut facilement ajouter des boutons start, stop pour agir sur le graphique.
    Je mets le code ci après (dés fois que le site soit supprimé), et je déclare le post résolu pour moi.
    La suite au prochain post !

    Le xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <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" >
     
        <Button
            android:id="@+id/buttonswap"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="46dp"
            android:text="Swap Balls" />
     
        <SurfaceView
            android:id="@+id/mysurface"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_margin="10dp" />
     
    </RelativeLayout>
    Le code java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
     
    package com.example.surfaceviewexample;
     
    import android.app.Activity;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.RectF;
    import android.os.Bundle;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
     
    public class SurfaceViewActivity extends Activity implements Runnable {
      private Button swapBtn;
      private SurfaceView surface;
      private SurfaceHolder holder;
      private boolean locker=true;
      private Thread thread;
      private int radiusBlack, radiusWhite;
      private boolean left = true;
      //physics
      private static final int baseRadius = 10;
      private static final int maxRadius = 50;
      private static final int baseSpeed = 1;
      private int speed = 0;
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_surface_view);
     
            swapBtn = (Button) findViewById(R.id.buttonswap);
     
            surface = (SurfaceView) findViewById(R.id.mysurface);
            holder = surface.getHolder();
     
            thread = new Thread(this);
            thread.start();
            swapBtn.setOnClickListener(new OnClickListener() {
     
          @Override
          public void onClick(View arg0) {
            /** SWAP ANIMATION LEFT OR RIGHT CIRCLE*/
            left = !left;
          }
        });
        }
     
      @Override
      public void run() {
        // TODO Auto-generated method stub
        while(locker){
          //checks if the lockCanvas() method will be success,and if not, will check this statement again
          if(!holder.getSurface().isValid()){
            continue;
          }
          /** Start editing pixels in this surface.*/
          Canvas canvas = holder.lockCanvas();
     
          //ALL PAINT-JOB MAKE IN draw(canvas); method.
          draw(canvas);
     
          // End of painting to canvas. system will paint with this canvas,to the surface.
          holder.unlockCanvasAndPost(canvas);
        }
      }
      /**This method deals with paint-works. Also will paint something in background*/
      private void draw(Canvas canvas) {
        // paint a background color
        canvas.drawColor(android.R.color.holo_blue_bright);
     
        // paint a rectangular shape that fill the surface.
        int border = 20;
        RectF r = new RectF(border, border, canvas.getWidth()-20, canvas.getHeight()-20);
        Paint paint = new Paint();    
        paint.setARGB(200, 135, 135, 135); //paint color GRAY+SEMY TRANSPARENT 
        canvas.drawRect(r , paint );
     
        /*
         * i want to paint to circles, black and white. one of circles will
         * bounce, tile the button 'swap' pressed and then other circle begin bouncing.
         */
        calculateRadiuses();
        //paint left circle(black)
        paint.setColor(getResources().getColor(android.R.color.black));
        canvas.drawCircle(canvas.getWidth()/4, canvas.getHeight()/2, radiusBlack, paint);
     
        //paint right circle(white)
        paint.setColor(getResources().getColor(android.R.color.white));
        canvas.drawCircle(canvas.getWidth()/4*3, canvas.getHeight()/2, radiusWhite, paint);
      }
     
      private void calculateRadiuses() {
        // TODO Auto-generated method stub
        if(left){
          updateSpeed(radiusBlack);
          radiusBlack += speed;
          radiusWhite = baseRadius;
        }
        else{
          updateSpeed(radiusWhite);
          radiusWhite += speed;
          radiusBlack = baseRadius;
        }
      }
      /**Change speed according to current radius size.
       * if, radius is bigger than maxRad the speed became negative otherwise 
       * if radius is smaller then baseRad speed will positive.
       * @param radius
       */
      private void updateSpeed(int radius) {
        // TODO Auto-generated method stub
        if(radius>=maxRadius){
          speed = -baseSpeed;
        }
        else if (radius<=baseRadius){
          speed = baseSpeed;
        }
     
      }
     
      @Override
      protected void onPause() {    
        super.onPause();
        pause();
      }
     
      private void pause() {
        //CLOSE LOCKER FOR run();
        locker = false;
        while(true){
          try {
            //WAIT UNTIL THREAD DIE, THEN EXIT WHILE LOOP AND RELEASE a thread
            thread.join();
          } catch (InterruptedException e) {e.printStackTrace();
          }
          break;
        }
        thread = null;
      }
     
      @Override
      protected void onResume() {
        super.onResume();
        resume();    
      }
     
      private void resume() {
        //RESTART THREAD AND OPEN LOCKER FOR run();
        locker = true;
     
      }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Modifier une ligne avec layout:collection
    Par imane_bennouna dans le forum Struts 1
    Réponses: 3
    Dernier message: 07/05/2007, 14h47
  2. Réponses: 1
    Dernier message: 26/05/2006, 11h11
  3. Réponses: 6
    Dernier message: 18/05/2006, 09h37
  4. sauter une ligne avec Layout...
    Par youp_db dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 16/12/2005, 19h54
  5. Réponses: 2
    Dernier message: 24/08/2005, 10h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo