网格图片异步加载

olivee 4年前 ⋅ 1266 阅读

app\src\main\res\layout\activity_main2.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scroll"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    tools:context=".Main2Activity">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <android.support.v7.widget.GridLayout
            android:id="@+id/grid"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:columnCount="3"
            >
        </android.support.v7.widget.GridLayout>

    </LinearLayout>

</ScrollView>

Main2Activity.java

package com.example.xxxx;

import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.support.v7.widget.GridLayout;
import android.widget.ImageView;

import java.util.List;

public class Main2Activity extends AppCompatActivity {


    ImageView imageLast;
    int imgMargin = 2;
    static int imageHeight = 0;
    static Bitmap[] imageBitmap;
    static ImageView[] imageViews;

    @Override
    public void onBackPressed() {

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        List<String> imgs =  ImagePool.getImagesList();
        imageBitmap = new Bitmap[imgs.size()];
        imageViews = new ImageView[imgs.size()];

        imageHeight = getResources().getDisplayMetrics().widthPixels / 3;

        new LoadImageTask().execute();

        LoadMore();

    }

    public void LoadMore(){

        List<String> imgs =  ImagePool.getImagesList();

        GridLayout grid = findViewById(R.id.grid);
        ImageView imageView = null;
        for (int i = 0; i < imgs.size(); i++) {
            imageView = new ImageView(this);
            imageView.setBackgroundResource(R.color.colorBlack);
            imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
            //指定平分的布局样式
            GridLayout.LayoutParams layoutParams = new GridLayout.LayoutParams(
                    GridLayout.spec(GridLayout.UNDEFINED, 1f),
                    GridLayout.spec(GridLayout.UNDEFINED, 1f));
            layoutParams.height = imageHeight;
            layoutParams.width = 0;
            //设置一些Margin
            layoutParams.setMargins(imgMargin, imgMargin, imgMargin, imgMargin);
            //将布局样式应用到ImageView
            imageView.setLayoutParams(layoutParams);

            grid.addView(imageView);
            imageViews[i] = imageView;
            imageView.setTag(i);

            imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int idx = (int) v.getTag();
                    ImagePool.setIndex(idx);
                    Jump(v);
                }
            });
        }

        if (imageView!=null) {
            imageLast = imageView;
        }

    }



    public void Jump(View view){
        Intent intent = new Intent();
        intent.setClass(Main2Activity.this, Main3Activity.class);
        startActivity(intent);
    }


    static class  LoadImageTask extends AsyncTask<Integer, Integer, String> {

        @Override
        protected String doInBackground(Integer... integers) {
            List<String> images =  ImagePool.getImagesList();
            int start = 0;
            for( int i=0;i<images.size();i++ ) {
                imageBitmap[i] = ImageUtil.getExtractBitmap(images.get(i).replaceFirst("file://",""), imageHeight, imageHeight);
                if (i%21==0 || i== images.size() - 1) {
                    this.publishProgress(start, i);
                    start = i+1;
                }
            }
            return "执行完成";
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
            //这个函数在doInBackground调用publishProgress时触发,虽然调用时只有一个参数
            //但是这里取到的是一个数组,所以要用progesss[0]来取值
            //第n个参数就用progress[n]来取值
            for(int i=progress[0];i<=progress[1];i++) {
                imageViews[i].setImageBitmap(imageBitmap[i]);
            }
            super.onProgressUpdate(progress);
        }


        @Override
        protected void onPostExecute(String result) {
            //doInBackground返回时触发,换句话说,就是doInBackground执行完后触发
            //这里的result就是上面doInBackground执行后的返回值,所以这里是"执行完毕"
            super.onPostExecute(result);
        }
    }
}

ImagePool.java

package com.example.administrator.tunpage;

import android.os.Environment;
import android.text.TextUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class ImagePool {

    public static List<String> imageList;

    private static int index = 1;

    public static void setIndex(int idx){
        index = idx;
    }

    public static int getIndex(){
        return index;
    }


    public static List<String>  getImagesList(){
        if( imageList!=null && imageList.size()>0 ) {
            return imageList;
        }
        imageList = new ArrayList<>();
        File file = null;

        // Check for SD Card
        if (!Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED))
        {
            // error
        }
        else
        {
            file = new File(Environment.getExternalStorageDirectory()
                    .getPath() + "/images" );
        }

        addFolderToURLList( file , imageList);
        return imageList;
    }


    private static void addFolderToURLList(File file, List<String> imageList) {
        if (file.isDirectory())
        {
            File[] listFile = file.listFiles();
            String filePath = null;
            String newPath = null;
            for (int i = 0; i < listFile.length; i++)
            {
                File filei = listFile[i];
                if ( filei.isDirectory() ) {
                    addFolderToURLList(filei,imageList);
                } else {
                    filePath = listFile[i].getAbsolutePath();
                    
                    if(filePath.endsWith(".jpg") ) {
                        imageList.add("file://" + filePath);
                    }
                }
            }
        }
    }

}

ImageUtil.java

package com.example.administrator.tunpage;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.media.ThumbnailUtils;

import java.io.InputStream;

public class ImageUtil {
    public static Bitmap getExtractBitmap(String path,
                                    int width, int height) {

        // 获取这个图片的宽和高信息到options中, 此时返回bm为空
        Bitmap bitmap = BitmapFactory.decodeFile(path);
        //利用Bitmap对象创建缩略图
        bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height);
        return bitmap;
    }

}