本文的目的在于测试android viewgroup中 touchevent的传递方向。
ViewGroup 中onInterceptTouchEvent()
View 结构:
FirstGroup
SecondGroup
Child
1、默认情况下:
super.onInterceptTouchEvent()
super.onTouchEvent()
都是返回false.
这个时候的传递方向(注意,这个时候并没有触发Move事件!):
2、假如FirstGroup的onInterceptTouchEvent() 返回 true
那么从属于FirstGroup的所有child view的touch事件都被FirstGroup给截取了:
3、FirstGroup的onInterceptTouchEvent() 返回 true
并且 FirstGroup的onTouchEvent()返回true
那么
<!--[endif]-->
4、FirstGroup的onInterceptTouchEvent() 返回 false
并且FirstGroup的onTouchEvent()返回true
那么
<!--[endif]-->
5、FirstGroup的onInterceptTouchEvent() 返回 false
SecondGroup 的onInterceptTouchEvent() 返回 true
并且 SecondGroup的onTouchEvent()返回false
那么从属于SecondGroup的所有child view的touch事件都被SecondGroup给截取了:
<!--[endif]-->
6、FirstGroup的onInterceptTouchEvent() 返回 false
SecondGroup 的onInterceptTouchEvent() 返回 true
并且 SecondGroup的onTouchEvent()返回true
<!--[endif]-->
7、FirstGroup的onInterceptTouchEvent() 返回 false
SecondGroup 的onInterceptTouchEvent() 返回 false
并且SecondGroup的onTouchEvent() 返回true
<!--[endif]-->
8、FirstGroup的onInterceptTouchEvent() 返回 false
SecondGroup 的onInterceptTouchEvent() 返回 false
并且SecondGroup的onTouchEvent() 返回false
Child的onTouchEvent()返回true
总结 根ViewGroup的onInterceptTouchEvent() 是否要拦截(注意,拦截必须在第一次action down的时候!)touch event如果true,就是拦截所有的touch事件,并交给当前的viewgroup去处理!不拦截的话,就交给儿子ViewGroup处理touch event,同样的,要是它不拦截,就可以继续传递下去给儿子(也就是根ViewGroup的孙子)
如果目标view的 touch event返回false,那么,所有都不会产生action move动作;如果返回true,那么,目标view会产生touch event,而且会触发它的父view们onInterceptEvent 的 action move,注意并不会触发他们的touch event~
一般情况下:
onInterceptTouchEvent()是自Root 到 Child(要记得在Action Down中处理)
onTouchEvent()是自Child 到 Root.
方法:
/** * 读取数据 获取网络图片 * @param path 网络图片路径 * @return * @throws Exception */ public static byte[] getImage(String path) throws Exception { URL url=new URL(/blog_article/path/index.html); HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection(); urlConnection.setConnectTimeout(5*1000); urlConnection.setRequestMethod("GET"); InputStream inputStream=urlConnection.getInputStream(); if(urlConnection.getResponseCode()==200) { ByteArrayOutputStream outputStream=new ByteArrayOutputStream(); byte[] buffer=new byte[1024]; int len=0; while((len=inputStream.read(buffer))!=-1) { outputStream.write(buffer,0,len); } inputStream.close(); outputStream.close(); return outputStream.toByteArray(); } return null; }
方法的调用:
try { byte[] data=ImageService.getImage(path); if(data!=null){ Bitmap bitmap=BitmapFactory.decodeByteArray(data, 0, data.length);//构造一张位图 imageView.setImageBitmap(bitmap);//完成图片的显示 } else { Toast.makeText(MainActivity.this, R.string.fail, 1).show(); } } catch (Exception e) { Toast.makeText(MainActivity.this, R.string.imagefail, 1).show(); e.printStackTrace(); }