Рисование растрового изображения / изображения на холсте, где пользователь касается экрана
Я новичок в Android. Я хочу нарисовать растровое изображение там, где пользователь касается. Это создает растровое изображение на ощупь, но создается только одно растровое изображение, и оно заменяется и перемещается на новую позицию, когда пользователь касается. Я хочу нарисовать новое растровое изображение в новой позиции касания, оставив старое на своем месте, и любое растровое изображение можно переместить / перетащить в новую позицию. ПОЖАЛУЙСТА, ПОМОГИТЕ
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);
}
...