Jump to content

cohabitation d'affichage xml et java


moijdik

Recommended Posts

hello

j'aimerais savoir s'il est possible, au sein d'une vue XML (un layout), d'afficher un encart (par exemple une SurfaceView) dans lequel tourne une activité java... ou l'inverse, un encart xml au sein de la Vue d'une activité java. Bref, peut-on mélanger xml et java sur un même écran?

PS: Je dis 'au sein de' mais ça peut être aussi 'au dessus de'

Link to comment
Share on other sites

Insérer programmatiquement des éléments dans une vue XML préalablement chargée, oui, c'est possible

Insérer une Activity dans une autre, non. Par contre, tu as le mécanisme des Fragment pour faire quelque chose d'équivalent

Mais, quel est ton besoin ?

Link to comment
Share on other sites

en gros j'ai des éléments dans un layout que je bouge avec le doigts et j'aimerais idéalement tracer des traits sur une surcouche transparente sous forme de canvas java (on voit le layout derrière et on peut encore le 'toucher'). Ca m'éviterait de faire dans un canvas java uniquement et y dessiner des objets simiaires à ceux que l'on trouve dans un layout...

Ou alors peut-on tracer une ligne dans un layout, j'ai rien trouvé. (j'ai imaginé un moyen, par exemple une image avec transparence dans laquelle un trait est dessiné en diagonale et de tracer ce 'trait' entre 2points, mais en fonction de la distance entre ces 2points, l'épaisseur du trait varie...)

Ca marche chez vous l'exemple que j'ai trouvé?

Edited by moijdik
Link to comment
Share on other sites

ok, avec

Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);

Canvas c = new Canvas(b);

je devrais pouvoir dessiner dans le canvas et ensuite adapter la bitmap à une imageView dans un layout (faudra gérer la transparence) :

SurfaceView maSurfaceView = (SurfaceView)findViewById(R.id.surface);

maSurfaceView.draw(c);

Cela suggère une gestion de calque avec un niveau par calque (par exemple tracer un cercle au dessous de boutons), est-ce possible (par exemple un objet ayant pour caractéristique android:layout_level="3" se trouverait au dessus de ceux qui sont affublés d'un android:layout_level="2" et en dessous d'un android:layout_level="4" et au même niveau qu'un android:layout_level="3")? Je ne trouve rien... Le niveau des 'calques' ne serait que l'ordre d'apparition dans le layout? En fait il faudrait que l'imageView (que je compte modifier via le canvas dans une classe java) apparaisse avant les boutons dans le layout. Mais j'imagine que cet ordre ne peut être modifié dynamiquement...

Edited by moijdik
Link to comment
Share on other sites

voici du code pour pouvoir dessiner sur une image plein écran (avec la barre d'action bien sûr, pas moyen de l'enlever celle-là)

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Matrix;

import android.graphics.Paint;

import android.graphics.Rect;

import android.os.Bundle;

import android.util.Log;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.onclickListener;

import android.view.View.OnTouchListener;

import android.widget.Button;

import android.widget.ImageView;

public class machinChoz extends Activity implements onclickListener, OnTouchListener

{

ImageView affichage;

Canvas canvas;

Paint paint;

Matrix matrix;

float downx = 0, downy = 0, upx = 0, upy = 0;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.machinChoz);

affichage = (ImageView)findViewById(R.id.affichage);

Button bouton1 = (Button)findViewById(R.id.button1);

bouton1.setonclickListener(new View.onclickListener() {

@Override

public void onclick(View v) {envoi();

}

});

}

public void envoi()

{

affichage.buildDrawingCache();

Bitmap bb = affichage.getDrawingCache();

canvas = new Canvas(bb);

paint = new Paint();

paint.setColor(Color.GREEN);

paint.setStrokeWidth(5);

matrix = new Matrix();

canvas.drawBitmap(bb, matrix, paint);

affichage.setImageBitmap(bb);

affichage.setOnTouchListener(this);

}

@Override

public boolean onTouch(View v, MotionEvent event) {

int action = event.getAction();

switch (action) {

case MotionEvent.ACTION_DOWN:

downx = event.getX();

downy = event.getY();

break;

case MotionEvent.ACTION_MOVE:

upx = event.getX();

upy = event.getY();

canvas.drawLine(downx, downy, upx, upy, paint);

affichage.invalidate();

downx = upx;

downy = upy;

break;

case MotionEvent.ACTION_UP:

upx = event.getX();

upy = event.getY();

canvas.drawLine(downx, downy, upx, upy, paint);

affichage.invalidate();

break;

case MotionEvent.ACTION_CANCEL:

break;

default:

break;

}

return true;

}

@Override

public void onclick(View arg0)

{

}

}

et le xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<ImageView

android:id="@+id/affichage"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_marginLeft="0dp"

android:layout_marginTop="0dp"

android:src="@drawable/blanc" />

<Button

android:id="@+id/button1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:layout_alignParentTop="true"

android:layout_marginRight="107dp"

android:layout_marginTop="202dp"

android:text="Button" />

</RelativeLayout>

idéalement, le bout de code dans envoi() que l'on lance via le bouton est à mettre dans OnCreate mais il y a alors un crash. On est obligé de passer par cette méthode, ou alors trouvez mieux!

l'image blanc.jpg doit avoir le même ratio que le plein écran (moins l'actionBar). L'écran mesure chez moi 1024*600, 1024*540 en tenant compte de l'actionBar, soit un ratio 1.8. Une image 800*433 convient donc

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...