2011-07-20 9 views
5

Próbuję zrobić aplikację, która umożliwia użytkownikowi dotknięcie ekranu i narysowanie obrazu na podstawie współrzędnych palców użytkownika. Oto mój kod:Android rysunek na imprezie dotykowej

public class DrawingBoard extends View { 

     Drawable editIcon = getResources().getDrawable(R.drawable.icon); 
     Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background); 

     float xPos = 0; 
     float yPos = 0; 

     public DrawingBoard (Context context) { 
      // TODO Auto-generated constructor stub 
      super (context);    
     } 
     @Override 
     protected void onDraw (Canvas canvas) { 
      super.onDraw(canvas); 

      canvas.save(); 
      canvas.drawBitmap(mBitmap, 0, 0, null); 
      canvas.translate(xPos, yPos); 
      editIcon.draw(canvas); 
      canvas.restore(); 

      invalidate(); 
     } 
     @Override 
     public boolean onTouchEvent (MotionEvent event) { 

      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN : 
        xPos = event.getX(); 
        yPos = event.getY(); 
        break; 
      } 

      return true; 

     } 
    } 
} 

Ale gdy klikam na ekranie w emulatorze, nie ma pokazano obraz ....

pls podkreślić mój błąd ... THX

Odpowiedz

0

I wielokrotnie pisałem odpowiedź na to pytanie, ten kod działa w 100%. jeśli u mieć jeszcze jakieś zapytania następnie u można kontaktować mi

ale ten kod będzie działał do rysowania obrazu na Google Maps:

public boolean onTouchEvent(MotionEvent event, MapView mapView) 
    { 

     if (event.getAction() == 1) 
     {     
      GeoPoint p = mapView.getProjection().fromPixels(
       (int) event.getX(), 
       (int) event.getY()); 
       Toast.makeText(getBaseContext(), "lat and longtd is \n "+ 
        p.getLatitudeE6()/1E6 + "," + 
        p.getLongitudeE6() /1E6 , 
        Toast.LENGTH_LONG).show(); // 
       mapView.getOverlays().add(new MarkerOverlay(p)); 
       mapView.invalidate(); 
     } 
       return true; 


    } 

a także zdefiniować inny (2) klasę nakładki ... gdzie to wydarzenie dostanie.

class MarkerOverlay extends Overlay 
{ 
    private GeoPoint p; 
    private Projection projection; 

    public MarkerOverlay(GeoPoint p) 
    { 
     this.p = p; 
    } 

    @Override 
    public boolean draw(Canvas canvas, MapView mapView,boolean shadow, long when) 
    { 
     super.draw(canvas, mapView, shadow);     

     //---translate the GeoPoint to screen pixels--- 
     Point screenPts = new Point(); 
     mapView.getProjection().toPixels(p, screenPts); 

     //---add the marker--- 
     Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.pir_pictr);    
     canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null); 

     return true; 
    } 



} 
+4

Co to pytanie ma wspólnego z Google maps ?? –

+0

@ SimonAndréForsberg Dude, dlaczego oddajesz głos na tę odpowiedź. Czy zrobiłeś? nie widzisz. ten kod narysuje obraz w Mapach Google na zdarzeniu dotykowym. Nie wiem, co z tobą jest. Jeśli tego nie zrozumiesz, a następnie wyślij mi sympatię, rozwiążę to. –

1

Nie masz invalidate() w onTouchEvent()

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

      canvas.save(); 
      canvas.drawBitmap(mBitmap, 0, 0, null); 
      canvas.translate(xPos, yPos); 
      editIcon.draw(canvas); 
      canvas.restore(); 

     //  invalidate(); 
     } 
     @Override 
     public boolean onTouchEvent (MotionEvent event) { 

      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN : 
        xPos = event.getX(); 
        yPos = event.getY(); 
        invalidate(); // add it here 
        break; 
      } 

      return true; 

     } 
+0

Dlaczego potrzebujemy unieważnić w onTouchEvent, jeśli korzystam z XPos i yPos bezpośrednio w onDraw? – mehulmpt