读书人

Android初级教程_图片混排成效和ViewP

发布时间: 2012-08-27 21:21:57 作者: rapoo

Android初级教程_图片混排效果和ViewPager的使用

前段时间公司需要实现图片混排的效果,类似"美丽说"那样,宽度一样,高度不一.总共有3列.每次加载更多的时候都是往最低的那列添加图片,这样就不会出现有的列非常多的图片,而有的列图片很少.首先申明的是这个例子是根据别人的程序基础上改的:https://github.com/dodola/android_waterfall再次感谢.!

效果如下图所示:


Android初级教程_图片混排成效和ViewPager的使用


当滑倒底部的时候如果还有图片则自动加载下一页.

代码实现如下:

首先自定义布局:

Android初级教程_图片混排成效和ViewPager的使用Android初级教程_图片混排成效和ViewPager的使用


实现如下:

private ViewPager viewPager;private List<ImageView> imageViews = new ArrayList<ImageView>();private List<Photo> photos;private Map<Integer,SoftReference<Bitmap>> cache = new HashMap<Integer,SoftReference<Bitmap>>();private ProgressBar pb;private MyAsyncTask myAsyncTask;int screenWidth ;int screenHeight; Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {switch (msg.what) {case 1:if(photos!=null&&photos.size()>0){for (int i = 0; i < photos.size(); i++) {ImageView imageView = new ImageView(GirlDetailActivity.this);imageViews.add(imageView);}viewPager.setAdapter(new AwesomePagerAdapter());myAsyncTask = new MyAsyncTask(0);myAsyncTask.execute(photos.get(0).getImage());}break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.girls_detail);Display display = getWindowManager().getDefaultDisplay();display = getWindowManager().getDefaultDisplay();screenWidth = display.getWidth();screenHeight = display.getHeight();init();Intent intent = getIntent();String id = intent.getStringExtra("id");StringBuffer url = new StringBuffer(url);url.append("?id=").append(id).append("&type=2");new Thread(new LoadImagePath(url.toString())).start();}public void init(){pb = (ProgressBar) findViewById(R.id.widget);viewPager = (ViewPager) findViewById(R.id.awesomepager);viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageSelected(final int position) {String image_path = photos.get(position).getImage();pb.setVisibility(View.GONE);if(cache.containsKey(position)){Bitmap bitmap = cache.get(position).get();if(bitmap!=null){imageViews.get(position).setImageBitmap(bitmap);}else {if(!myAsyncTask.isCancelled()){System.out.println("任务被取消");myAsyncTask.cancel(true);}myAsyncTask = new MyAsyncTask(position);myAsyncTask.execute(image_path);}}else {if(!myAsyncTask.isCancelled()){System.out.println("任务被取消");myAsyncTask.cancel(true);}myAsyncTask = new MyAsyncTask(position);myAsyncTask.execute(image_path);}}@Overridepublic void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}});}public class AwesomePagerAdapter extends PagerAdapter {@Overridepublic int getCount() {return imageViews.size();}@Overridepublic Object instantiateItem(View collection, int position) {ImageView imageView = imageViews.get(position);((ViewPager) collection).addView(imageView, 0);return imageViews.get(position);}@Overridepublic void destroyItem(View collection, int position, Object view) {((ViewPager) collection).removeView(imageViews.get(position));}@Overridepublic boolean isViewFromObject(View view, Object object) {// System.out.println("isViewFromObject");return view == (object);}@Overridepublic void finishUpdate(View arg0) {// System.out.println("finishUpdate");}@Overridepublic void restoreState(Parcelable arg0, ClassLoader arg1) {// System.out.println("restoreState");}@Overridepublic Parcelable saveState() {// System.out.println("saveState");return null;}@Overridepublic void startUpdate(View arg0) {}}@Overridepublic void onStop() {super.onStop();}@Overrideprotected void onDestroy() {super.onDestroy();}private final class LoadImagePath implements Runnable{private String url;public LoadImagePath(String url){this.url = url;}@Overridepublic void run() {try {InputStream in = JsonParse.getIputStream(url);PhotoDetailJson photoDetailJson = (PhotoDetailJson) GsonJsonParser.parseStreamToObject(in, PhotoDetailJson.class);PhotoDetail detail = photoDetailJson.getData();photos = detail.getPhoto();handler.sendEmptyMessage(1);} catch (IOException e) {e.printStackTrace();}}}public final class MyAsyncTask extends AsyncTask<String, Void, Bitmap>{private int position;public MyAsyncTask(int position){this.position = position;}@Overrideprotected Bitmap doInBackground(String... params) {String path = params[0];try {InputStream in = JsonParse.getIputStream(path);//如果屏幕超过800*480if(screenWidth>480&&screenHeight>800){//960x540screenWidth = 480;screenHeight = 800;} Bitmap bitmap = ImageUtil.getSizedBitmap(screenWidth, screenHeight, in); cache.put(position, new SoftReference<Bitmap>(bitmap)); return bitmap;} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return null;}@Overrideprotected void onPostExecute(Bitmap result) {super.onPostExecute(result);imageViews.get(position).setImageBitmap(result);pb.setVisibility(View.GONE);}@Overrideprotected void onPreExecute() {super.onPreExecute();pb.setVisibility(View.VISIBLE);imageViews.get(position).setImageResource(R.drawable.wait_girl_detail);}}

完毕!

欢迎转载,转载请注明出处:http://blog.csdn.net/johnny901114/article/details/7835139


谢谢大家.希望对你有帮助.有事请留言....





读书人网 >Android

热点推荐