android utiliser une Vue à partir d'un XML de mise en page pour dessiner une toile
Donc, fondamentalement, je veux utiliser un xml de mise en page, mais je veux aussi une toile où je peux avoir des graphiques effectués. Ce que j'ai fait a été de rendre une vue de mon xml de mise en page comme vous pouvez le voir ci-dessous. Ensuite, dans mon application j'ai fait le point de vue de tirage de la toile, mais il ne fonctionne pas. Je ne sais pas si ma méthode pour résoudre ce qui est totalement faux ou quoi. Donc, s'il vous plaît prendre un coup d'oeil à mon code et me dire si vous voyez une solution rapide ou si vous avez une meilleure méthode. Merci d'avance j'ai vraiment l'apprécier.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/bTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
<View
android:id="@+id/vMain"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
qui est de la mise en page xml
package sm.view.test;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
public class ViewActivity extends Activity implements OnTouchListener {
/** Called when the activity is first created. */
View v;
Button b;
boolean isRun =true;
SurfaceHolder ourHolder;
Thread ourThread;
Canvas canvas;
boolean isTure = true;
TheSurface ourSurfaceView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b= (Button) findViewById(R.id.bTest);
v = (View) findViewById(R.id.vMain);
canvas = new Canvas();
ourSurfaceView = new TheSurface(this);
ourSurfaceView.setOnTouchListener(this);
v.draw(canvas);
//v.setBackgroundColor(Color.BLUE);
}
protected void onPause() {
//TODO Auto-generated method stub
super.onPause();
ourSurfaceView.pause();
}
@Override
protected void onResume() {
//TODO Auto-generated method stub
super.onResume();
ourSurfaceView.resume();
}
public boolean onTouch(View arg0, MotionEvent arg1) {
//TODO Auto-generated method stub
return false;
}
public class TheSurface extends SurfaceView implements Runnable{
public TheSurface(Context context) {
super(context);
ourHolder= getHolder();
}
public void resume(){
isRun= true;
ourThread = new Thread(this);
ourThread.start();
}
public void pause(){
isRun = false;
while(true){
try {
ourThread.join();
} catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
ourThread= null;
}
public void run() {
//TODO Auto-generated method stub
Paint textPaint = new Paint();
textPaint.setColor(Color.WHITE);
while(isTure){
if(!ourHolder.getSurface().isValid())
continue;
//v.draw(canvas);
canvas = ourHolder.lockCanvas();
canvas.drawLine(0, 0, canvas.getWidth(), canvas.getHeight(), textPaint);
ourHolder.unlockCanvasAndPost(canvas);
v.draw(canvas);
}
}
}
}
Comment êtes-vous sûr qu'il ne fonctionne pas. Je vois une toile (le plus souvent un fond blanc), et de la peinture que vous utilisez, être fixées à la Couleur.Blanc. Blanc sur blanc ne signifie pas visible!!!
bien l'arrière-plan est automatiquement noire. Afin de montrer une ligne blanche devrait s'afficher.
Pourquoi êtes-vous créer une SurfaceView de ne jamais l'attacher à l'écran? Cela se sent comme toutes sortes de mal. Pourquoi ne pas simplement ajouter votre SurfaceView sous-classe pour le xml de mise en page?
Bon à savoir, dans le passé, lorsque j'ai voulu directe toile de dessin, j'ai sous-classé une UIView objet de mon propre. Vous essayez peut-être plutôt que d'avoir vue générique que vous essentiellement d'essayer de passer votre surface d'affichage sur, définir votre personnalisé SurfaceView "comme" votre point de vue dans le fichier XML. Puis mettre en œuvre le onDraw de routine à l'intérieur de cet objet. J'ai vraiment obtenu ce travail.
ok, alors quel est le code xml afin de mettre la SurfaceView sous-classe pour le xml de mise en page? désolé, je suis nouveau en programmation. Merci pour les réponses de tout le monde.
bien l'arrière-plan est automatiquement noire. Afin de montrer une ligne blanche devrait s'afficher.
Pourquoi êtes-vous créer une SurfaceView de ne jamais l'attacher à l'écran? Cela se sent comme toutes sortes de mal. Pourquoi ne pas simplement ajouter votre SurfaceView sous-classe pour le xml de mise en page?
Bon à savoir, dans le passé, lorsque j'ai voulu directe toile de dessin, j'ai sous-classé une UIView objet de mon propre. Vous essayez peut-être plutôt que d'avoir vue générique que vous essentiellement d'essayer de passer votre surface d'affichage sur, définir votre personnalisé SurfaceView "comme" votre point de vue dans le fichier XML. Puis mettre en œuvre le onDraw de routine à l'intérieur de cet objet. J'ai vraiment obtenu ce travail.
ok, alors quel est le code xml afin de mettre la SurfaceView sous-classe pour le xml de mise en page? désolé, je suis nouveau en programmation. Merci pour les réponses de tout le monde.
OriginalL'auteur steven minkus | 2012-06-22
Vous devez vous connecter pour publier un commentaire.
Commencer ici (et ce besoin de votre contribution ainsi que pour la partie de l'espace de noms "yourProjectNamespace"):
Dans votre TheSurface
Mettre en œuvre les overideable routines:
Ce devrait être votre dessin terminé!!!
Également dans mon cas, vous n'avez pas à mettre en œuvre la présente comme une SurfaceView, vous pouvez simplement mettre en œuvre comme un point de Vue, et il n'a pas besoin de mettre en œuvre praticable!!!
Avez-vous mis dans votre espace de noms où je l'ai dit dans la réponse?
ya je n'sm.vue.test de l'ordinateur est dire le code java est faux. il l'habitude de même de les exécuter.
Où est-il en mettant l'erreur? Avez-vous le programme d'installation le code que j'ai mis ici comme une sous-classe de SurfaceView ou tout simplement de la Vue? Avez-vous également modifier votre variable de la Vue v; TheSurface v;?
désolé pour le retard responce mais je vais coller ce que j'ai ci-dessous dans une nouvelle réponse. merci pour l'aide.
OriginalL'auteur trumpetlicks
Je ne suis pas 100% sûr que je comprends ce que vous essayez de faire, mais en se fondant sur le fait que vous ne semblez pas faire n'importe quoi avec la toile après l'appel de la Vue.draw() je crois que vous pouvez être confus. Vue.tirage(Toile) attire l'Afficher sur la Toile, il n'altère pas la vue.
Toutefois, si vous créez la toile à partir d'une image vous pouvez ensuite régler l'image sous la forme d'une ImageView de l'image:
Cependant, c'est moins correct que de la manière de mettre en œuvre votre propre point de Vue:
Oui. Le Point De Vue.méthode draw() n'est pas ce que vous cherchez, si. Au lieu de cela, vous voulez remplacer le onDraw(canvas) de la méthode et de faire vos modifications (aka la peinture au doigt) sur la toile, il est passé. Alors que vous venez de redessiner votre avis aussi souvent que vous le souhaitez, et il sera mis à jour avec toutes les modifications qui ont été apportées à la toile. Voir mon deuxième bloc de code pour un exemple.
Que dois-je mettre pour le code xml?
Ne devrait pas beaucoup d'importance, ont un point de vue et ce que les boutons que vous aimez ou que ce soit. La vue doit être votre propre mise en œuvre de vue et vous pouvez prendre une entrée sur la toile, mais vous le souhaitez (par le biais de l'interaction tactile avec le point de vue, peut-être), puis le rafraîchissement de l'affichage avec la toile de provoquer la mise à jour avec les modifications apportées à la toile.
OriginalL'auteur matt5784