瀑布流算法

一、效果图如下



二、情况分析

由于是多列ListView,所以参考使用了MultiColumnListView来进行,但是显示的是左右并排对齐的效果,要想实现左右不对齐的效果,有两种情况:

1.图片等比例压缩,图片下面有关于图片的文字性描述,这样由于文字的长度不同,自然而然的有了瀑布流的效果

2.图片等比例压缩,图片下面显示的控件大小也是相同的,犹如上面的情况


三、实现第二种情况的算法

经过本人的多次测试,现有以下几种参考方案:

方案1:

LinearLayout.LayoutParams params;
		if (position == 0) {
			params = new LinearLayout.LayoutParams(parentWidth, (int) (1.3 * parentWidth));
		} else {
			params = new LinearLayout.LayoutParams(parentWidth, (int) (1.1 * parentWidth));
		}
		holder.image.setLayoutParams(params);
ImageLoader.getInstance().displayImage(bean.getImage(), holder.image, Options.getListOptions(), new ImageLoadingListener() {

			@Override
			public void onLoadingStarted(String imageUri, View view) {

			}

			@Override
			public void onLoadingFailed(String imageUri, View view, FailReason failReason) {

			}

			@Override
			public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {

				ImageView imageView = (ImageView) view;
				imageView.setImageBitmap(loadedImage);//显示图片
			}

			@Override
			public void onLoadingCancelled(String imageUri, View view) {

			}
		});

缺陷:偶见图片被拉伸的情况,适用于资源图片是正方形的情况

方案2:

	ImageLoader.getInstance().displayImage(bean.getImage(), holder.image, Options.getListOptions(), new ImageLoadingListener() {

			@Override
			public void onLoadingStarted(String imageUri, View view) {

			}

			@Override
			public void onLoadingFailed(String imageUri, View view, FailReason failReason) {

			}

			@Override
			public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {

				ImageView imageView = (ImageView) view;
				int width = loadedImage.getWidth();
				int height = loadedImage.getHeight();
				float ratio = width / parentWidth;
				int scaleHeight = (int) (height / ratio);
				LinearLayout.LayoutParams params;
				if(position /2 == 0){
					params = new LinearLayout.LayoutParams(parentWidth, (int) (1.1 * scaleHeight));
				}else{
					params = new LinearLayout.LayoutParams(parentWidth, (int) (1 * scaleHeight));
				}
				
				imageView.setLayoutParams(params);

				imageView.setImageBitmap(loadedImage);//显示图片
			}

			@Override
			public void onLoadingCancelled(String imageUri, View view) {

			}
		});
缺陷:由于回收重用的问题,图片的位置会变化

方案3:

ImageLoader.getInstance().displayImage(bean.getImage(), holder.image, Options.getListOptions(), new ImageLoadingListener() {

			@Override
			public void onLoadingStarted(String imageUri, View view) {

			}

			@Override
			public void onLoadingFailed(String imageUri, View view, FailReason failReason) {

			}

			@Override
			public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {

				ImageView imageView = (ImageView) view;
				int width = loadedImage.getWidth();
				int height = loadedImage.getHeight();
				float ratio = width / parentWidth;
				int scaleHeight = (int) (height / ratio);
				LinearLayout.LayoutParams params;

				if (position == 0) {
					params = new LinearLayout.LayoutParams(parentWidth, (int) (1.1 * parentWidth));
				} else {
					params = new LinearLayout.LayoutParams(parentWidth, (int) (1 * scaleHeight));
				}
				imageView.setLayoutParams(params);

				imageView.setImageBitmap(loadedImage);//显示图片
			}

			@Override
			public void onLoadingCancelled(String imageUri, View view) {

			}
		});

比较完美

方案4:

ImageLoader.getInstance().displayImage(bean.getImage(), holder.image, Options.getListOptions(), new ImageLoadingListener() {

			@Override
			public void onLoadingStarted(String imageUri, View view) {

			}

			@Override
			public void onLoadingFailed(String imageUri, View view, FailReason failReason) {

			}

			@Override
			public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {

				ImageView imageView = (ImageView) view;
				int width = loadedImage.getWidth();
				int height = loadedImage.getHeight();
				float ratio = width / parentWidth;
				int scaleHeight = (int) (height / ratio);
				LinearLayout.LayoutParams params;

				params = new LinearLayout.LayoutParams(parentWidth, (int) (1 * scaleHeight));
				if (position == 0) {
					params.topMargin = 20;
			}
				imageView.setLayoutParams(params);

				imageView.setImageBitmap(loadedImage);//显示图片
			}

			@Override
			public void onLoadingCancelled(String imageUri, View view) {

			}
		});

比较完美

综上所述,可选方案1、3、4,目前项目中使用的是方案4。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值