Partage
  • Partager sur Facebook
  • Partager sur Twitter

Vue personnalisée, méthode 3.

Comment exploiter le constructeur qui intègre AttributeSet ?

    24 septembre 2016 à 23:34:52


    Bonjour

    Dans le cours "Créez des applications pour Android", "Création de vues personnalisées", "méthode 3:créer une vue en partant de zéro", j'ai suivi le cours et lancé le programme, ça marche.

    Dans ce code, il y a 4 constructeurs pour instancier la vue. Pas de problème pour utiliser celui-là (Context), et celui-là (Context, int, int) mais je ne sais pas faire avec celui-là (Context, AttributeSet).

    Voici le code :

    - une ressource xml, dans le répertoire res/values/attr.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="ChessBoardViewX">
            <attr name="couleurUn" format="color"></attr>
            <attr name="couleurDeux" format="color"></attr>
        </declare-styleable>
    </resources>

    - un layout xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:lionView="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <com.otaku.lion.vueperso_methode3_xml.ChessBoardView
            android:layout_width="fill_parent" android:layout_height="fill_parent"
            lionView:couleurUn="#FF5555"
            lionView:couleurDeux="#5555FF">
        </com.otaku.lion.vueperso_methode3_xml.ChessBoardView>
    
    </LinearLayout>

    - une vue personnalisée

    package com.otaku.lion.vueperso_methode3_xml;
    
    import android.view.View;
    import android.content.Context;
    import android.util.AttributeSet;
    import android.graphics.Paint;
    import android.graphics.Color;
    import android.content.res.TypedArray;
    import android.util.DisplayMetrics;
    import android.graphics.Canvas;
    
    public class ChessBoardView extends View {
    
        private Paint paintCouleurUn = null;
        private Paint paintCouleurDeux = null;
    
        public ChessBoardView(Context c){
            super(c);
            init(-1, -1);
        }
    
        public ChessBoardView(Context c, int one, int two){
            super(c);
            init(one, two);
        }
    
        public ChessBoardView(Context c, AttributeSet attrs){
            super(c, attrs);
            init(attrs);
        }
    
        public ChessBoardView(Context c, AttributeSet attrs, int defStyle){
            super(c, attrs, defStyle);
            init(attrs);
        }
    
        public void init(int one, int two){
            paintCouleurUn = new Paint(Paint.ANTI_ALIAS_FLAG);
            if(one==-1){
                paintCouleurUn.setColor(Color.WHITE);
            }else paintCouleurUn.setColor(one);
    
            paintCouleurDeux = new Paint(Paint.ANTI_ALIAS_FLAG);
            if(two==-1){
                paintCouleurDeux.setColor(Color.LTGRAY);
            }else paintCouleurDeux.setColor(two);
    
        }public void init(AttributeSet attrs){
            TypedArray attr = getContext().obtainStyledAttributes(attrs, R.styleable.ChessBoardViewX);
    
            int attrOne = attr.getColor(R.styleable.ChessBoardViewX_couleurUn, -1);
            int attrTwo = attr.getColor(R.styleable.ChessBoardViewX_couleurDeux, -1);
    
            init(attrOne, attrTwo);
        }
    
        public int setMeasure(int spec, int screenDim){
    
            int mode = MeasureSpec.getMode(spec);
            int size = MeasureSpec.getSize(screenDim);
    
            if(mode==MeasureSpec.UNSPECIFIED){
                return screenDim/2;
            }else return size;
        }
    
        @Override
        public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
            DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
    
            int screenWidth = metrics.widthPixels;
            int screenHeight = metrics.heightPixels;
    
            int retourWidth = setMeasure(widthMeasureSpec, screenWidth);
            int retourHeight = setMeasure(heightMeasureSpec, screenHeight);
    
            int retour = Math.min(retourWidth, retourHeight);
    
            setMeasuredDimension(retour, retour);
        }
    
        @Override
        public void onDraw(Canvas canvas){
    
            int width = getWidth();
            int height = getHeight();
    
            int min = Math.min(width, height);
            int step = min/8;
            boolean switchColor = true;
    
            for(int i=0;i<min;i+=step){
                for(int j=0;j<min;j+=step){
                    if(switchColor) {
                        canvas.drawRect(i, j, i + step, j + step, paintCouleurUn);
                    }else {
                        canvas.drawRect(i, j, i + step, j + step, paintCouleurDeux);
                    }
                    switchColor = !switchColor;
                }
                switchColor = !switchColor;
            }
        }
    }

    - la classe principale

    package com.otaku.lion.vueperso_methode3_xml;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    
    public class MainActivity extends AppCompatActivity {
        //ChessBoardView chessBoardView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            //avec constructeur (Context)
            //chessBoardView = new ChessBoardView(this);
            //setContentView(chessBoardView);
    
            //avec constructeur (Context, int, int)
            //chessBoardView = new ChessBoardView(this, 0xFFFF5555, 0xFF5555FF);
            //setContentView(chessBoardView);
    
            //avec constructeur (Context, AttributeSet)
            //chessBoardView = new ChessBoardView(this,...???
            
            setContentView(R.layout.activity_main);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
    
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }

    Comme indiqué en commentaire dans le code principale, je ne sais pas exploiter le constructeur avec AttributeSet.

    chessBoardView = new ChessBoardView(this,...??? si quelqu'un peut me compléter le reste de l'instruction, merci.

    • Partager sur Facebook
    • Partager sur Twitter

    Vue personnalisée, méthode 3.

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown