2011-03-15 40 views
0

我目前有一些工作,我可以在屏幕上水平拖動一個盒子(我想要它)。但是,當您單擊屏幕上的任意位置時,它就會起作用,並且我希望它僅在單擊該框時才能使用。我試圖用不同的方式來實現這一點,而且我已經看遍了各個地方,並仍然迷失方向。任何人都可以幫忙嗎?我也無法弄清楚位圖是如何放置的(我現在正在使用位圖,因爲我無法在我的生活中弄清楚如何在SurfaceView中實現ImageView)。如果我說我的位圖放置在0,0,那麼根據它的左上角將位圖放置在0,0?我還有一個算法,可以在盒子到達邊緣時停止,但我必須重寫,因爲我必須刪除它。請,如果你可以提供你的知識,我將不勝感激拖動ImageView或點擊位圖

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

只需點擊觸摸事件的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

我應該在ActionDown事件或ActionMove事件這樣的課嗎? – 2011-03-15 20:32:36

+0

現在它真的很糟糕,我需要在它裏面找出一些問題。它的動作更流暢。 – 2011-03-15 21:01:35

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; 
    } 
} 
相關問題