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
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.
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.