这两天研究了下流式页面,记录一下。
public class CascadeActivity extends Activity {
private static final String TAG = "TestCascadeActivity";
private static Map<String, Drawable> drawableMap = new LinkedHashMap<String, Drawable>();
private LinearLayout llCcasecade;
private LinearLayout lvCasecade1;
private LinearLayout lvCasecade2;
private LinearLayout lvCasecade3;
private int mlineMin1=0;
private int mlineMin2=0;
private int mlineMin3=0;
private Display display;
private AssetManager assetManager;
private List<String> iamgePaths;
private static final String imgspath = "imgs";
private int casecadeWidth;
List<String> picPath;
int j;
// Handler handler ;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(cn.image.com.R.layout.main);
display = this.getWindowManager().getDefaultDisplay();
casecadeWidth = display.getWidth()/3;
assetManager = this.getAssets();
try {
picPath = Arrays.asList(assetManager.list("imgs"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Drawable dravable=MyDrawableManager.getInstance().fetchDrawableOnThread(picPath, assetManager, handler);
findView();
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
//imageCallback.imageLoaded((Drawable) message.obj, urlString);
if(message.what==1){
List<PictureInfo> picInfos= (List<PictureInfo>) message.obj;
for(int n=0;n<picInfos.size();n++){
ImageView iv = (ImageView)LayoutInflater.from(TestCascadeActivity.this).inflate(cn.image.com.R.layout.item, null);
j=minLine();
if(j==1){
lvCasecade1.addView(iv);
}else if(j==2){
lvCasecade2.addView(iv);
}else{
lvCasecade3.addView(iv);
}
Drawable drawable=picInfos.get(n).getDrawable();
if(iv!=null && drawable!=null){
int oldwidth = drawable.getIntrinsicWidth();
int oldheight = drawable.getIntrinsicHeight();
LayoutParams lp = iv.getLayoutParams();
lp.height = (oldheight * casecadeWidth)/oldwidth;
//修改line的高度
if(j==1){
mlineMin1+=lp.height;
}else if(j==2){
mlineMin2+=lp.height;
}else if(j==3){
mlineMin3+=lp.height;
}
iv.setPadding(0, 2, 0, 0);
iv.setLayoutParams(lp);
iv.setImageDrawable(drawable);
}
}
}
}
};
//初始化,页面各个图片链的宽度定义
private void findView(){
llCcasecade = (LinearLayout)this.findViewById(cn.image.com.R.id.llCcasecade);
lvCasecade1 = (LinearLayout)this.findViewById(cn.image.com.R.id.casecade1);
lvCasecade2 = (LinearLayout)this.findViewById(cn.image.com.R.id.casecade2);
lvCasecade3 = (LinearLayout)this.findViewById(cn.image.com.R.id.casecade3);
LayoutParams lp1 = lvCasecade1.getLayoutParams();
lp1.width = casecadeWidth;
lvCasecade1.setLayoutParams(lp1);
LayoutParams lp2 = lvCasecade2.getLayoutParams();
lp2.width = casecadeWidth;
lvCasecade2.setLayoutParams(lp2);
LayoutParams lp3 = lvCasecade3.getLayoutParams();
lp3.width = casecadeWidth;
lvCasecade3.setLayoutParams(lp3);
}
//算出当前那条显示的图片高度最少
public int minLine(){
int lineNum=0;
if((mlineMin1<=mlineMin2)&&(mlineMin1<=mlineMin3)){
lineNum=1;
Log.i("testcastdsaljf=====", mlineMin1+"----11");
}else if((mlineMin2<mlineMin1)&&(mlineMin2<=mlineMin3)){
lineNum=2;
Log.i("testcastdsaljf=====", mlineMin1+"----22");
}else if((mlineMin3<mlineMin1)&&(mlineMin3<mlineMin2)){
lineNum=3;
Log.i("testcastdsaljf=====", mlineMin1+"----33");
}
return lineNum;
}
}
//取图片 这次是在本地弄个文件夹下 (服务端不知道怎么写就省了)
public class MyDrawableManager {
private static MyDrawableManager instance;
private List<PictureInfo> listPic=new ArrayList<PictureInfo>();
private static final String imgspath = "imgs";
private MyDrawableManager() {
}
public static MyDrawableManager getInstance() {
if (instance == null) {
instance = new MyDrawableManager();
}
return instance;
}
public Drawable fetchDrawableOnThread(final List<String> picUrl,final AssetManager assetManager,
final Handler handler) {
Thread thread = new Thread() {
@Override
public void run() {
for(int i=0;i<picUrl.size();i++){
String urlString=imgspath+"/"+picUrl.get(i);
Drawable drawable = fetchDrawable(urlString,assetManager);
PictureInfo picInfo=new PictureInfo(urlString, drawable);
listPic.add(picInfo);
}
Message message = handler.obtainMessage(1, listPic);
handler.sendMessage(message);
}
};
thread.start();
return null;
}
private Drawable fetchDrawable(String urlString,AssetManager assetManager) {
Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
InputStream is = null;
try {
is = assetManager.open(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
} catch (Exception e) {
Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
} finally{//关闭流
try {
if(is!=null)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
//实体类用于封装获取到的图片数据
public class PictureInfo {
private int id;
private String picUrl;
private Drawable drawable;
public PictureInfo(String picUrl, Drawable drawable) {
super();
this.picUrl = picUrl;
this.drawable = drawable;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
public Drawable getDrawable() {
return drawable;
}
public void setDrawable(Drawable drawable) {
this.drawable = drawable;
}
}