2010-11-23 6 views
15

私はAndroidのタッチに対応する画像をドラッグしたいいくつかの例で取り組んでいます。誰かが私がそれをどうやってできるのか考えているのですか?アンドロイドで画像をタッチアンドドラッグする

+0

このチュートリアルを試してみてください.... http://www.anddev.org/basic_drag_and_drop-t3095.html – Noman

+0

'SurfaceView'を使用している場合、私のチュートリアルの部分に従うことができます。 http://www.droidnova.com/playing-with-graphics-in-android-part-vi209.htmlここでは、タッチを動かしながらSurfaceViewの位置を追加したり変更したりする方法について紹介します。それ以降の部分は、ショートゲームですべての学習物を実装するショートゲームです。私はそれがあなたを助け、これを行う方法を示すべきだと思います... – WarrenFaith

答えて

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

    } 
} 

スレッド:TouchBallの答えにわずかな変更として

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

新しい回答を投稿するのではなく、最初の回答を編集する必要があります... – WarrenFaith

+0

2つの異なる答え、@WarrenFaithのように見えます。 1つはディスプレイを更新し続けるスレッドがあり、1つはユーザーの操作を待っています。各回答が完了している限り、複数の投稿に間違いはありません。 –

+0

BallViewをsdcardにイメージとして保存する方法を知っていましたか? – chemalarrea

12

- あなたは本当にゲームループを持っていない場合 - つまり、画面への変更のみが原因に直接ありますユーザーの入力 - それはスレッドを残してより理にかなっているかもしれません。それ以外の場合は、何も変更されていなくても常にループして再描画します。したがって:

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

確かに、私はAndroid開発の初心者なので、ここで何か不足している可能性があります。

関連する問題