Aller au contenu

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'

Lien vers le commentaire
Partager sur d’autres 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 ?

Lien vers le commentaire
Partager sur d’autres 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é?

Modifié par moijdik
Lien vers le commentaire
Partager sur d’autres 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...

Modifié par moijdik
Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...