Android的换行小部件布局

Android的换行小部件布局

我正在尝试创建一个向用户显示一些数据的活动。数据可以分为“单词”,每个单词都是一个小部件,“单词”序列将形成数据(“句子”?),包含单词的ViewGroup小部件。由于“句子”中所有“单词”所需的空间将超过显示器上的可用水平空间,我想像正常的文本一样包装这些“句子”。

以下代码:

public class WrapTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout l = new LinearLayout(this);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);
        LinearLayout.LayoutParams mlp = new LinearLayout.LayoutParams(
                new ViewGroup.MarginLayoutParams(
                        LinearLayout.LayoutParams.WRAP_CONTENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT));
        mlp.setMargins(0, 0, 2, 0);

        for (int i = 0; i < 10; i++) {
            TextView t = new TextView(this);
            t.setText("Hello");
            t.setBackgroundColor(Color.RED);
            t.setSingleLine(true);
            l.addView(t, mlp);
        }

        setContentView(l, lp);
    }}

产生类似左图的东西,但我想要一个布局呈现相同的小部件,如右图所示。

https://img1.mukewang.com/5d399b59000125e502140160.jpghttps://img2.mukewang.com/5d399b5b0001d4b302140160.jpg

是否有布局或布局和参数的组合,还是我必须为此实现自己的ViewGroup?



翻过高山走不出你
浏览 593回答 3
3回答

蝴蝶不菲

