`
dou_shini8820
  • 浏览: 80487 次
社区版块
存档分类
最新评论

android瀑布流简单实现原理

 
阅读更多

网上关于android瀑布流的例子一大堆,但是很多都是很复杂,对于新手来说有一定的难度。

原理很简单,就是异步下载图片,把图片addView到ScrollView(因为可以上下一直拖动)中,你需要屏幕显示几列就在ScrollView中放置几个LinearLayout,

下面我就一个简单的例子来讲解android瀑布流的用法,样子很丑就不上图了。。

 

1、在xml布局文件:很简单就是

 

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/scrollview">
    <LinearLayout 
        android:orientation="horizontal"
         android:layout_width="fill_parent"
   		 android:layout_height="wrap_content">
       <LinearLayout 
         android:id="@+id/left"
         android:orientation="vertical"
         android:layout_width="fill_parent"
   		 android:layout_height="wrap_content"
        >
   		</LinearLayout>
	    <LinearLayout 
	        android:id="@+id/right"
	        android:orientation="vertical"
	        android:layout_width="fill_parent"
	   		android:layout_height="wrap_content">
	    </LinearLayout>
    </LinearLayout>
</ScrollView>

 

 

2、在java代码中:

 

先声明几个变量,其中imagePathStr数组用来存图片的链接

 

private LinearLayout leftLayout;
	private LinearLayout rightLayout;
	private String[] imagePathStr = { "http://www.cf69.com/Upfiles/BeyondPic/2010-08/20108175740983313.jpg",
             "http://www.syfff.com/UploadFile/pic/2008122163204.jpg", "http://pic.newssc.org/0/10/34/32/10343297_564251.jpg",
             "http://ent.hangzhou.com.cn/images/20090311/zym2009031323.jpg", "http://a4.att.hudong.com/86/60/01300000013093119087608457965.jpg",
             "http://file.sdteacher.gov.cn/upload/gz0901/images/0907/22/110437191.jpg",
             "http://www.fun9.cn/uploadfile/starpic/uploadpics/200910/20091008090155126.jpg",
             "http://img3.yxlady.com/yl/UploadFiles_5361/20110820/20110820120609469.jpg",
             "http://news.sznews.com/content/images/site3/20070827/001558d90baa083c6da20d.jpg", "http://henan.sinaimg.cn/cr/2010/0824/2297073692.jpg",
             "http://www.cf69.com/Upfiles/BeyondPic/2010-08/20108175740983313.jpg", "http://www.syfff.com/UploadFile/pic/2008122163204.jpg",
             "http://pic.newssc.org/0/10/34/32/10343297_564251.jpg", "http://ent.hangzhou.com.cn/images/20090311/zym2009031323.jpg",
             "http://a4.att.hudong.com/86/60/01300000013093119087608457965.jpg", "http://file.sdteacher.gov.cn/upload/gz0901/images/0907/22/110437191.jpg",
             "http://www.fun9.cn/uploadfile/starpic/uploadpics/200910/20091008090155126.jpg",
             "http://img3.yxlady.com/yl/UploadFiles_5361/20110820/20110820120609469.jpg",
             "http://news.sznews.com/content/images/site3/20070827/001558d90baa083c6da20d.jpg", "http://henan.sinaimg.cn/cr/2010/0824/2297073692.jpg" };
	

 

 

其次,在oncreate()中采用异步加载图片的方法把获取到的Drawable添加到左右两栏的LinearLayout中:

 

 

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		leftLayout=(LinearLayout) findViewById(R.id.left);
		rightLayout=(LinearLayout) findViewById(R.id.right);
		int j=0;
		for (int i = 0; i < imagePathStr.length; i++) {
			addToAsynLoadImage(imagePathStr[i],j,i);
			j++;
			if(j<=2){
				j=0;
			}
		}
		
	}

 

 

addToAsynLoadImage() 方法如下,每次加载一个图片就创建一个ImageView,然后把ImageView加到LinearLayout中:

 

 

private void addToAsynLoadImage(String imageUrl, int j, int i) {
		ImageView imageView=new ImageView(this);
		imageView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
		imageView.setTag(i);
		new ImageDownloadAsynTask(MainActivity.this,imageUrl,imageView).execute(null);
		if(j==0){
			leftLayout.addView(imageView);
		}else if(j==1){
			rightLayout.addView(imageView);
		}
	}

 

 

ImageDownloadAsynTask()方法继承自AsyncTask<Params, Progress, Result>,

这个类有三个参数,4个步骤(begin,doinbackground,processProgress,end)

最后一个参数是在doinbackground()中返回的结果,另外还有onPreExecute()、onPostExecute()

 

public class ImageDownloadAsynTask extends AsyncTask<Void, Void, Drawable>{

	private Context context;
	private String imageUrl;
	private ImageView imageView;
	private String sdPath="/sdcard/netImages";
	ProgressDialog progressDialog;
	
	public ImageDownloadAsynTask(Context context, String imageUrl,ImageView imageView) {
		this.context=context;
		this.imageUrl=imageUrl;
		this.imageView=imageView;
	}

	/* 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI
	 * 不需要传入什么参数,返回一个Drawable
	 */
	@Override
	protected Drawable doInBackground(Void... params) {
		String filename=sdPath+imageUrl.substring(imageUrl.lastIndexOf("/"));
		File file=new File(filename);
		if(file.exists()==true){
			Bitmap bitmap=BitmapFactory.decodeFile(filename);
			BitmapDrawable bitmapDrawable=new BitmapDrawable(bitmap);
			return bitmapDrawable;
		}else{
			try {
				URL url=new URL(imageUrl);
				URLConnection connection=url.openConnection();
				connection.setDoInput(true);// 使用 URL 连接进行输入
				connection.connect();
				InputStream is = connection.getInputStream();
				Bitmap b=BitmapFactory.decodeStream(is);
				BitmapDrawable bd=new BitmapDrawable(b);
				saveFile(bd,filename);
//				connection.getContent();
				return bd;
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}

	
	/**通过outPutStream、bitmap.compress(),flush()把图片保存到指定路径
	 * @param bd
	 * @param filename
	 */
	private void saveFile(BitmapDrawable bd, String filename) {
		File file = new File(sdPath);
		if(!file.exists()){
			file.mkdir();
		}
		File f=new File(filename);
		try {
			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f));
			Bitmap b=bd.getBitmap();
			b.compress(Bitmap.CompressFormat.JPEG, 80, bos);
			bos.flush();
			bos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	protected void onPreExecute() {
		super.onPreExecute();
		progressDialog.show(context, "","正在下载图片。。。");
	}
	
	
	/**
	 * 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。
	 * 此方法在主线程执行,任务执行的结果作为此方法的参数返回
	 */
	@Override
	protected void onPostExecute(Drawable result) {
		super.onPostExecute(result);
		if(result!=null){//如果doInBackground()获取的结果不为空
			imageView.setBackgroundDrawable(result);//那么就在这一步更新UI
		}
		progressDialog.dismiss();
	}


}

 

 

 

7
0
分享到:
评论
2 楼 zhanwc 2015-04-15  
求一份源码: zhanweichun@126.com
1 楼 zhanwc 2015-04-15  
求一份源码~

相关推荐

    android 瀑布流Demo

    下面我们将深入探讨瀑布流布局的实现原理、核心组件以及如何在Android中创建一个瀑布流Demo。 一、瀑布流布局原理 瀑布流布局的核心思想是通过计算每个元素的宽度和高度,动态调整元素的位置,使其在屏幕中形成多...

    安卓瀑布流相关-Android瀑布流照片墙实现体验不规则排列的美感.rar

    - PhotoWallFallsDemo:这是一个Android瀑布流照片墙的实现示例,包含了瀑布流布局的基本功能,如图片加载、滚动监听和动态添加数据等。通过阅读和学习此示例代码,可以深入理解瀑布流布局的实现过程。 综上所述,...

    安卓瀑布流相关-瀑布流Android实现zip包.zip

    在这个"安卓瀑布流相关-瀑布流Android实现zip包.zip"中,包含了实现Android瀑布流布局的相关资源。 首先,我们来看`JavaApk源码说明.txt`,这个文件可能包含了对整个源码包的简单介绍或使用指南。通常,这种文本...

    网络图片RecyclerView瀑布流的实现

    综上所述,实现网络图片RecyclerView瀑布流需要掌握RecyclerView的使用,自定义适配器,选择或实现适合的LayoutManager,理解图片异步加载原理,以及熟练处理数据加载和UI刷新。这个过程可能会涉及到许多细节,需要...

    Android应用源码之 瀑布流 Demo.zip

    这个"Android应用源码之瀑布流 Demo.zip"提供的源码应该是一个简单的Android项目,用于演示如何实现瀑布流效果。下面我们将深入探讨瀑布流布局的基本原理、实现方式以及可能涉及的关键技术点。 1. **瀑布流布局概念...

    recyclerview之瀑布流左右间距均等设置简单实例

    要实现瀑布流布局,我们需要引入`androidx.recyclerview.widget.StaggeredGridLayoutManager`库。首先,在build.gradle文件中添加依赖: ```groovy dependencies { implementation 'androidx.recyclerview:...

    Android瀑布流实现,类似于蘑菇街和迷尚 应用里的排列.rar

    总的来说,实现Android瀑布流布局需要掌握Android布局原理,熟悉`RecyclerView`和布局管理器的使用,同时了解如何结合网络请求实现无限滚动加载。通过实践和学习,开发者可以创建出具有优秀用户体验的瀑布流界面。

    安卓Android源码——安卓Android瀑布流照片墙实现,体验不规则排列的美感.zip

    综上所述,实现一个美观且高效的Android瀑布流照片墙,需要掌握自定义布局或RecyclerView的用法,以及数据加载、图片处理、屏幕适配等多方面的技术。通过不断优化和调试,可以为用户提供流畅且具有吸引力的照片浏览...

    android瀑布流效果

    在Android中实现瀑布流效果通常有以下几种方法: 1. **GridView + 自定义Adapter**:虽然GridView默认是等宽等高的网格布局,但通过自定义Adapter和测量每个子View的大小,可以实现不规则的瀑布流布局。这种方法...

    Android瀑布流打包(4个实例)下载

    本资源提供的是Android瀑布流的源码打包下载,包含了4个不同的实例,每个实例都采用了不同的实现方式,可以帮助开发者深入理解瀑布流布局的实现原理和技巧。 首先,我们来详细解析一下瀑布流布局的常见实现方式: ...

    android图片瀑布流

    1. GridView:虽然GridView能实现简单的瀑布流效果,但由于其固定的列宽和行高,对于复杂的布局和动态高度的适应性较差,因此在现代Android开发中,更多的是使用RecyclerView。 2. RecyclerView:RecyclerView是...

    android瀑布流 网络URL异步下载

    Android中可以使用GridView、RecyclerView或者自定义ViewGroup来实现瀑布流布局。其中,RecyclerView因其灵活性和高效的复用机制,成为首选。 在实现网络URL异步下载时,我们通常会使用到Android的AsyncTask或者...

    android瀑布流

    对于标签提到的“源码”和“工具”,了解瀑布流布局的实现原理和源码分析可以帮助我们更好地定制和优化布局。同时,利用各种Android开发者工具,如Android Studio的布局预览、性能分析工具,可以帮助我们在开发过程...

    安卓利用RecyclerView超简单实现瀑布流,listView,GridView等功能

    本教程将详细介绍如何利用RecyclerView在Android中实现瀑布流、ListView和GridView的效果。 1. RecyclerView基础 RecyclerView是Android Lollipop(API 21)引入的一个视图回收器,它优化了ListView的性能,通过...

    安卓 RecyclerView瀑布流效果实现

    总的来说,Android中的RecyclerView瀑布流效果实现需要理解布局管理器的工作原理,熟练掌握适配器机制,并能灵活处理高度动态变化的item。通过实践和调试,你将能够创建出流畅且美观的瀑布流界面。

    RecyclerView 瀑布流、ListView、GridView实例源码

    本文将深入探讨这三个组件,并通过一个Demo_recyclerview的实例源码来解析它们的工作原理和实现瀑布流布局。 首先,RecyclerView是Android 5.0引入的一个强大的列表视图,替代了旧有的ListView。RecyclerView的优势...

    比较酷的下拉刷新和瀑布流开源项目

    WaterFallListView是针对Android开发的一个实现瀑布流布局的开源库,它支持动态加载更多数据,可以自动调整列宽以适应不同屏幕尺寸,同时提供了良好的性能优化,如使用RecycleView来减少内存消耗。 3. **...

    瀑布流flowlayout

    在Android开发中,实现瀑布流布局通常有两种主要方法:一是使用自定义的布局管理器,二是借助第三方库。标题中的“flowlayout”可能指的是自定义的一种布局管理器,或者是某个第三方库的名字。这种布局管理器应该...

    waterfall瀑布流.zip项目安卓应用源码下载

    【Android瀑布流项目源码详解】 瀑布流布局(Waterfall Flow Layout)是一种常见的移动应用界面设计,常用于图片展示、商品列表等场景,其特点在于每个元素的大小可能不一致,但仍然能保持布局的整齐有序,就像瀑布...

Global site tag (gtag.js) - Google Analytics