我们假设我有一个基本布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/layout_container">
<com.example.ScrollingView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrolling_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" />
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center">
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true"
android:layout_margin="1dp"
android:visibility="gone"/>
</FrameLayout>
</FrameLayout>
在我的scrollManager中,当你到达可滚动区域的边缘时,我会显示一个EdgeEffect。 EdgeEffect的左右边缘计算如下:
View scrollView = findViewById(R.id.scrolling_view);
int containerWidth = scrollView.getContainerWidth();
int leftEdge = scrollView.getLeft(); // this is relative to parent, so returns 0!
int rightEdge = leftEdge + containerWidth;
// EdgeEffects are correctly drawn after this
layout_container在ListView中绘制。如果它是视图中唯一的项目,则所有这些代码都能正常工作,因为getLeft()会返回相对于父视图的leftX,它是0,恰好对应于屏幕的左侧。
但是,假设我在scrollp_view的左侧添加另一个100px宽的视图。突然间,所有这些代码都变成了垃圾:
View scrollView = findViewById(R.id.scrolling_view);
int containerWidth = scrollView.getContainerWidth(); // 500px
int leftEdge = scrollView.getLeft(); // this is relative to parent, so returns 0. however, its absolute position is now 100.
int rightEdge = leftEdge + containerWidth; // this now stops 100px short of the right edge of the screen
// EdgeEffects drawn after this all shifted 100px to the left
所以我提出的解决方案是将scrollView.getLeft()(相对于父视图)更改为view.getLocationOnScreen()(这是绝对的)。
View scrollView = findViewById(R.id.scrolling_view);
int containerWidth = scrollView.getContainerWidth();
int[] posXY = new int[2];
scrollView.getPositionOnSreen(posXY);
int leftEdge = posXY[0];
int rightEdge = leftEdge + containerWidth;
我很快就对它进行了测试,它在横向和纵向模式下都能在手机和平板电脑上完美运行。
我的问题:
谢谢!