2011-03-04 44 views
0

在我的視圖中,我想要放置一個隱藏按鈕,並在該隱藏按鈕上方放置圖像。每當用戶拖動圖像時,應該調用按鈕的拖動事件。任何人都可以建議如何做到這一點?由於Android中沒有內置的拖動事件方法。如何在Android中的按鈕上放置拖動事件?

在此先感謝。

+3

歡迎提前.... – 2011-03-08 09:40:52

回答

1

使用此代碼爲阻力

Main.java

package com.drag; 
import android.app.Activity; 
import android.os.Bundle; 

public class Main extends Activity{ 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
{ 
     super.onCreate(savedInstanceState); 

     // draw the view 
     setContentView(new DrawView(this)); 


    } 

} 

DrawView.java

package com.drag; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Point; 
import android.view.MotionEvent; 
import android.view.View; 

public class DrawView extends View 
{ 

    private ColorBall[] colorballs = new ColorBall[3]; // array that holds the balls 

    private int balID = 0; // variable to know what ball is being dragged 

    public DrawView(Context context) { 
     super(context); 
     setFocusable(true); //necessary for getting the touch events 

     // setting the start point for the balls 
     Point point1 = new Point(); 
     point1.x = 50; 
     point1.y = 20; 
     Point point2 = new Point(); 
     point2.x = 100; 
     point2.y = 20; 
     Point point3 = new Point(); 
     point3.x = 150; 
     point3.y = 20; 


     // declare each ball with the ColorBall class 
     colorballs[0] = new ColorBall(context,R.drawable.bol_groen, point1); 
     colorballs[1] = new ColorBall(context,R.drawable.bol_rood, point2); 
     colorballs[2] = new ColorBall(context,R.drawable.bol_blauw, point3); 


    } 

    // the method that draws the balls 
    @Override protected void onDraw(Canvas canvas) { 
     //canvas.drawColor(0xFFCCCCCC);  //if you want another background color  

     //draw the balls on the canvas 
     for (ColorBall ball : colorballs) { 
      canvas.drawBitmap(ball.getBitmap(), ball.getX(), ball.getY(), null); 
      } 

    } 

    // events when touching the screen 
    public boolean onTouchEvent(MotionEvent event) { 
     int eventaction = event.getAction(); 

     int X = (int)event.getX(); 
     int Y = (int)event.getY(); 

     switch (eventaction) { 

     case MotionEvent.ACTION_DOWN: // touch down so check if the finger is on a ball 
      balID = 0; 
      for (ColorBall ball : colorballs) { 
       // check if inside the bounds of the ball (circle) 
       // get the center for the ball 
       int centerX = ball.getX() + 25; 
       int centerY = ball.getY() + 25; 

       // calculate the radius from the touch to the center of the ball 
       double radCircle = Math.sqrt((double) (((centerX-X)*(centerX-X)) + (centerY-Y)*(centerY-Y))); 

       // if the radius is smaller then 23 (radius of a ball is 22), then it must be on the ball 
       if (radCircle < 23){ 
        balID = ball.getID(); 
        break; 
       } 

       // check all the bounds of the ball (square) 
       //if (X > ball.getX() && X < ball.getX()+50 && Y > ball.getY() && Y < ball.getY()+50){ 
       // balID = ball.getID(); 
       // break; 
       //} 
       } 

      break; 


     case MotionEvent.ACTION_MOVE: // touch drag with the ball 
      // move the balls the same as the finger 
      if (balID > 0) { 
       colorballs[balID-1].setX(X-25); 
       colorballs[balID-1].setY(Y-25); 
      } 

      break; 

     case MotionEvent.ACTION_UP: 
      // touch drop - just do things here after dropping 

      break; 
     } 
     // redraw the canvas 
     invalidate(); 
     return true; 

    } 
} 

ColorBall.java

package com.drag; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Point; 

public class ColorBall 
{ 

private Bitmap img; // the image of the ball 

private int coordX = 0; // the x coordinate at the canvas 

private int coordY = 0; // the y coordinate at the canvas 

private int id; // gives every ball his own id, for now not necessary 

private static int count = 1; 

private boolean goRight = true; 

private boolean goDown = true; 

    public ColorBall(Context context, int drawable) { 

     BitmapFactory.Options opts = new BitmapFactory.Options(); 
     opts.inJustDecodeBounds = true; 
     img = BitmapFactory.decodeResource(context.getResources(), drawable); 
     id=count; 
     count++; 

    } 

    public ColorBall(Context context, int drawable, Point point) { 

     BitmapFactory.Options opts = new BitmapFactory.Options(); 
     opts.inJustDecodeBounds = true; 
     img = BitmapFactory.decodeResource(context.getResources(), drawable); 
     id=count; 
     count++; 
     coordX= point.x; 
     coordY = point.y; 

    } 

    public static int getCount() { 
     return count; 
    } 

    void setX(int newValue) { 
     coordX = newValue; 
    } 

    public int getX() { 
     return coordX; 
    } 

    void setY(int newValue) { 
     coordY = newValue; 
    } 

    public int getY() { 
     return coordY; 
    } 

    public int getID() { 
     return id; 
    } 

    public Bitmap getBitmap() { 
     return img; 
    } 

    public void moveBall(int goX, int goY) { 
     // check the borders, and set the direction if a border has reached 
     if (coordX > 270){ 
      goRight = false; 
     } 
     if (coordX < 0){ 
      goRight = true; 
     } 
     if (coordY > 400){ 
      goDown = false; 
     } 
     if (coordY < 0){ 
      goDown = true; 
     } 
     // move the x and y 
     if (goRight){ 
      coordX += goX; 
     }else 
     { 
      coordX -= goX; 
     } 
     if (goDown){ 
      coordY += goY; 
     }else 
     { 
      coordY -= goY; 
     } 

    } 

}