ViewPager의 진정한 사용자 적응 높이
4334 단어 android
다른 대부분의 컨트롤의 적응은 이 wrap콘텐츠 속성은 해결할 수 있지만 ViewPager에게는 효과가 없고 높이를 설정하지 않으면 디스플레이 처리를 하지 않는다. 내가 생각한 해결 방법은 onMeasure 방법을 다시 쓰는 것이다.
원리: 하위 컨트롤의 높이를 가져오면 ViewPager의 높이를 재설정할 수 있습니다.
첫 번째 방법은 ViewPager의 하위 컨트롤을 훑어보고 하위 컨트롤의 가장 큰 Height 값을 가져와 ViewPager의 높이를 완성하는 것이다. 그러나 데이터가 적은 View 밑에 큰 공백이 생겨 우호적인 사용자 체험을 만족시키지 못한다.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = 0;
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
if (h > height)
height = h;
}
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
두 번째 방법은 하위 컨트롤의 색인에 따라 현재 표시된 하위 컨트롤의 높이를 직접 가져오고 ViewPager의 높이를 재설정하는 것이다.구체적인 코드는 다음과 같다.
public class WrapContentHeightViewPager extends ViewPager {
private int currentIndex;
private int height = 0;
// view
private HashMap mChildrenViews = new LinkedHashMap();
public WrapContentHeightViewPager(Context context) {
super(context);
}
public WrapContentHeightViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mChildrenViews.size() > currentIndex) {
View child = mChildrenViews.get(currentIndex);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
height = child.getMeasuredHeight();
}
if (mChildrenViews.size() != 0) {
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/**
*
*
* @param current
*/
public void resetHeight(int current) {
currentIndex = current;
if (mChildrenViews.size() > current) {
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();
if (layoutParams == null) {
layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, height);
} else {
layoutParams.height = height;
}
setLayoutParams(layoutParams);
}
}
/**
* View ,
*/
public void setViewForPosition(View view, int position) {
mChildrenViews.put(position, view);
}
}
사용법은 ViewPager의 슬라이딩 감청 이벤트를 실현하고 슬라이딩 후 현재 하위 컨트롤의 인덱스에 따라 들어오고 높이를 다시 설정하려면 기본값이 필요합니다
private void initViewPagerListener() {
mViewPagerView.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
mViewPagerView.resetHeight(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
mViewPagerView.resetHeight(0);
}
사실 위 reset Height 안의 높이가 무엇이든 상관없습니다. set Layout Params를 실행하면 onMeasure 방법을 터치하기 때문입니다. onMeasure 방법에는 현재 하위 컨트롤의 높이를 가져와 ViewPager에 다시 설정하는 처리가 있습니다.
특히 주의: 높이에 맞게 하위 컨트롤, 하위 컨트롤, 하위 컨트롤에 setViewForPosition을 설정해야 합니다
/**
*
* @param mViewPagerView
*/
public void setWrapContentHeightViewPager(WrapContentHeightViewPager mViewPagerView) {
mViewPagerView.setViewForPosition(this,0);
}
많은 사람들이 백자 컨트롤을 알지 못하기 때문에 다음과 같은 내용을 보충합니다.
ViewPager 데이터는 List list = new Array List < ();
내가 말한 하위 컨트롤은 사용자 정의 뷰입니다. 사용자 정의 뷰에 setWrap Content Height ViewPager를 설정하고 ViewPager를 불러와서 현재 사용자 정의 View의 인덱스를 설정합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.