开发者

Drag ImageView Or Bitmap Upon Touch

I currently have something working where I can drag a box horizontally on the screen (what I want it to do). However, it works when you click ANYWH开发者_如何学运维ERE on the screen, and I want it to work only when the box has been clicked. I have tried implementing this in different ways, and I've looked all over the place and still remain lost. Can anybody help? I also can't figure out how a bitmap is placed (I'm using a bitmap right now as I can't for the life of me figure out how to implement the ImageView inside my SurfaceView). If I say my bitmap is placed at 0,0 will that place the bitmap according to its top left corner at 0,0? I also had an algorithm for stopping the box when it reached an edge, but I'll just have to rewrite that as I must have deleted it. Please if you can offer your knowledge I would GREATLY appreciate it

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



}


Simply check the touch event x and y coordinate, and check if this x,y-combination is within the box's bounds. I can see you are on the right path by looking at your commented out code.

Do something like this:

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

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


Try this:

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

The class 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;
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