Un momento un po' travagliato perché ho avuto difficoltà nel rappresentare un Layout con il suo Canvas contenente un'immagine.
Adesso ho trovato la soluzione. Fattore critico per mostrare a video il Layout è il metodo setWillNotDraw, impostato a false.
Ecco, io creo una classe che istanzia LinearLayout:
public class MyLayout extends LinearLayout {
Paint paint;
Context context;
public MyLayout(Context context) {
super(context);
this.context=context;
setWillNotDraw(false);
paint = new Paint();
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLACK);
paint.setStrokeWidth(5);
canvas.drawRect(0,0,100,100,paint);
}
}
Quindi istanzio questa classe in MainActivity:
public class MainActivity extends AppCompatActivity {
RelativeLayout mainLayout;
MyLayout myLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainLayout=(RelativeLayout)findViewById(R.id.mainLayout);
myLayout=new MyLayout(this);
mainLayout.addView(myLayout);
RelativeLayout.LayoutParams params=
new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
params.width=200;
params.height=200;
params.leftMargin=100;
params.topMargin=100;
myLayout.setLayoutParams(params);
}
}
... e funziona!
Ora, voglio che si adatti la grandezza del disegno di sfondo del MyLayout alla grandezza del MyLayout stesso una volta conferita dal codice che lo istanzia.
Provo a usare getWidth e getHeight, sempre ammesso che il LinearLayout abbia questi metodi...
Non mi ha dato errori nel digitarli, e quindi dovrebbe averli.
Ora torno all'activity istanziante e modifico le dimensioni di myLayout.
Quindi parto, e vediamo!
MyLayout:
public class MyLayout extends LinearLayout {
Paint paint;
Context context;
public MyLayout(Context context) {
super(context);
this.context=context;
setWillNotDraw(false);
paint = new Paint();
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLACK);
paint.setStrokeWidth(5);
canvas.drawRect(0,0,getWidth(),getHeight(),paint);
}
}
MainActivity:
public class MainActivity extends AppCompatActivity {
RelativeLayout mainLayout;
MyLayout myLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainLayout=(RelativeLayout)findViewById(R.id.mainLayout);
myLayout=new MyLayout(this);
mainLayout.addView(myLayout);
RelativeLayout.LayoutParams params=
new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
params.width=300;
params.height=300;
params.leftMargin=100;
params.topMargin=100;
myLayout.setLayoutParams(params);
}
}
Proviamo...Bene.
Ma lo spessore della linea mi viene sempre inferiore a quella che è stata impostata.
Questo è dovuto sicuramente che parte dello spessore della linea va oltre l'ampiezza del layout.
Provo a usare un artifizio, ma prima ci devo studiare un po'...
Sì, sembra funzionare:
nel modulo della classe MyLayout:
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.BLACK);
int wdt=4;
int scarto=(wdt+1)/2;
paint.setStrokeWidth(wdt);
canvas.drawRect(0+scarto,0+scarto,getWidth()-scarto,getHeight()-scarto,paint);
}
Bene.E adesso dobbiamo dar fondo alle risorse grafiche per creare il Layout base dell'immagine "normale" e per l'immagine "categoria" di J-Communicator.


Nessun commento:
Posta un commento