Перетащите ImageView или Растровое изображение на ощупь - PullRequest
0 голосов
/ 15 марта 2011

В настоящее время у меня есть кое-что работающее, где я могу перетащить блок горизонтально на экране (что я хочу, чтобы он делал).Тем не менее, он работает, когда вы нажимаете в любом месте на экране, и я хочу, чтобы он работал только тогда, когда флажок был нажат.Я пытался реализовать это по-разному, и я искал повсюду и до сих пор остается потерянным.Кто-нибудь может помочь?Я также не могу понять, как размещается растровое изображение (сейчас я использую растровое изображение, поскольку не могу понять, как реализовать ImageView внутри моего SurfaceView).Если я скажу, что мое растровое изображение размещено в 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 ]

2 голосов
/ 15 марта 2011

Просто проверьте координаты события касания 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...
}
0 голосов
/ 18 августа 2017

Попробуйте это:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...