2011-01-07 5 views
1

J'ai un ImageView chargeant une image dans mon Activité et je veux dessiner quelques lignes dessus Il semble que je ne suis pas capable de superposer les lignes que je dessine sur l'ImageView Si je crée une nouvelle classe (myPainter) qui étend 'View', hook myPainter.onDraw() puis setContentView (mp) dans onCreate() à partir de l'activité, tout ce que je reçois sont les lignes tracées.Mon ImageView est parti de onCreate(). Comment puis-je obtenir le ImageView et les lignes à afficher dans la même mise en page? Je suis aussi Override'ing OnTouch() pour le ImageView je peux obtenir les emplacements de clic xy de celui-ci.Dessiner une ligne dans une classe qui s'étend "Activité '

public class myPainter extends View 
    { 
    public myPainter (Context context) 
     { 
     super (context); 
     } 

    @Override 
     protected void onDraw(Canvas canvas) 
    { 
     super.onDraw (canvas); 
     Paint p = new Paint(); 
      p.setColor(Color.RED); 

     canvas.drawLine (E_XMIN, E_YMIN, E_XMAX, E_YMAX, p); 
    } 
    } 


    @Override 
    public void onCreate (Bundle savedInstanceState) 
    { 
     super.onCreate (savedInstanceState); 
     setContentView (R.layout.main); 
     ImageView iv = (ImageView) findViewById(R.id.ImageView01); 
     iv.setOnTouchListener (this); 

// this draws my lines, but I loose the pic above ^^^ 
     myPainter mp = new myPainter(this);   
     setContentView(mp); 
    } 

MISE À JOUR:

Je pense que je me suis littéralement peint dans un coin. Comment ajouter un frameAnimation à ce code maintenant dans la méthode onTouchEvent()? Comme lorsque l'utilisateur touche l'écran. L'exemple Android rocketAnimation provoque une exception si j'ajouter du code à myPainter() Classe:

@Override 
    public boolean onTouchEvent (MotionEvent event) 
    { 

     //Log.d (TAG, "touchevent in myPainter"); 
     switch (event.getAction()) 
     { 
      case MotionEvent.ACTION_DOWN: 
        Log.d (TAG, "down x:" + event.getX() + " y:" + event.getY()); 

        int wClick = getClick (event.getX(), event.getY()); 


        AnimationDrawable touchAni; 
        ImageView iv = (ImageView) findViewById (R.drawable.triangle); 
        iv.setBackgroundResource (R.drawable.nova); 
        touchAni = (AnimationDrawable) iv.getBackground(); 
        touchAni.start(); 

        return true; 
     } 

     return super.onTouchEvent (event); 
    } 

Répondre

0

J'ai essayé de mettre en œuvre les suggestions ci-dessus, mais n'a pas pu obtenir la fonctionnalité que je visais. Peut-être n'ai-je pas complètement formulé ma question, ou juste un malentendu général. J'ai fini par ajouter un setBackgroundResource() dans la méthode principale myPainter pour obtenir l'image sur l'écran. Je pense que je l'ai travaillé au besoin et en publiant le code ci-dessous au cas où cela aiderait quelqu'un d'autre. Merci d'avoir offert votre aide!

class myPainter extends View implements myConst 
    { 
     private final static String TAG = "** myPainter **"; 

     public myPainter (Context context) 
     { 
      super (context);  
      Log.d (TAG, "new myPainter"); 
      setBackgroundResource (R.drawable.triangle); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) 
     { 
      super.onDraw (canvas);  
      Log.d (TAG, "new myPainter"); 

      Paint p = new Paint(); 
      p.setColor (Color.RED); 
      canvas.drawLine (E_XMIN, E_YMIN, E_XMAX, E_YMIN, p); 
     } 


     /** 
     * called to determine what part of the triangle was clicked 
     * @param x 
     * @param y 
     * @return click id from myConst 
     */ 
     private int getClick (float x, float y) 
     { 
      int id = 0; 
       // insert logic to test x,y locations and return 
       // region ID of what was clicked 
       ... 

      return (id); 
     } 

     @Override 
     public boolean onTouchEvent (MotionEvent event) 
     { 
      Log.d (TAG, "touchevent in myPainter"); 
switch (event.getAction()) 
      { 
       case MotionEvent.ACTION_DOWN: 
         Log.d (TAG, "down x:" + event.getX() + " y:" + event.getY()); 

         int wClick = getClick (event.getX(), event.getY()); 
       break; 
      } 

      return false; 
     } 

    } 

Et puis ma classe principale de l'application a pour ce onCreate():

/** Called when the activity is first created. */ 
@Override 
public void onCreate (Bundle savedInstanceState) 
{ 
    super.onCreate (savedInstanceState); 
    setContentView (R.layout.main); 

    myPainter mp = new myPainter(getApplicationContext()); 
    mp.invalidate(); 
    setContentView(mp); 

    //ImageView iv = (ImageView) findViewById(R.id.ImageView01); 
    //iv.setOnTouchListener (this); 

} 
+0

qu'est-ce que 'myConst'? et où avez-vous obtenu 'E_XMIN, E_YMIN' etc – ThisGuy

+0

Il ne dessine pas sur' R.layout.main'. Vous avez simplement changé 'setContentView'. Le 'layout.main' n'est pas visible. Vous venez de mettre 'myPainter' par-dessus. – ThisGuy

1

Le problème est que vous appelez setContentView deux fois. Votre onCreate devrait être plus comme:

 @Override 
    public void onCreate (Bundle savedInstanceState) 
    { 
     super.onCreate (savedInstanceState); 
     setContentView (R.layout.main); 
     ImageView iv = (ImageView) findViewById(R.id.ImageView01); 
     iv.setOnTouchListener (this); 
    } 
+0

Toutes mes excuses, mais je ne suis pas sûr que je comprends votre réponse. Cela afficherait uniquement l'ImageView et ne déclencherait jamais onDraw() dans myPaint pour obtenir les lignes dessinées au-dessus. Y at-il un moyen de hook onDraw() dans une classe qui ne s'étend pas * View *? Je suppose que c'est peut-être une meilleure question. – wufoo

+0

Étant donné que vous étendez View, onDraw doit être appelé automatiquement comme dans n'importe quelle vue. L'appel à super dans votre onDraw devrait peindre tout ce qui a été configuré depuis setContentView (ce qui devrait avoir votre image), alors vous faites votre dessin personnalisé après ce point. – elevine

+0

En outre, cette ligne ne fait rien pour vous: myPainter mp = new myPainter (this); Vous êtes déjà dans un myPainter instancié, il n'est donc pas nécessaire d'en instancier un autre avec une référence à vous-même. – elevine

Questions connexes