Это большая работа, которую я делаю при создании ListView с настраиваемой функцией overscroll.
Я хочу создать пользовательский элемент, который расширяет RelativeLayout, но добавление дочернего представления не работает вообще хорошо. Код кажется правильным, но вид выглядит немного сумасшедшим.
underscrollEdge = new ImageView(context);
underscrollEdge.setImageResource(R.drawable.underscroll_edge);
underscrollGlow = new ImageView(context);
underscrollGlow.setImageResource(R.drawable.underscroll_glow);
overscrollGlow = new ImageView(context);
overscrollGlow.setImageResource(R.drawable.overscroll_glow);
overscrollEdge = new ImageView(context);
overscrollEdge.setImageResource(R.drawable.overscroll_edge);
RelativeLayout.LayoutParams topLayout = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
topLayout.addRule(RelativeLayout.ALIGN_PARENT_TOP);
addView(underscrollEdge, topLayout);
addView(underscrollGlow, topLayout);
RelativeLayout.LayoutParams bottomLayout = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
bottomLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
addView(overscrollGlow, bottomLayout);
addView(overscrollEdge, bottomLayout);
Это, как ни странно, дает это (я установил относительный макет на черный, чтобы показать края и сияния):
Как вы можете видеть, верхний край плавает посредине нигде, а нижнее свечение уменьшилось до крошечного крошечного размера... Какого черта?
Любовь, как записывать проблему помогает мне решить ее:
RelativeLayout.LayoutParams topLayout = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
topLayout.addRule(RelativeLayout.ALIGN_PARENT_TOP);
addView(underscrollGlow, topLayout);
topLayout = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
topLayout.addRule(RelativeLayout.ALIGN_PARENT_TOP);
addView(underscrollEdge, topLayout);
RelativeLayout.LayoutParams bottomLayout = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
bottomLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
addView(overscrollGlow, bottomLayout);
bottomLayout = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
bottomLayout.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
addView(overscrollEdge, bottomLayout);
Использование тех же LayoutParams для двух компонентов делает вещи странными. Кажется обременительным, но он исправляет ситуацию.