扩展视图组强制子维度

时间:2015-02-11 00:53:27

标签: android gridview android-viewgroup

我写了以下ViewGroup

public class myViewGroup extends ViewGroup{

List<View> qResult;
List<Point> qLoc;
ImageView qImage;


public QueryViewLayout(Context context){
    super(context);
}

public QueryViewLayout(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public QueryViewLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    qResult = new LinkedList<View>();
    qLoc = new LinkedList<Point>();
    qImage = null;
}

public void addMainView(ImageBorderView view){
    qImage = view;
    super.removeAllViews();
    super.addView(view);
}

public void addResultView(View result, Point loc){
    super.addView(result);
    qResult.add(result);
    qLoc.add(loc);
}

/**
 * Any layout manager that doesn't scroll will want this.
 */

@Override
public boolean shouldDelayChildPressedState() {
    return false;
}


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int count = getChildCount();

    // Measurement will ultimately be computing these values.
    int maxHeight = 0;
    int maxWidth = 0;
    int childState = 0;



    // Only main view affects the layouts measure

    if (qImage != null) {
        if (qImage.getVisibility() != GONE) {
            // Measure the child.
            qImage.measure(widthMeasureSpec, heightMeasureSpec);
            maxWidth = qImage.getMeasuredWidth();
            maxHeight = qImage.getMeasuredHeight();
            childState = qImage.getMeasuredState();
        }
    }

    for (View child:qResult){
        if (MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.UNSPECIFIED)
            child.measure(MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST),
                    MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST));
    }

    maxHeight = Math.max(maxHeight, getSuggestedMinimumHeight());
    maxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());

    // Report our final dimensions.
    setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),
            resolveSizeAndState(maxHeight, heightMeasureSpec,
                    childState << MEASURED_HEIGHT_STATE_SHIFT));


}


@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    final int count = getChildCount();

    int parentLeft = left + getPaddingLeft();
    int parentRight = right - getPaddingRight();

    final int parentTop = top + getPaddingTop();
    final int parentBottom = bottom - getPaddingBottom();

    if (qImage == null) return;

    qImage.layout(parentLeft, parentTop, parentRight, parentBottom);


    Iterator<Point> loc = qLoc.iterator();
    for (View child:qResult) {
        Point p = loc.next();
        if (child.getVisibility() != GONE) {

            int width = child.getMeasuredWidth();
            int height = child.getMeasuredHeight();
            Point locOnView = qImage.projectOnView(p);

            width = (width < (int) Math.max(parentRight - (int) locOnView.x, locOnView.x - parentLeft)) ?
            width : (parentLeft + parentRight)/2;
            height = (height < (int) Math.max(parentBottom - (int) locOnView.y, locOnView.y - parentTop)) ?
            height : (parentBottom + parentTop)/2;

            int x = (width < (parentRight - (int) locOnView.x)) ? (int) locOnView.x : (parentRight - width);
            int y = (height < parentBottom - (int) locOnView.y) ? (int) locOnView.y : (parentBottom - height);


            // Place the child.
            child.layout(x, y, x + width, y + height);
        }
    }

}

}

当我使用GridView作为任意视图时,应该在图像顶部显示一些任意视图,给定该视图的位置,即使我已经为GridView定义了一定的宽度,它也被迫拥有宽度与框架一样大。在测量阶段,我将模式更改为

MeasureSpec.AT_MOST

对于叠加视图的宽度和高度,但这似乎不起作用,有人可以帮忙。

这里是xml我在哪里,从

中膨胀GridView
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/result_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:columnWidth="@dimen/result_view_column_width"
android:numColumns="2"
android:verticalSpacing="2dp"
android:horizontalSpacing="2dp"
android:stretchMode="none"
android:gravity="center"
android:layout_margin = "2dp"
android:background="@drawable/solid_with_shadow" />

1 个答案:

答案 0 :(得分:0)

经过大量的反复试验,取代

child.measure(MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST),
                MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST));

measureChild(child, MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST),
                MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST));

为我工作,我不知道为什么,但一个疯狂的猜测将是一个孩子的调用措施不读取所有的xml道具,但measureChild(孩子,...)做。