2010-11-23 5 views
15

Ich arbeite an einem Beispiel, in dem ich das Bild entsprechend Touch in Android ziehen möchten. Hat jemand eine Idee, wie ich das machen kann?Berühren und ziehen Bild in Android

+0

Probieren Sie dieses Tutorial .... http://www.anddev.org/basic_drag_and_drop-t3095.html – Noman

+0

Wenn Sie ein 'SurfaceView' verwenden, können Sie versuchen, meinem Tutorial-Teil zu folgen. http://www.droidnova.com/playing-with-graphics-in-android-part-vi209.html In diesem Teil stelle ich Ihnen vor, wie Sie die Position auf der SurfaceView hinzufügen und ändern können, während Sie die Berührung bewegen . Der Teil danach ist ein kurzes Spiel, das alle erlernten Sachen in einem kurzen Spiel implementiert. Ich denke, das sollte dir helfen und dir zeigen, wie du das machst ... – WarrenFaith

Antwort

28
public class TouchBall extends Activity { 


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

    int w=getWindowManager().getDefaultDisplay().getWidth()-25; 
    int h=getWindowManager().getDefaultDisplay().getHeight()-25; 

    BallView ballView=new BallView(this,w,h); 
    setContentView(ballView); 
} 


} 
public class BallView extends SurfaceView implements SurfaceHolder.Callback { 

    private Bitmap bitmap ; 
    private MyThread thread; 
    private int x=20,y=20;int width,height; 

    public BallView(Context context,int w,int h) { 
     super(context); 

     width=w; 
     height=h; 
     thread=new MyThread(getHolder(),this); 
     getHolder().addCallback(this); 
     setFocusable(true); 
    } 

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

     bitmap =BitmapFactory.decodeResource(getResources(), R.drawable.ball_green); 
     canvas.drawColor(Color.BLUE);//To make background 
     canvas.drawBitmap(bitmap,x-(bitmap.getWidth()/2),y-(bitmap.getHeight()/2),null); 


    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     x=(int)event.getX(); 
     y=(int)event.getY(); 

     if(x<25) 
       x=25; 
     if(x> width) 
       x=width; 
     if(y <25) 
       y=25; 
     if(y > 405) 
       y=405;  
     return true; 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 

     thread.startrun(true); 
     thread.start(); 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 


     thread.startrun(false); 
     thread.stop(); 

    } 
} 

thread:

public class MyThread extends Thread { 

private SurfaceHolder msurfaceHolder; 
private BallView mballView; 
private boolean mrun =false; 

public MyThread(SurfaceHolder holder, BallView ballView) { 

    msurfaceHolder = holder; 
    mballView=ballView; 
} 

public void startrun(boolean run) { 

    mrun=run; 
} 

@Override 
public void run() { 

    super.run(); 
    Canvas canvas; 
    while (mrun) { 
     canvas=null; 
     try { 
      canvas = msurfaceHolder.lockCanvas(null); 
       synchronized (msurfaceHolder) { 
       mballView.onDraw(canvas); 
      } 
     } finally { 
       if (canvas != null) { 
       msurfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
    } 

} 
+0

solltest du deine erste Antwort bearbeiten anstatt eine neue Antwort zu posten ... – WarrenFaith

+0

Sie sehen aus wie zwei verschiedene Antworten auf mich, @WarrenFaith. Man hat einen Thread, um die Anzeige zu aktualisieren, und man wartet auf Benutzeraktionen. Solange jede Antwort vollständig ist, sehe ich nichts falsch daran, mehr als einen Beitrag zu veröffentlichen. –

+0

Wussten Sie, wie Sie den BallView als Bild auf der SD-Karte speichern können? – chemalarrea

12

Als leichte Modifikation der TouchBall Antwort - wenn Sie nicht wirklich eine Spielschleife haben - in anderen Worten, die nur Änderungen am Bildschirm direkt aufgrund Benutzereingabe - dann könnte es sinnvoller sein, den Thread wegzulassen. Sonst wird nur ständig geblättert und neu gezeichnet, auch wenn sich nichts geändert hat. Also:

public class TouchBall extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     int w=getWindowManager().getDefaultDisplay().getWidth()-25; 
     int h=getWindowManager().getDefaultDisplay().getHeight()-25; 

     BallView ballView=new BallView(this,w,h); 
     setContentView(ballView); 
    } 
} 

public class BallView extends SurfaceView implements SurfaceHolder.Callback { 
    private Bitmap bitmap ; 
    private int x=20,y=20;int width,height; 

    public BallView(Context context,int w,int h) { 
     super(context); 

     width=w; 
     height=h; 
     getHolder().addCallback(this); 
     setFocusable(true); 
    } 

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

     bitmap =BitmapFactory.decodeResource(getResources(), R.drawable.ball_green); 
     canvas.drawColor(Color.BLUE);//To make background 
     canvas.drawBitmap(bitmap,x-(bitmap.getWidth()/2),y-(bitmap.getHeight()/2),null); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     x=(int)event.getX(); 
     y=(int)event.getY(); 

     if(x<25) 
      x=25; 
     if(x> width) 
      x=width; 
     if(y <25) 
      y=25; 
     if(y > 405) 
      y=405; 

     updateBall(); 

     return true; 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 

    private void updateBall() { 
     Canvas canvas = null; 
     try { 
      canvas = getHolder().lockCanvas(null); 
      synchronized (getHolder()) { 
       this.onDraw(canvas); 
      } 
     } 
     finally { 
      if (canvas != null) { 
       getHolder().unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
} 

Zugegeben, ich bin neu in der Android-Entwicklung, daher kann mir hier etwas fehlen.