2013-09-09 3 views
1

Я новичок в android. Я хочу нарисовать растровое изображение, где пользователь прикасается. Это создает растровое изображение при касании, но создается только одно растровое изображение и оно заменяется и перемещается в новое положение, когда пользователь прикасается. Я хочу, чтобы нарисовать новую битовую карту на новую позицию касания, оставив старый на своем месте и любое растровое изображение можно перемещать/перетаскивать в новый position..PLEASE HELPРисование растрового изображения/изображение на холсте, где пользователь касается экрана

public class SurfaceViewEx extends Activity implements OnTouchListener { 

    OurView v; 
    Bitmap cloud; 
    float x, y; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     cloud = BitmapFactory.decodeResource(getResources(), R.drawable.cloud); 
     v = new OurView(this); //Passing the context of this class 
     v.setOnTouchListener(this); 
     x = y = 0; 
     setContentView(v); 
    } 

    @Override 
    protected void onPause() { 
     // TODO Auto-generated method stub 
     super.onPause(); 
     v.pause(); 
    } 

    @Override 
    protected void onResume() { 
     // TODO Auto-generated method stub 
     super.onResume(); 
     v.resume(); 
    } 

    //It will handle drawing 
    public class OurView extends SurfaceView implements Runnable { 

     Thread t = null; 
     SurfaceHolder holder; // 
     boolean isItOk = false; 

     public OurView(Context context) { 
      super(context); 
      //To make sure we can draw on canvas and surface is valid 
      holder = getHolder(); 
     } 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      while (isItOk == true) { 
       //Perform canvas drawing 
       if(!holder.getSurface().isValid()) { 
        //Call back to while .. 
        continue; 
       } 
       //Lock the canvas, and unlock after drawing 
       Canvas c = holder.lockCanvas(); 
       c.drawARGB(255, 0, 0, 0); 
       c.drawBitmap(cloud, x - (cloud.getWidth()/2), y - (cloud.getHeight()/2), null); 
       holder.unlockCanvasAndPost(c); 
       } 
     } 

     public void pause() { 
      isItOk = false; 
      while(true) { 
       try { 
        //Blocks the current thread until the receiver finishes 
        //the execution and dies 
        t.join(); 

       } 
       catch (InterruptedException e){ 
        e.printStackTrace(); 
       } 
       break; 
      } 
      //t = null; 
     } 

     public void resume() { 
      isItOk = true; //Able to draw 
      t = new Thread(this); 
      t.start(); 
     } 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent me) { 
     // TODO Auto-generated method stub 

     try { 
      Thread.sleep(20); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     switch(me.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       x = me.getX(); 
       y = me.getY(); 
       break; 
      case MotionEvent.ACTION_UP: 
       //Same code 
      case MotionEvent.ACTION_MOVE: 
       //Same code 
     } 
     return true; 
    } 
} 

ответ

1

Я хотел бы предложить объектно-ориентированное решение:

class DragableObject { 
    int x; 
    int y; 
    Bitmap bitmap; 

    public DragableObject(Bitmap bitmap, int x, int y) { 
    this.x = x; 
    this.y = y; 
    this.bitmap = bitmap; 
    } 

    public void draw(Canvas c) { 
    c.drawBitmap(bitmap, x, y); 
    } 

    public boolean grab(int touchX, int touchY) { 
    // TODO check if object is touched (coordinates are inside objects bounds), return value accordingly 
    } 

    public void drag(int deltaX, int deltaY){ 
    this.x += deltaX; 
    this.y += deltaY; 
    } 
} 

чем в классе поверхности:

DragableObject selectedObject = null; 
int previousX; 
int previousY; 
List<DragableObject> objects = new ArrayList<DragableObject>(); 

public boolean onTouch(View v, MotionEvent me) { 
    int x = me.getX(); 
    int y = me.getY(); 
    switch(me.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
    previousX = x; 
    previousY = y; 
    for (DragableObject object : objects) { 
     if (object.grab()) { 
     selectedObject = object; 
     break; 
     } 
    }   
    break; 
    case MotionEvent.ACTION_UP: 
    selectedObject = null; 
    break; 
    case MotionEvent.ACTION_MOVE: 
    if (selectedObject != null) { 
     selectedObject.drag(x - previousX, y - previousY); 
     previousX = x; 
     previousY = y; 
    } 
    break; 
    } 
    return true; 
} 

чем когда вы рисуете на поверхности просто рисовать объекты: ...

for (DragableObject object : objects) { 
    object.draw(c); 
    } 

...

Смежные вопросы