木蚂蚁手机乐园首页

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5078|回复: 1

[UI开发] Line-breaking widget layout for Android

[复制链接]

该用户从未签到

118

主题

1

帖子

837

积分

木蚂蚁美化组

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
837

幸运之星

发表于 2011-3-4 18:05:48 | 显示全部楼层 |阅读模式
[url=]vote[/url]accepted

I made my own layout that does what I want, but it is quite limited at the moment. Comments and improvement suggestions are of course welcome.

The activity:

package se.fnord.xmms2.predicate;
import se.fnord.android.layout.PredicateLayout;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.TextView;
public
class
Predicate
extends
Activity
{
/** Called when the activity is first created. */
@Override
public
void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
PredicateLayout l =
new
PredicateLayout(this);
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,
new
PredicateLayout.LayoutParams(2,
0));
}

        setContentView(l);
}
}

Or in an XML layout:

<se.fnord.android.layout.PredicateLayout
    android:id="@+id/predicate_layout"
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"
/>

And the Layout:

package se.fnord.android.layout;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
/**
* ViewGroup that arranges child views in a similar way to text, with them laid
* out one line at a time and "wrapping" to the next line as needed.
*  
* Code licensed under CC-by-SA
*   
* @author Henrik Gustafsson
* @see http://stackoverflow.com/questio ... -layout-for-android
* @license http://creativecommons.org/licenses/by-sa/2.5/
*
*/

public
class
PredicateLayout
extends
ViewGroup
{
private
int line_height;
public
static
class
LayoutParams
extends
ViewGroup.LayoutParams
{
public
final
int horizontal_spacing;
public
final
int vertical_spacing;
/**
         * @param horizontal_spacing Pixels between items, horizontally
         * @param vertical_spacing Pixels between items, vertically
         */

public
LayoutParams(int horizontal_spacing,
int vertical_spacing)
{
super(0,
0);
this.horizontal_spacing = horizontal_spacing;
this.vertical_spacing = vertical_spacing;
}
}
public
PredicateLayout(Context context)
{
super(context);
}
public
PredicateLayout(Context context,
AttributeSet attrs){
super(context, attrs);
}
@Override
protected
void onMeasure(int widthMeasureSpec,
int heightMeasureSpec)
{
        assert(MeasureSpec.getMode(widthMeasureSpec)
!=
MeasureSpec.UNSPECIFIED);
final
int width =
MeasureSpec.getSize(widthMeasureSpec)
- getPaddingLeft()
- getPaddingRight();
int height =
MeasureSpec.getSize(heightMeasureSpec)
- getPaddingTop()
- getPaddingBottom();
final
int count = getChildCount();
int line_height =
0;
int xpos = getPaddingLeft();
int ypos = getPaddingTop();
for
(int i =
0; i < count; i++)
{
final
View child = getChildAt(i);
if
(child.getVisibility()
!= GONE)
{
final
LayoutParams lp =
(LayoutParams) child.getLayoutParams();
                child.measure(
MeasureSpec.makeMeasureSpec(width,
MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(height,
MeasureSpec.AT_MOST));
final
int childw = child.getMeasuredWidth();
                line_height =
Math.max(line_height, child.getMeasuredHeight()
+ lp.vertical_spacing);
if
(xpos + childw > width)
{
                    xpos = getPaddingLeft();
                    ypos += line_height;
}

                xpos += childw + lp.horizontal_spacing;
}
}
this.line_height = line_height;
if
(MeasureSpec.getMode(heightMeasureSpec)
==
MeasureSpec.UNSPECIFIED){
            height = ypos + line_height;
}
else
if
(MeasureSpec.getMode(heightMeasureSpec)
==
MeasureSpec.AT_MOST){
if
(ypos + line_height < height){
                height = ypos + line_height;
}
}
        setMeasuredDimension(width, height);
}
@Override
protected
ViewGroup.LayoutParams generateDefaultLayoutParams()
{
return
new
LayoutParams(1,
1);
// default of 1px spacing
}
@Override
protected
boolean checkLayoutParams(ViewGroup.LayoutParams p)
{
if
(p instanceof
LayoutParams)
return
true;
return
false;
}
@Override
protected
void onLayout(boolean changed,
int l,
int t,
int r,
int b)
{
final
int count = getChildCount();
final
int width = r - l;
int xpos = getPaddingLeft();
int ypos = getPaddingTop();
for
(int i =
0; i < count; i++)
{
final
View child = getChildAt(i);
if
(child.getVisibility()
!= GONE)
{
final
int childw = child.getMeasuredWidth();
final
int childh = child.getMeasuredHeight();
final
LayoutParams lp =
(LayoutParams) child.getLayoutParams();
if
(xpos + childw > width)
{
                    xpos = getPaddingLeft();
                    ypos += line_height;
}
                child.layout(xpos, ypos, xpos + childw, ypos + childh);
                xpos += childw + lp.horizontal_spacing;
}
}
}
}

With the result:

http://blog.163.com/dangzhengtao@yeah/blog/static/7780087420110126483584/


在人群中生活,有必要保持一定的狼性!
QQ:386367781(仅限技术交流)
Email:dangzhengtao@gmail.com

该用户从未签到

118

主题

1

帖子

837

积分

木蚂蚁美化组

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
837

幸运之星

 楼主| 发表于 2011-3-5 10:17:12 | 显示全部楼层
自己沙发
在人群中生活,有必要保持一定的狼性!
QQ:386367781(仅限技术交流)
Email:dangzhengtao@gmail.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

推荐版块: PC破解软件下载  |   VR视频资源下载  |   三星Galaxy S8/S8+  |   恋舞OL  |   安卓破解软件  |   安卓破解游戏     安卓汉化下载  
安卓android软件大全  |   安卓大型游戏  |   小米手机论坛  |   三星Galaxy Note8论坛  |   影视资源下载  |   安卓破解    
安卓市场   安卓软件   小说电子书大全   在线影音播放   PC破解游戏下载   安卓软件教程   安卓游戏攻略   手机游戏   手机健康软件   手机订餐软件   手机购物软件   热门TAG
快速回复 返回顶部 返回列表