关于Android自定义View中的onTouchEvent(MotionEvent event)事件监听
今天做一个自定义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,getTop,getBottom,getRight, 这一组是获取子View相对在它父View里的坐标,这个的帮助。
这边随便贴个监听的方法,当然还要完善一下才能用,解决点小问题
privateArrayList<Rect>rects=newArrayList<Rect>();privateinteventX=0;privateinteventY=0;@OverridepublicbooleanonTouchEvent(MotionEventevent){//TODOAuto-generatedmethodstub//Log.e("","_____"+event.getAction());if(event.getAction()==MotionEvent.ACTION_DOWN){eventX=(int)event.getX();eventY=(int)event.getY();}//判断当前用户点击的那一项if(event.getAction()==MotionEvent.ACTION_UP){intupX=(int)event.getX();intupY=(int)event.getY();if(Math.abs(upX-eventX)<50&&Math.abs(upY-eventY)<50){for(inti=0,len=getChildCount();i<len;i++){if(rects.size()<len){Viewv=getChildAt(i);rects.add(newRect(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);}}}}returntrue;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。