2011-05-30 8 views

Répondre

8

Vous devez disposer de votre propre fonction ImageView et surcharger onDraw. Utilisez quelque chose comme ça

public class MyImageView extends ImageView{ 

    public MyImageView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); 
     canvas.drawLine(0, 0, 20, 20, p); 

    } 

} 

et dans votre classe principale créer un objet MyImageView; et lorsque vous touchez votre écran, appelez la fonction update();

+0

Salut George, vouliez-vous dire en appelant la méthode de mise à jour sur l'événement onTouch()? Je suis désolé de demander beaucoup, je suis nouveau dans ce domaine. – user776550

+0

Oui, je le pense. Pas de problème, vous pouvez demander combien vous voulez)) – George

+0

Vous devez remplacer OnTouchListener et dans votre fonction OnTouch appelant l'invalider – George

0

Jetez un oeil à l'échantillon de ApiDemos FingerPaint. En utilisant ceci, vous pouvez tracer une ligne sur ImageView en touchant sur l'écran.

4

Ceci est un exemple complet de la façon dont vous pouvez dessiner un rectangle vert sur une autre image:

package CustomWidgets; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.util.AttributeSet; 

/** 
* Allows to draw rectangle on ImageView. 
* 
* @author Maciej Nux Jaros 
*/ 
public class DrawImageView extends ImageView { 
    private Paint currentPaint; 
    public boolean drawRect = false; 
    public float left; 
    public float top; 
    public float right; 
    public float bottom; 

    public DrawImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     currentPaint = new Paint(); 
     currentPaint.setDither(true); 
     currentPaint.setColor(0xFF00CC00); // alpha.r.g.b 
     currentPaint.setStyle(Paint.Style.STROKE); 
     currentPaint.setStrokeJoin(Paint.Join.ROUND); 
     currentPaint.setStrokeCap(Paint.Cap.ROUND); 
     currentPaint.setStrokeWidth(2); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     if (drawRect) 
     { 
      canvas.drawRect(left, top, right, bottom, currentPaint); 
     } 
    } 
} 

Lorsque vous avez cette définition, vous pouvez remplacer ImageView par-dessus View (Widget) par exemple:

<CustomWidgets.DrawImageView 
    android:id="@+id/widgetMap" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:src="@drawable/map_small" 
/> 

Ensuite, vous pouvez utiliser par exemple en cas de contact de l'activité qui contrôle la mise en page:

mapImageView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      DrawImageView drawView = (DrawImageView) v; 

      // set start coords 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       drawView.left = event.getX(); 
       drawView.top = event.getY(); 
      // set end coords 
      } else { 
       drawView.right = event.getX(); 
       drawView.bottom = event.getY(); 
      } 
      // draw 
      drawView.invalidate(); 
      drawView.drawRect = true; 

      return true; 
     } 
    }); 

Bien sûr, vous pourriez faire quelques getters et setters et d'autres routines de sur-ingénierie Java ;-).

Questions connexes