Android进阶篇-onTouchEvent的使用

这里通过演示一个可以拖动颜色球的例子来展示Android中onTouchEvent的使用以及自定义View。

实体类ColorBall:

/**
 * @author gongchaobin
 *
 * 实体类 颜色球
 */
public class ColorBall  {
	 private Bitmap img; //小球的图片 
	 private int coordX = 0; //画布上的X坐标
	 private int coordY = 0; //画布上的Y坐标
	 private int id; 
	 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;
		}

		if (goRight){
			coordX += goX;
		}else{
			coordX -= goX;
		}
		if (goDown){
			coordY += goY;
		}else{
			coordY -= goY;
		}
	}
	
}
自定义DrawView:

/**
 * @author gongchaobin
 * 
 * 自定义View
 */
public class DrawView extends View {
   private ColorBall[] colorballs = new ColorBall[3]; 
   private int balID = 0; 
    
    public DrawView(Context context) {
        super(context);
        setFocusable(true); 
        
        /**在画布上设置三个初始的点*/
        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;
                       
        /**New三个颜色球*/
        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);
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        
    	/**重绘颜色球*/
    	for (ColorBall ball : colorballs) {
            canvas.drawBitmap(ball.getBitmap(), ball.getX(), ball.getY(), null);
        }
    }
    
    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: 
        	balID = 0;
        	for (ColorBall ball : colorballs) {
        		/**获取到小球的中心点*/
	        		int centerX = ball.getX() + 25;
	        		int centerY = ball.getY() + 25;
	        		
	        		double radCircle  = Math.sqrt( (double) (((centerX-X)*(centerX-X)) + (centerY-Y)*(centerY-Y)));
	        		
	        		/**如果移动的距离小于23,小球没动*/
	        		if (radCircle < 23){
	        			balID = ball.getID();
	                    break;
	        		}
              }
             break; 
        /**balId>0,小球的移动状态*/
        case MotionEvent.ACTION_MOVE: 
            if (balID > 0) {
            	colorballs[balID-1].setX(X-25);
            	colorballs[balID-1].setY(Y-25);
            }
            break; 
        case MotionEvent.ACTION_UP: 
             break; 
        } 
        /**invalidate方法 进行界面刷新重绘*/
        invalidate(); 
        return true; 
    }
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值