2017-03-14 6 views
0

Je suis très nouveau dans le développement Android, et j'ai une question ici puisque je n'ai pas trouvé de réponse sur Stackoverflow.Android - une distance entre le dessin réel et le mouvement des doigts

J'ai écrit un code simple pour permettre à un utilisateur de dessiner un cadre de délimitation avec un doigt sur l'écran (du coin supérieur gauche au coin inférieur droit).

La drawView classe ressemble à ceci:

public class DrawView extends View { 
Paint paint = new Paint(); 

public DrawView(Context context) { 
    super(context); 
} 
public Point startPoint = new Point(); 
public Point endPoint = new Point(); 

@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    paint.setColor(Color.RED); 
    paint.setStrokeWidth(3); 
    paint.setStyle(Paint.Style.STROKE); 
    canvas.drawRect(startPoint.x,startPoint.y,endPoint.x,endPoint.y,paint); 
}} 

et MainActivity ressemble à ceci:

public class MainActivity extends AppCompatActivity { 

DrawView drawView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    drawView = new DrawView(this); 
    drawView.setBackgroundColor(Color.WHITE); 
    drawView.startPoint.set(0,0); 
    drawView.endPoint.set(0,0); 
    setContentView(drawView); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    int eventAction = event.getAction(); 

    // you may need the x/y location 
    int x = (int)event.getX(); 
    int y = (int)event.getY(); 

    // put your code in here to handle the event 
    switch (eventAction) { 
     case MotionEvent.ACTION_DOWN: 
      drawView.startPoint.set(x,y); 
      break; 
     case MotionEvent.ACTION_UP: 
      drawView.endPoint.set(x,y); 
      drawView.invalidate(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      drawView.endPoint.set(x,y); 
      drawView.invalidate(); 
      break; 
    } 

    // tell the View that we handled the event 
    return true; 
}} 

Et le résultat est une distance importante entre mon point de doigt et le point de dessin réel sur la écran qui ressemble à ceci:

on screen result

La ligne bleue est mon doigt et le cadre rouge est le vrai dessin sur l'écran. Est-ce que quelqu'un sait quelle est la raison de cela? Merci beaucoup!

+0

C'est parce que les coordonnées de 'View' sont différentes de celles de' Activity'. Gérer les événements tactiles dans le 'View' lui-même. C'est-à-dire, déplacez la méthode 'onTouchEvent()' vers votre 'DrawView'. –

Répondre

0

Activité & La vue enfant n'a pas la même origine de coordonnées. J'ai fait quelques corrections:

public class MainActivity extends AppCompatActivity implements View.OnTouchListener{ 

     DrawView drawView;   

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 


      drawView = new DrawView(this); 
      drawView.setBackgroundColor(Color.WHITE); 
      drawView.startPoint.set(0, 0); 
      drawView.endPoint.set(0, 0); 
      setContentView(drawView); 
      drawView.setOnTouchListener(this); 
     } 



     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      int eventAction = motionEvent.getAction(); 


      // you may need the x/y location 
      int x = (int) motionEvent.getX(); 
      int y = (int) motionEvent.getY(); 

      // put your code in here to handle the event 
      switch (eventAction) { 
       case MotionEvent.ACTION_DOWN: 
        drawView.startPoint.set(x, y); 
        break; 
       case MotionEvent.ACTION_UP: 
        drawView.endPoint.set(x, y); 
        drawView.invalidate(); 
        break; 
       case MotionEvent.ACTION_MOVE: 
        drawView.endPoint.set(x, y); 
        drawView.invalidate(); 
        break; 
      } 

      // tell the View that we handled the event 
      return true; 
     } 
    }