2016-04-21 32 views
1

我想將自定義視圖放入scrollView。這是我的自定義視圖MyCustomLayout.javaAndroid自定義視圖到scrollView不顯示

public class MyCustomLayout extends ViewGroup { 

private static final int UNEVEN_GRID_PENALTY_MULTIPLIER = 10; 

private int mMaxChildWidth = 0; 
private int mMaxChildHeight = 0; 

public MyCustomLayout(Context context) { 
    super(context, null); 
} 

public MyCustomLayout(Context context, AttributeSet attrs) { 
    super(context, attrs, 0); 
} 

public MyCustomLayout(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    mMaxChildWidth = 0; 
    mMaxChildHeight = 0; 

    int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
      MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST); 
    int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
      MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST); 

    final int count = getChildCount(); 
    for (int i = 0; i < count; i++) { 
     final View child = getChildAt(i); 
     if (child.getVisibility() == GONE) { 
      continue; 
     } 

     child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 

     mMaxChildWidth = Math.max(mMaxChildWidth, child.getMeasuredWidth()); 
     mMaxChildHeight = Math.max(mMaxChildHeight, child.getMeasuredHeight()); 
    } 

    childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
      mMaxChildWidth, MeasureSpec.EXACTLY); 
    childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
      mMaxChildHeight, MeasureSpec.EXACTLY); 

    for (int i = 0; i < count; i++) { 
     final View child = getChildAt(i); 
     if (child.getVisibility() == GONE) { 
      continue; 
     } 

     child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 
    } 

    setMeasuredDimension(
      resolveSize(mMaxChildWidth, widthMeasureSpec), 
      resolveSize(mMaxChildHeight, heightMeasureSpec)); 
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    int width = r - l; 
    int height = b - t; 

    final int count = getChildCount(); 

    // Calculate the number of visible children. 
    int visibleCount = 0; 
    for (int i = 0; i < count; i++) { 
     final View child = getChildAt(i); 
     if (child.getVisibility() == GONE) { 
      continue; 
     } 
     ++visibleCount; 
    } 

    if (visibleCount == 0) { 
     return; 
    } 

    int bestSpaceDifference = Integer.MAX_VALUE; 
    int spaceDifference; 

    int hSpace = 0; 
    int vSpace = 0; 

    int cols = 1; 
    int rows; 

    while (true) { 
     rows = (visibleCount - 1)/cols + 1; 

     hSpace = ((width - mMaxChildWidth * cols)/(cols + 1)); 
     vSpace = ((height - mMaxChildHeight * rows)/(rows + 1)); 

     spaceDifference = Math.abs(vSpace - hSpace); 
     if (rows * cols != visibleCount) { 
      spaceDifference *= UNEVEN_GRID_PENALTY_MULTIPLIER; 
     } 

     if (spaceDifference < bestSpaceDifference) { 
      bestSpaceDifference = spaceDifference; 
      if (rows == 1) { 
       break; 
      } 
     } else { 
      --cols; 
      rows = (visibleCount - 1)/cols + 1; 
      hSpace = ((width - mMaxChildWidth * cols)/(cols + 1)); 
      vSpace = ((height - mMaxChildHeight * rows)/(rows + 1)); 
      break; 
     } 

     ++cols; 
    } 

    hSpace = Math.max(0, hSpace); 
    vSpace = Math.max(0, vSpace); 

    width = (width - hSpace * (cols + 1))/cols; 
    height = (height - vSpace * (rows + 1))/rows; 

    int left, top; 
    int col, row; 
    int visibleIndex = 0; 
    for (int i = 0; i < count; i++) { 
     final View child = getChildAt(i); 
     if (child.getVisibility() == GONE) { 
      continue; 
     } 

     row = visibleIndex/cols; 
     col = visibleIndex % cols; 

     left = hSpace * (col + 1) + width * col; 
     top = vSpace * (row + 1) + height * row; 

     child.layout(left, top, 
       (hSpace == 0 && col == cols - 1) ? r : (left + width), 
       (vSpace == 0 && row == rows - 1) ? b : (top + height)); 
     ++visibleIndex; 
    } 
} 
} 

當我在與XML代碼的LinearLayout使用。它工作正常。

<com.crazyCoder.androiddeshboard.MyCustomLayout 
    android:id="@+id/layout_custom" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#f8f9fe" > 
</com.crazyCoder.androiddeshboard.MyCustomLayout> 

但是,當我投入像滾動視圖通過了滾動此

<ScrollView 
    android:id="@+id/scrollview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#ffffd9f4"> 

    <com.crazyCoder.androiddeshboard.MyCustomLayout 
     android:id="@+id/layout_custom" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#f8f9fe" > 
    </com.crazyCoder.androiddeshboard.MyCustomLayout> 

</ScrollView> 

自定義視圖重疊。像這樣的輸出。

ScrollView Output

請幫幫我。提前致謝。

回答

0

嘗試將FrameLayout放在ScrollView中,並將MyCustomLatyout放入FrameLayout中。

<ScrollView 
    android:id="@+id/scrollview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#ffffd9f4"> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <com.crazyCoder.androiddeshboard.MyCustomLayout 
      android:id="@+id/layout_custom" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="#f8f9fe" > 
     </com.crazyCoder.androiddeshboard.MyCustomLayout> 

    </FrameLayout> 
</ScrollView> 
+1

謝謝@Katya,但它不起作用。輸出是一樣的。 – crazyCoder