2010-11-23 33 views
15

Je travaille sur un exemple dans lequel je veux faire glisser l'image correspondant à tactile dans Android. Est-ce que quelqu'un a une idée de comment je peux le faire?Touchez et faites glisser l'image dans android

+0

Essayez ce tutoriel .... http://www.anddev.org/basic_drag_and_drop-t3095.html – Noman

+0

Si vous utilisez un 'SurfaceView' vous pouvez essayer de suivre ma partie tutoriel. http://www.droidnova.com/playing-with-graphics-in-android-part-vi.209.html Dans cette partie, je vous présente comment vous pouvez ajouter et modifier la position sur le SurfaceView tout en déplaçant la touche . La partie suivante est un jeu court qui implémente toutes les choses apprises dans un jeu court. Je pense que cela devrait vous aider et vous montrer comment faire ceci ... – WarrenFaith

Répondre

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(); 

    } 
} 

fil:

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

vous devriez avoir éditer votre première réponse au lieu de poster une nouvelle réponse ... – WarrenFaith

+0

Ils ressemblent à deux réponses différentes à moi, @WarrenFaith. On a un thread pour continuer à mettre à jour l'affichage, et on attend des actions de l'utilisateur. Tant que chaque réponse est complète, je ne vois rien de mal à en poster plus d'un. –

+0

Saviez-vous comment enregistrer le BallView en tant qu'image dans la carte SD? – chemalarrea

12

Comme une légère modification de la réponse Touchball - si vous n'avez pas vraiment une boucle de jeu - en d'autres termes, les seuls changements à l'écran sont directement en raison de entrée de l'utilisateur - alors il pourrait être plus logique d'omettre le fil. Sinon, il ne fait que répéter et redessiner constamment même si rien n'a changé. Donc:

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); 
      } 
     } 
    } 
} 

Certes, je suis nouveau dans le développement d'Android, il se peut que je manque quelque chose ici.