我实现了与此类似的东西,但使用我认为处理间距和填充的更标准的方法。请让我知道你们的想法,并且可以在没有归属的情况下重复使用:package&nbsp;com.asolutions.widget;import&nbsp;java.util.ArrayList;import&nbsp;java.util.Collections;import&nbsp;java.util.Iterator;import&nbsp;java.util.List;import&nbsp;android.content.Context;import&nbsp;android.content.res.TypedArray;import&nbsp;android.util.AttributeSet;import&nbsp;android.view.View;import&nbsp;android.view.ViewGroup;import&nbsp;com.asolutions.widget.R;public&nbsp;class&nbsp;RowLayout&nbsp;extends&nbsp;ViewGroup&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;DEFAULT_HORIZONTAL_SPACING&nbsp;=&nbsp;5; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;int&nbsp;DEFAULT_VERTICAL_SPACING&nbsp;=&nbsp;5; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;int&nbsp;horizontalSpacing; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;int&nbsp;verticalSpacing; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;List<RowMeasurement>&nbsp;currentRows&nbsp;=&nbsp;Collections.emptyList(); &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;RowLayout(Context&nbsp;context,&nbsp;AttributeSet&nbsp;attrs)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(context,&nbsp;attrs); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TypedArray&nbsp;styledAttributes&nbsp;=&nbsp;context.obtainStyledAttributes(attrs,&nbsp;R.styleable.RowLayout); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;horizontalSpacing&nbsp;=&nbsp;styledAttributes.getDimensionPixelSize(R.styleable.RowLayout_android_horizontalSpacing, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFAULT_HORIZONTAL_SPACING); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;verticalSpacing&nbsp;=&nbsp;styledAttributes.getDimensionPixelSize(R.styleable.RowLayout_android_verticalSpacing, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFAULT_VERTICAL_SPACING); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;styledAttributes.recycle(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;onMeasure(int&nbsp;widthMeasureSpec,&nbsp;int&nbsp;heightMeasureSpec)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;int&nbsp;widthMode&nbsp;=&nbsp;MeasureSpec.getMode(widthMeasureSpec); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;int&nbsp;heightMode&nbsp;=&nbsp;MeasureSpec.getMode(heightMeasureSpec); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;int&nbsp;maxInternalWidth&nbsp;=&nbsp;MeasureSpec.getSize(widthMeasureSpec)&nbsp;-&nbsp;getHorizontalPadding(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;int&nbsp;maxInternalHeight&nbsp;=&nbsp;MeasureSpec.getSize(heightMeasureSpec)&nbsp;-&nbsp;getVerticalPadding(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<RowMeasurement>&nbsp;rows&nbsp;=&nbsp;new&nbsp;ArrayList<RowMeasurement>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RowMeasurement&nbsp;currentRow&nbsp;=&nbsp;new&nbsp;RowMeasurement(maxInternalWidth,&nbsp;widthMode); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rows.add(currentRow); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(View&nbsp;child&nbsp;:&nbsp;getLayoutChildren())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutParams&nbsp;childLayoutParams&nbsp;=&nbsp;child.getLayoutParams(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;childWidthSpec&nbsp;=&nbsp;createChildMeasureSpec(childLayoutParams.width,&nbsp;maxInternalWidth,&nbsp;widthMode); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;childHeightSpec&nbsp;=&nbsp;createChildMeasureSpec(childLayoutParams.height,&nbsp;maxInternalHeight,&nbsp;heightMode); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;child.measure(childWidthSpec,&nbsp;childHeightSpec); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;childWidth&nbsp;=&nbsp;child.getMeasuredWidth(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;childHeight&nbsp;=&nbsp;child.getMeasuredHeight(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(currentRow.wouldExceedMax(childWidth))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentRow&nbsp;=&nbsp;new&nbsp;RowMeasurement(maxInternalWidth,&nbsp;widthMode); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rows.add(currentRow); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentRow.addChildDimensions(childWidth,&nbsp;childHeight); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;longestRowWidth&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;totalRowHeight&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;index&nbsp;=&nbsp;0;&nbsp;index&nbsp;<&nbsp;rows.size();&nbsp;index++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RowMeasurement&nbsp;row&nbsp;=&nbsp;rows.get(index); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalRowHeight&nbsp;+=&nbsp;row.getHeight(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(index&nbsp;<&nbsp;rows.size()&nbsp;-&nbsp;1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalRowHeight&nbsp;+=&nbsp;verticalSpacing; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;longestRowWidth&nbsp;=&nbsp;Math.max(longestRowWidth,&nbsp;row.getWidth()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setMeasuredDimension(widthMode&nbsp;==&nbsp;MeasureSpec.EXACTLY&nbsp;?&nbsp;MeasureSpec.getSize(widthMeasureSpec)&nbsp;:&nbsp;longestRowWidth&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;getHorizontalPadding(),&nbsp;heightMode&nbsp;==&nbsp;MeasureSpec.EXACTLY&nbsp;?&nbsp;MeasureSpec.getSize(heightMeasureSpec) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;totalRowHeight&nbsp;+&nbsp;getVerticalPadding()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentRows&nbsp;=&nbsp;Collections.unmodifiableList(rows); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;createChildMeasureSpec(int&nbsp;childLayoutParam,&nbsp;int&nbsp;max,&nbsp;int&nbsp;parentMode)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;spec; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(childLayoutParam&nbsp;==&nbsp;LayoutParams.FILL_PARENT)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spec&nbsp;=&nbsp;MeasureSpec.makeMeasureSpec(max,&nbsp;MeasureSpec.EXACTLY); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(childLayoutParam&nbsp;==&nbsp;LayoutParams.WRAP_CONTENT)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spec&nbsp;=&nbsp;MeasureSpec.makeMeasureSpec(max,&nbsp;parentMode&nbsp;==&nbsp;MeasureSpec.UNSPECIFIED&nbsp;?&nbsp;MeasureSpec.UNSPECIFIED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;MeasureSpec.AT_MOST); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spec&nbsp;=&nbsp;MeasureSpec.makeMeasureSpec(childLayoutParam,&nbsp;MeasureSpec.EXACTLY); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;spec; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;onLayout(boolean&nbsp;changed,&nbsp;int&nbsp;leftPosition,&nbsp;int&nbsp;topPosition,&nbsp;int&nbsp;rightPosition,&nbsp;int&nbsp;bottomPosition)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;int&nbsp;widthOffset&nbsp;=&nbsp;getMeasuredWidth()&nbsp;-&nbsp;getPaddingRight(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x&nbsp;=&nbsp;getPaddingLeft(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;y&nbsp;=&nbsp;getPaddingTop(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator<RowMeasurement>&nbsp;rowIterator&nbsp;=&nbsp;currentRows.iterator(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RowMeasurement&nbsp;currentRow&nbsp;=&nbsp;rowIterator.next(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(View&nbsp;child&nbsp;:&nbsp;getLayoutChildren())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;int&nbsp;childWidth&nbsp;=&nbsp;child.getMeasuredWidth(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;int&nbsp;childHeight&nbsp;=&nbsp;child.getMeasuredHeight(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(x&nbsp;+&nbsp;childWidth&nbsp;>&nbsp;widthOffset)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;=&nbsp;getPaddingLeft(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;+=&nbsp;currentRow.height&nbsp;+&nbsp;verticalSpacing; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rowIterator.hasNext())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentRow&nbsp;=&nbsp;rowIterator.next(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;child.layout(x,&nbsp;y,&nbsp;x&nbsp;+&nbsp;childWidth,&nbsp;y&nbsp;+&nbsp;childHeight); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;+=&nbsp;childWidth&nbsp;+&nbsp;horizontalSpacing; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;List<View>&nbsp;getLayoutChildren()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List<View>&nbsp;children&nbsp;=&nbsp;new&nbsp;ArrayList<View>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;index&nbsp;=&nbsp;0;&nbsp;index&nbsp;<&nbsp;getChildCount();&nbsp;index++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;View&nbsp;child&nbsp;=&nbsp;getChildAt(index); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(child.getVisibility()&nbsp;!=&nbsp;View.GONE)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.add(child); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;children; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;int&nbsp;getVerticalPadding()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;getPaddingTop()&nbsp;+&nbsp;getPaddingBottom(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;int&nbsp;getHorizontalPadding()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;getPaddingLeft()&nbsp;+&nbsp;getPaddingRight(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;class&nbsp;RowMeasurement&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;int&nbsp;maxWidth; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;int&nbsp;widthMode; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;width; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;height; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;RowMeasurement(int&nbsp;maxWidth,&nbsp;int&nbsp;widthMode)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.maxWidth&nbsp;=&nbsp;maxWidth; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.widthMode&nbsp;=&nbsp;widthMode; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getHeight()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;height; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getWidth()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;width; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;wouldExceedMax(int&nbsp;childWidth)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;widthMode&nbsp;==&nbsp;MeasureSpec.UNSPECIFIED&nbsp;?&nbsp;false&nbsp;:&nbsp;getNewWidth(childWidth)&nbsp;>&nbsp;maxWidth; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;addChildDimensions(int&nbsp;childWidth,&nbsp;int&nbsp;childHeight)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width&nbsp;=&nbsp;getNewWidth(childWidth); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height&nbsp;=&nbsp;Math.max(height,&nbsp;childHeight); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;int&nbsp;getNewWidth(int&nbsp;childWidth)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;width&nbsp;==&nbsp;0&nbsp;?&nbsp;childWidth&nbsp;:&nbsp;width&nbsp;+&nbsp;horizontalSpacing&nbsp;+&nbsp;childWidth; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}这还需要在/res/values/attrs.xml下输入一个条目,如果它还没有,你可以创建它。<?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?><resources> &nbsp;&nbsp;&nbsp;&nbsp;<declare-styleable&nbsp;name="RowLayout"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<attr&nbsp;name="android:verticalSpacing"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<attr&nbsp;name="android:horizontalSpacing"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;</declare-styleable></resources>xml布局中的用法如下所示:<?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?><com.asolutions.widget.RowLayout&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;xmlns:android="http://schemas.android.com/apk/res/android" &nbsp;&nbsp;&nbsp;&nbsp;android:layout_width="wrap_content" &nbsp;&nbsp;&nbsp;&nbsp;android:layout_height="wrap_content" &nbsp;&nbsp;&nbsp;&nbsp;android:layout_gravity="center" &nbsp;&nbsp;&nbsp;&nbsp;android:padding="10dp" &nbsp;&nbsp;&nbsp;&nbsp;android:horizontalSpacing="10dp" &nbsp;&nbsp;&nbsp;&nbsp;android:verticalSpacing="20dp"> &nbsp;&nbsp;&nbsp;&nbsp;<FrameLayout&nbsp;android:layout_width="30px"&nbsp;android:layout_height="40px"&nbsp;android:background="#F00"/> &nbsp;&nbsp;&nbsp;&nbsp;<FrameLayout&nbsp;android:layout_width="60px"&nbsp;android:layout_height="40px"&nbsp;android:background="#F00"/> &nbsp;&nbsp;&nbsp;&nbsp;<FrameLayout&nbsp;android:layout_width="70px"&nbsp;android:layout_height="20px"&nbsp;android:background="#F00"/> &nbsp;&nbsp;&nbsp;&nbsp;<FrameLayout&nbsp;android:layout_width="20px"&nbsp;android:layout_height="60px"&nbsp;android:background="#F00"/> &nbsp;&nbsp;&nbsp;&nbsp;<FrameLayout&nbsp;android:layout_width="10px"&nbsp;android:layout_height="40px"&nbsp;android:background="#F00"/> &nbsp;&nbsp;&nbsp;&nbsp;<FrameLayout&nbsp;android:layout_width="40px"&nbsp;android:layout_height="40px"&nbsp;android:background="#F00"/> &nbsp;&nbsp;&nbsp;&nbsp;<FrameLayout&nbsp;android:layout_width="40px"&nbsp;android:layout_height="40px"&nbsp;android:background="#F00"/> &nbsp;&nbsp;&nbsp;&nbsp;<FrameLayout&nbsp;android:layout_width="40px"&nbsp;android:layout_height="40px"&nbsp;android:background="#F00"/></com.asolutions.widget.RowLayout>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android