Нажмите и перетащите изображение в Android - PullRequest
17 голосов
/ 23 ноября 2010

Я работаю над примером, в котором я хочу перетащить изображение, соответствующее касанию в Android. У кого-нибудь есть идеи о том, как я могу это сделать?

Ответы [ 2 ]

30 голосов
/ 23 ноября 2010
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();

    }   
 }

Тема:

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

}
12 голосов
/ 05 января 2011

В качестве небольшой модификации ответа TouchBall - если у вас действительно нет игрового цикла - иными словами, единственные изменения на экране напрямую связаны с пользовательским вводом - тогда может быть более разумным опуститьнить.В противном случае он просто постоянно зацикливается и перерисовывается, даже если ничего не изменилось.Итак:

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, поэтому я могу что-то упустить здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...