触摸时拖动ImageView或位图

时间:2011-03-15 17:22:54

标签: android imageview drag

我目前有一些工作,我可以在屏幕上水平拖动一个框(我想要它做什么)。但是,当您单击屏幕上的ANYWHERE时,它会起作用,我希望它仅在单击该框时才起作用。我尝试过以不同的方式实现这一点,而且我已经到处寻找并仍然迷失方向。有人可以帮忙吗?我也无法弄清楚位图是如何放置的(我现在正在使用位图,因为在我的生活中我无法弄清楚如何在SurfaceView中实现ImageView)。如果我说我的位图放在0,0会将位图按照其左上角0,0放置吗?我还有一个算法,当它到达边缘时停止框,但我只需要重写,因为我必须删除它。如果你能提供你的知识,我会非常感激

public class BoardView extends SurfaceView implements SurfaceHolder.Callback{
    Context mContext;

    private BoardThread thread;
    private float box_x = 140;
    private float box_y = 378;
    ImageView i = (ImageView) findViewById(R.id.box_view);

    Bitmap box = 
        (BitmapFactory.decodeResource
                (getResources(), R.drawable.box));
    private float boxWidth = box.getWidth();
    private float boxHeight = box.getHeight();



    public BoardView(Context context){
        super(context);
        //surfaceHolder provides canvas that we draw on
        getHolder().addCallback(this);
        // controls drawings
        thread = new BoardThread(getHolder(),this);
        //intercepts touch events
        setFocusable(true);

    }


    @Override

    public void onDraw(Canvas canvas){
        canvas.drawColor(Color.WHITE);  


        //draw box and set start location
        canvas.drawBitmap(box, box_x - (boxWidth/2), 
                box_y - (boxHeight/2), null);






    }

    @Override
    public boolean onTouchEvent(MotionEvent event){

        //boolean mode = false;

        if(event.getAction() == MotionEvent.ACTION_DOWN){
            //int x = (int)event.getX();
            //int y = (int)event.getY();

            //if (x > box_x && x < box_x + 29 && y > box_y && y < box_y + 30){
                //mode = true;
                box_x = (int)event.getX();
            //}
        }

        if(event.getAction() == MotionEvent.ACTION_MOVE) {
            //int x = (int)event.getX();
            //int y = (int)event.getY();

            //if (mode == true){
                box_x = (int)event.getX();
            //}
        }

        invalidate();

        return true;
    }


    @Override
    public void surfaceChanged(SurfaceHolder holder, 
            int format, int width, int height ){

    }


    @Override
    public void surfaceCreated(SurfaceHolder holder){
        thread.startRunning(true);
        thread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder){
        thread.startRunning(false);
        thread.stop();
    }



}

2 个答案:

答案 0 :(得分:2)

只需检查触摸事件x和y坐标,并检查此x,y组合是否在框的范围内。通过查看已注释掉的代码,我可以看到你走在正确的道路上。

做这样的事情:

RectF rect = new RectF(x,y, x + box.getWidth(), y+box.geHeight());

if(rect.contains(touchX, touchY)) {
    // You hit the box, allow dragging...
}

答案 1 :(得分:0)

试试这个:

package teste.com.br.teste;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Tacila on 03/07
 */

public class Game extends View {
    private Context context;
    private BitmaptArrastavel bmArrastavel;
    private BitmaptArrastavel bmArrastavel2;
    private BitmaptArrastavel bmArrastavelTeste;
    private List<BitmaptArrastavel> btms;
    private BitmaptArrastavel[] btmsAtivas;

    private BitmaptArrastavel[] lake;
    private BitmaptArrastavel[] ativos;


    private int qntDeItens = 5;

    public Game(Context context) {
        super(context);
        this.context = context;
        init();
    }


    public void init() {
        btms = new ArrayList<BitmaptArrastavel>();
        btmsAtivas = new BitmaptArrastavel[1];

        ativos=new BitmaptArrastavel[1];
        lake = new BitmaptArrastavel[3];

        lake[0] = new BitmaptArrastavel(escalaBitmap(BitmapFactory.decodeResource(context.getResources(), R.drawable.cartadc)), 200);
        lake[1] = new BitmaptArrastavel(escalaBitmap(BitmapFactory.decodeResource(context.getResources(), R.drawable.cartaao)), 210);
        lake[2] = new BitmaptArrastavel(escalaBitmap(BitmapFactory.decodeResource(context.getResources(), R.drawable.cartake)), 220);

        btms.add(bmArrastavel);
        btms.add(bmArrastavelTeste);
        btms.add(bmArrastavel2);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawRGB(0,0,139);

        for(int i = 0; i<=2; i++){
            lake[i].drawOnCanvas(canvas);
        }
    }

    public void travarArr(float x, float y ){
        for(int i = 0; i<=2 ; i++){
            if(lake[i].isDentro(x,y)){
                ativos[0]=lake[i];
            }
        }
    }


    public void destravarBitmap() {
        ativos[0]=null;
    }

    public Bitmap escalaBitmap(Bitmap bm) {

        return Bitmap.createScaledBitmap(bm, 200, 300, false);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        final int action = event.getActionMasked();

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                System.out.println("Dentro do MotionEvent.ActionDown");
                travarArr(event.getX(),event.getY());
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                System.out.println("Dentro do MotionEvent.ActionUP e ActionCancel tenho q entrar no destrava ");
                destravarBitmap();
                break;
            case MotionEvent.ACTION_MOVE:
                System.out.println("Dentro do MotionEvent.ActionMove");

                for(int i = 0; i<ativos.length;i++){
                    if(ativos[i]!=null){
                        ativos[i].mover((int)event.getX(),(int)event.getY());
                        invalidate();
                    }
                }
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                System.out.println("Dentro do MotionEvent.ActionPointerDown");
                travarArr(event.getX(), event.getY());
                break;
            case MotionEvent.ACTION_POINTER_UP:
                System.out.println("Dentro do MotionEvent.ActionPointerUp");
                destravarBitmap();
                break;
            default:
                return super.onTouchEvent(event);
        }
        return true;
    }


//    int rotation = 0;
//
//    public Bitmap vertical() {
//        Matrix matrix = new Matrix();
//        matrix.postRotate(90);
//        Bitmap bm = escalaBitmap(BitmapFactory.decodeResource(context.getResources(), R.drawable.carta4c));
//        return Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
//    }
}

BitmapArrastavel类

package teste.com.br.teste;

import android.graphics.Bitmap;
import android.graphics.Canvas;

/**
 * Created by Tacila on 05/07/2017.
 */

public class BitmaptArrastavel {

    public int x, y, altura, largura;
    private Bitmap bitmap;

    public BitmaptArrastavel(Bitmap b, int x) {
        bitmap = b;
        this.x = x;
        init();
    }

    public void init() {
        largura = 200;
        altura = 350;
    }

    public Bitmap escalaBitmap(Bitmap bm) {
        return Bitmap.createScaledBitmap(bm, largura, altura, false);
    }

    public boolean isDentro(float x, float y) {
        return (x >= this.x && x <= this.x + largura && y >= this.y && y <= this.y + altura);
    }
    public void drawOnCanvas(Canvas canvas) {

        canvas.drawBitmap(bitmap, x, y, null);
    }

    public void mover(int x, int y) {
        this.x = x;
        this.y = y;
    }
}