最近闲来无聊,就写了一个 类似360手机助手里面的搜索下面的提示语的效果---流式布局,热门标签。先上效果吧!
是不是神似??其实实现的原理很简单啦。下面来讲讲原理吧
不规则字幕排版原理:
每一行可以用LinerLayout实现,那么根据当前行的宽度是否大于手机屏幕的宽度?如果大于,则重新开启一个新的LinerLayout 作为第二行,以此类推,就实现了上面的效果了。支持每个item的点击事件哦!!!
代码实现:
package com.xjp.searchtips.wideght;
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.xjp.searchtips.R;
import java.util.List;
/**
* Description:很多搜索界面弹出来的提示语
* User: xjp
* Date: 2015/4/15
* Time: 9:09
*/
public class SearchTipsGroupView extends LinearLayout {
private Context context;
public SearchTipsGroupView(Context context) {
super(context);
this.context = context;
setOrientation(VERTICAL);//设置方向
}
public SearchTipsGroupView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
setOrientation(VERTICAL);//设置方向
}
public SearchTipsGroupView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
setOrientation(VERTICAL);//设置方向
}
/**
* 外部接口调用
*
* @param items
* @param onItemClick
*/
public void initViews(String items[], final OnItemClick onItemClick) {
int length = 0;//一行加载item 的宽度
LinearLayout layout = null;
LayoutParams layoutLp = null;
boolean isNewLine = true;//是否换行
int screenWidth = getScreenWidth();//屏幕的宽度
int size = items.length;
for (int i = 0; i < size; i++) {//便利items
if (isNewLine) {//是否开启新的一行
layout = new LinearLayout(context);
layout.setOrientation(HORIZONTAL);
layoutLp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutLp.topMargin = 10;
}
View view = LayoutInflater.from(context).inflate(R.layout.item_textview, null);
TextView itemView = (TextView) view.findViewById(R.id.text);
itemView.setText(items[i]);
final int j = i;
itemView.setOnClickListener(new OnClickListener() {//给每个item设置点击事件
@Override
public void onClick(View v) {
if (null != onItemClick) {
onItemClick.onClick(j);
}
}
});
//设置item的参数
LayoutParams itemLp = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
itemLp.leftMargin = 10;
//得到当前行的长度
length += 10 + getViewWidth(itemView);
if (length > screenWidth) {//当前行的长度大于屏幕宽度则换行
length = 0;
addView(layout, layoutLp);
isNewLine = true;
i--;
} else {//否则添加到当前行
isNewLine = false;
layout.addView(view, itemLp);
}
}
addView(layout, layoutLp);
}
/**
* @param items
* @param onItemClick
*/
public void initViews(List<String> items, OnItemClick onItemClick) {
initViews((String[]) items.toArray(), onItemClick);
}
/**
* 得到手机屏幕的宽度
*
* @return
*/
private int getScreenWidth() {
DisplayMetrics dm = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm.widthPixels;
}
/**
* 得到view控件的宽度
*
* @param view
* @return
*/
private int getViewWidth(View view) {
int w = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
view.measure(w, h);
return view.getMeasuredWidth();
}
}
是不是很简单??以后直接用着一个类就实现了上面的效果,无需其他。可以自己仔细看代码实现原理,都有注解。如需要源代码,可点击这里下载: 源代码