Android 判断view是否被遮挡
2015-11-02 10:15
441 查看
原理,通过view的四个顶点坐标,判断view之间是否有重叠的区域,以此来判断view是否被遮挡,但是情况覆盖不全面,需要根据具体情况调整判断策略
public boolean isViewCovered(final View view)
{
View currentView = view;
Rect currentViewRect = new Rect();
boolean partVisible =currentView.getGlobalVisibleRect(currentViewRect);
boolean totalHeightVisible = (currentViewRect.bottom - currentViewRect.top) >=view.getMeasuredHeight();
boolean totalWidthVisible = (currentViewRect.right - currentViewRect.left) >= view.getMeasuredWidth();
boolean totalViewVisible = partVisible && totalHeightVisible && totalWidthVisible;
if (!totalViewVisible)//if any part of the view is clipped by any of its parents,return true
return true;
while (currentView.getParent() instanceof ViewGroup)
{
ViewGroup currentParent = (ViewGroup) currentView.getParent();
if (currentParent.getVisibility() != View.VISIBLE)//if the parent of view is not visible,return true
return true;
int start = indexOfViewInParent(currentView, currentParent);
for (int i = start + 1; i < currentParent.getChildCount(); i++)
{
Rect viewRect = new Rect();
view.getGlobalVisibleRect(viewRect);
View otherView = currentParent.getChildAt(i);
Rect otherViewRect = new Rect();
otherView.getGlobalVisibleRect(otherViewRect);
if (Rect.intersects(viewRect, otherViewRect))//if view intersects its older brother(covered),return true
return true;
}
currentView = currentParent;
}
return false;
}
private int indexOfViewInParent(View view, ViewGroup parent)
{
int index;
for (index = 0; index < parent.getChildCount(); index++)
{
if (parent.getChildAt(index) == view)
break;
}
return index;
}
public boolean isViewCovered(final View view)
{
View currentView = view;
Rect currentViewRect = new Rect();
boolean partVisible =currentView.getGlobalVisibleRect(currentViewRect);
boolean totalHeightVisible = (currentViewRect.bottom - currentViewRect.top) >=view.getMeasuredHeight();
boolean totalWidthVisible = (currentViewRect.right - currentViewRect.left) >= view.getMeasuredWidth();
boolean totalViewVisible = partVisible && totalHeightVisible && totalWidthVisible;
if (!totalViewVisible)//if any part of the view is clipped by any of its parents,return true
return true;
while (currentView.getParent() instanceof ViewGroup)
{
ViewGroup currentParent = (ViewGroup) currentView.getParent();
if (currentParent.getVisibility() != View.VISIBLE)//if the parent of view is not visible,return true
return true;
int start = indexOfViewInParent(currentView, currentParent);
for (int i = start + 1; i < currentParent.getChildCount(); i++)
{
Rect viewRect = new Rect();
view.getGlobalVisibleRect(viewRect);
View otherView = currentParent.getChildAt(i);
Rect otherViewRect = new Rect();
otherView.getGlobalVisibleRect(otherViewRect);
if (Rect.intersects(viewRect, otherViewRect))//if view intersects its older brother(covered),return true
return true;
}
currentView = currentParent;
}
return false;
}
private int indexOfViewInParent(View view, ViewGroup parent)
{
int index;
for (index = 0; index < parent.getChildCount(); index++)
{
if (parent.getChildAt(index) == view)
break;
}
return index;
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories