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