我有一个相当简单的片段,它将一些彩色的ImageView添加到RelativeLayout . 有比屏幕上可以容纳的图像更多的图像,所以我实现了一些自定义滚动 .
但是,当我滚动时,我看到有一个大约90dp的白色边框重叠内容的一部分,在我滚动之前屏幕的边缘 . 很明显,ImageViews仍在正确创建和绘制,但它们正在被掩盖 .
我怎么摆脱这个?
我试过了:
-
将RelativeLayout和FrameLayout都更改为WRAP_CONTENT,FILL_PARENT,MATCH_PARENT以及它们的一些组合 .
-
将两个布局的填充和边距设置为0dp .
例:
分段:
public class MyFrag extends Fragment implements OnTouchListener {
int currentX;
int currentY;
RelativeLayout container;
final int[] colors = {Color.BLACK, Color.RED, Color.BLUE};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup fragContainer, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_myfrag, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
container = (RelativeLayout) getView().findViewById(R.id.container);
container.setOnTouchListener(this);
// Temp- Add a bunch of images to test scrolling
for(int i=0; i<1500; i+=100) {
for (int j=0; j<1500; j+=100) {
int color = colors[(i+j)%3];
ImageView image = new ImageView(getActivity());
image.setScaleType(ImageView.ScaleType.CENTER);
image.setBackgroundColor(color);
LayoutParams lp = new RelativeLayout.LayoutParams(100, 100);
lp.setMargins(i, j, 0, 0);
image.setLayoutParams(lp);
container.addView(image);
}
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
currentX = (int) event.getRawX();
currentY = (int) event.getRawY();
break;
}
case MotionEvent.ACTION_MOVE: {
int x2 = (int) event.getRawX();
int y2 = (int) event.getRawY();
container.scrollBy(currentX - x2 , currentY - y2);
currentX = x2;
currentY = y2;
break;
}
case MotionEvent.ACTION_UP: {
break;
}
}
return true;
}
}
XML:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context=".FloorPlanFrag">
<RelativeLayout
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</FrameLayout>
1 回答
在查看RelativeLayout source时,我注意到
onMeasure()
调用applyHorizontalSizeRules(LayoutParams childParams, int myWidth)
和applyVerticalSizeRules(LayoutParams childParams, int myHeight)
.在
applyHorizontalSizeRules
我找到了myWidth和myHeight参数:myWidth参数初始化为-1,然后根据onMeasure()参数的MeasureSpec模式进行更改 .
所以我创建了自己的View,它扩展了RelativeLayout,并覆盖onMeasure()以将模式设置为'unspecified':
奇迹般有效!