JavascriptProva

giovedì 8 settembre 2016

Un LinearLayout con un'ìmmagine di sfondo su Canvas.

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