今天做一个自定义ViewGroup,通过addView动态添加子控件,为了省事,直接在父控件里重写public boolean onTouchEvent(MotionEvent event){}方法来监听当前触碰是哪个按钮,遇到点问题,所以写下来。

首先是点击效果只有 MotionEvent.ACTION_DOWN,这个把返回改为return true;就行了

然后是 getX()和getRawX()的区别,这个这篇博文有写到

http://www.cnblogs.com/foura/articles/2016881.html

总结就是:getX()是表示Widget相对于自身左上角的x坐标,而getRawX()是表示相对于屏幕左上角的x坐标值(注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕),getY(),getRawY()一样的道理

之前设置矩形一直是

rects.add(new Rect());

getChildAt(i).getGlobalVisibleRect(rects.get(i));但今天出了点问题,因为今天使用的是dialog主题.所以坐标一直不对,

只好直接使用 rects.add(new Rect(v.getLeft(),v.getTop(),v.getRight(),v.getBottom()));

使用子View在父View中的位置来绘制矩形,然后比较父View的getX()方法。

关于这些看着头晕的方法的区别,主要是参考这篇,来区分哪个是相对屏幕,哪个是相对自己

http://blog.csdn.net/centralperk/article/details/7949900

尤其是这个getLeft , getTopgetBottomgetRight,  这一组是获取子View相对在它父View里的坐标,这个的帮助。

这边随便贴个监听的方法,当然还要完善一下才能用,解决点小问题

	private ArrayList rects = new ArrayList();
	private int eventX = 0;
	private int eventY = 0;
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
//		Log.e("", "_____"+event.getAction());
		if(event.getAction() == MotionEvent.ACTION_DOWN){
			eventX = (int) event.getX();
			eventY = (int) event.getY();
		}
		//判断当前用户点击的那一项
		if (event.getAction() == MotionEvent.ACTION_UP) {
			int upX = (int) event.getX();
			int upY = (int) event.getY();
			if(Math.abs(upX-eventX)<50&&Math.abs(upY-eventY)<50){
				for (int i = 0,len=getChildCount(); i < len; i++) {
					if(rects.size() < len){
						View v = getChildAt(i);
						rects.add(new Rect(v.getLeft(),v.getTop(),v.getRight(),v.getBottom()));
					}
//            		Log.e("", +upX+"+"+event.getRawX()+"__"+upY+"+"+event.getRawY()+"___"+rects.get(i));
					if(rects.get(i).contains(upX, upY)){
						Log.e("", "i__"+i);
						getChildAt(i).setSelected(true);
					}else{
						getChildAt(i).setSelected(false);
					}
				}
			}
		}
		return true;
	}