아하
생활

생활꿀팁

프알못
프알못

onMeasure로 부모 뷰 높이의 일정 비율을 차지하게 하기

커스텀 뷰를 ViewPager에서 쓰고 있습니다.

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.test.LinearLayout android:background="@color/background" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/above" android:tag="13/24"> </com.example.test.LinearLayout> <LinearLayout android:background="@color/colorPrimary" android:layout_width="match_parent" android:layout_height="match_parent"> </LinearLayout> </LinearLayout>

com.example.test.LinearLayout이 그 커스텀뷰인데요,

스크롤에 따라 높이배경에 애니메이션을 적용하기 위해 커스텀뷰를 사용했습니다.

package com.example.test; import android.content.Context; import android.util.AttributeSet; import android.support.annotation.Nullable; public class LinearLayout extends android.widget.LinearLayout { public final float ratio; private float getRatio() { String tmp[] = getTag().toString().split("/"); return Integer.parseInt(tmp[0]) / Float.parseFloat(tmp[1]); } public LinearLayout(Context context) { super(context); ratio = getRatio(); } public LinearLayout(Context context, @Nullable AttributeSet attrs) { super(context, attrs); ratio = getRatio(); } public LinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); ratio = getRatio(); } private android.widget.LinearLayout.LayoutParams lp = new android.widget.LinearLayout.LayoutParams(0, 0); @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { lp.width = MeasureSpec.getSize(widthMeasureSpec); lp.height = (int)(ratio * MeasureSpec.getSize(heightMeasureSpec)); this.setMeasuredDimension(lp.width, lp.height); this.setLayoutParams(lp); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }

위의 XML처럼 다른 LinearLayout 하나, 이 뷰 하나 있는 경우만 고려해도 됩니다.

화면에서 높이를 onMeasure로 XML에서 android:tag로 설정한 비율만큼 차지하게 하려는데

앱을 처음 켰을 때부터 원하는 비율의 높이가 나오지 않습니다.

심지어 스크롤을 넘길 때마다 높이가 점점 낮아지다가 사라집니다.

어떤 부분이 잘못된 걸까요?

    55글자 더 채워주세요.
    1개의 답변이 있어요!
    • 현명한참밀드리172
      현명한참밀드리172

      안녕하세요.

      Onmeasure안에서 일단 serlayoutparam을 하면 안됩니다. Onmeasure를 오버라이드해서 사용할 경우 사이즈 계산을 내가 하겠다 라는 의미이므로 최종적으로 sermeasureddimension에 계산된 사이즈를 넘겨주면 됩니다. Super.onmeasure를 콜한다는 것은 부모의기본 로직을 따르겠다는 의미입니다.