• Java-android使用GridView布局的电子相册&服务器获取图片


    转  http://www.tuicool.com/articles/B7JNv2

    电子相册的思路:

    1.先是考虑布局,我用的是GridView布局

    2.GridView中又该怎么显示图片,其实我的这个应用每个图片都是同一个布局,首先要实现适配器接口,再利用充气泵LayoutInflater把布局文件转换成View视图对象

    3.怎么从服务器获取图片,又是怎么捉去到的

    有思路不等于你会了,直接给你上代码吧:

    首先介绍下我的应用的功能:

    1.显示的每一张图片,点击后都可以显示出单独的一张,并且是全屏

    2.如果点击其中的任意一张图片长时间,会弹出窗口,显示这张图片的基本的信息

    不足:

    1.现在存在获取资源过多,内存溢出的bug,后期我会处理,可以选择把图片保存到本地,不全部从服务器获取

    2.功能不够强大,我还会用另一个布局,把电子相册的效果呈现处理

    MainActivity.java源码: 

    package com.example.photo;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.AdapterView.OnItemLongClickListener;
    import android.widget.BaseAdapter;
    import android.widget.GridView;
    import android.widget.ImageView;
    import android.widget.ProgressBar;
    import android.widget.TextView;
    
    /**
     * 2013-6-15 下午12:54:56
     * 
     * @author 乔晓松
     */
    public class MainActivity extends Activity {
    
      protected static final int TEXT = 0;
      protected static final int ACTIVITY = 1;
      public GridView gridView;
      public int id;
      public Handler handler;
      public static Object[] path; // = { "span.jpg", "span1.jpg", "span2.jpg",
                      // "span3.jpeg", "psb.jpeg", "psbpan.jpeg"
                      // };
      public String basePath = "http://172.22.64.6:8080/lession08_image/images/";
      public List<Map<String, Object>> datas;
      public LayoutInflater inflater;
      public Map<String, Integer> fileMap;
      public ProgressBar progressBar;
    
      @SuppressLint({ "HandlerLeak", "CutPasteId" })
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gridView = (GridView) findViewById(R.id.gridView1);
        progressBar = (ProgressBar) findViewById(R.id.progressBar1);
        progressBar.setVisibility(View.VISIBLE);
        inflater = (LayoutInflater) this
            .getSystemService(LAYOUT_INFLATER_SERVICE);
        datas = new ArrayList<Map<String, Object>>();
        fileMap = new HashMap<String, Integer>();
    
        handler = new Handler() {
          @Override
          public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
            case TEXT:
              progressBar.setVisibility(View.GONE);
              gridView.setAdapter(new MyListAdapter());
              break;
            default:
              break;
            }
          }
        };
        new Thread(new Runnable() {
    
          @Override
          public void run() {
            List<String> list = HttpClientTool
                .httpClientJSON("http://172.22.64.6:8080/lession08_image/csdn/ImagesAction_httpAllImages.action");
            if (list != null) {
              path = list.toArray();
            }
            for (int i = 0; i < path.length; i++) {
              Map<String, Object> map = new HashMap<String, Object>();
              Map<String, Object> bitmap = HttpClientTool.send(
                  MainActivity.this, basePath + path[i]);
              if (map != null) {
                map.put("img", (Bitmap) (bitmap.get("img")));
                map.put("name", path[i]);
                datas.add(map);
              }
              fileMap.put(path[i].toString(),
                  (Integer) (bitmap.get("length")));
            }
            handler.sendEmptyMessage(TEXT);
          }
        }).start();
    
        gridView.setOnItemClickListener(new OnItemClickListener() {
    
          @Override
          public void onItemClick(AdapterView<?> parent, View view,
              int position, long id) {
            Integer length = fileMap.get(path[position]);
            Intent intent = new Intent(MainActivity.this,
                ImageActivity.class);
            intent.putExtra("id", position);
            intent.putExtra("basepath", basePath);
            intent.putExtra("path", path);
            intent.putExtra("length", length);
            startActivity(intent);
          }
        });
        gridView.setOnItemLongClickListener(new OnItemLongClickListener() {
    
          @Override
          public boolean onItemLongClick(AdapterView<?> parent, View view,
              int position, long id) {
            Integer length = fileMap.get(path[position]);
            new AlertDialog.Builder(MainActivity.this)
                .setTitle("图片信息")
                .setMessage(
                    "图片名称:" + path[position] + "
    图片大小:" + length
                        + "k").show();
            return false;
          }
        });
      }
    
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
      }
    
      class MyListAdapter extends BaseAdapter {
    
        @Override
        public int getCount() {
          return datas.size();
        }
    
        @Override
        public Object getItem(int position) {
          return datas.get(position);
        }
    
        @Override
        public long getItemId(int position) {
          return position;
        }
    
        @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      View v = inflater.inflate(R.layout.grid_item, null);
      ImageView tx_name = (ImageView) v.findViewById(R.id.ItemImage);
      TextView tx_phone = (TextView) v.findViewById(R.id.ItemText);
      Map<String, Object> map = datas.get(position);
      tx_name.setImageBitmap((Bitmap) map.get("img"));
      tx_phone.setText((String) map.get("name"));
    return v;
      }
    
      }
    }


    下面这个类就是点击任意一张图片,开启意图Intent,Create另一个Activity,就是单独一个图片的页面

    package com.example.photo;
    
    import java.util.Map;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.Menu;
    import android.widget.ImageView;
    import android.widget.RelativeLayout;
    
    /**
     * 2013-6-16 下午8:23:54
     * 
     * @author 乔晓松
     */
    public class ImageActivity extends Activity {
    
      public static final int IMG = 0;
      public Handler handler;
    
      public RelativeLayout relativeLayout = null;
      public ImageView imageView;
      public int length;
      public int id;
      public Object[] path;
    
      @SuppressLint({ "HandlerLeak", "NewApi" })
      @Override
      protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        handler = new Handler() {
          @Override
          public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
            case IMG:
              if (relativeLayout != null) {
                ImageActivity.this.setContentView(relativeLayout);
              }
              break;
    
            default:
              break;
            }
          }
        };
        new Thread(new Runnable() {
    
          @Override
          public void run() {
            Intent intent = ImageActivity.this.getIntent();
            Bundle bundle = intent.getExtras();
            id = bundle.getInt("id");
            length = bundle.getInt("length");
            String basePath = bundle.getString("basepath");
            path = (Object[]) bundle.get("path");
            relativeLayout = new RelativeLayout(ImageActivity.this);
            imageView = new ImageView(ImageActivity.this);
            Map<String, Object> bitmap = HttpClientTool.send(
                ImageActivity.this, basePath + path[id].toString());
            imageView.setImageBitmap((Bitmap) bitmap.get("img"));
            imageView.setMaxWidth(300);
            imageView.setMaxHeight(400);
            relativeLayout.addView(imageView);
    
            handler.sendEmptyMessage(IMG);
          }
        }).start();
        /*
         * imageView.setOnLongClickListener(new OnLongClickListener() {
         * 
         * @Override public boolean onLongClick(View v) { // new
         * AlertDialog.Builder
         * (ImageActivity.this).setTitle("图片信息").setMessage("图片名称:"
         * +path[id]+"
    	图片大小:"+length+"k").show(); return false; } });
         */
      }
    
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
        return super.onCreateOptionsMenu(menu);
      }
    }

    下面的这个类是我自己写的一个工具类,用户发送请求或者获取图片

    package com.example.photo;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    /**
     * 2013-6-19 上午9:44:41
     * 
     * @author 乔晓松
     */
    public class HttpClientTool {
    
      // 获取图片以及图片的信息
      @SuppressWarnings("unused")
      @SuppressLint("NewApi")
      public static Map<String, Object> send(Context context, String path) {
        Map<String, Object> map = new HashMap<String, Object>();
        ImageView imageView = null;
        imageView = new ImageView(context);
        imageView.setMaxHeight(100);
        imageView.setMaxWidth(100);
        Bitmap bitmap = null;
        try {
          URL url = new URL(path);
          HttpURLConnection httpURLConnection = (HttpURLConnection) url
              .openConnection();
          httpURLConnection.setRequestMethod("GET");
          httpURLConnection.setConnectTimeout(5000);
          if (httpURLConnection.getResponseCode() == 200) {
            if (bitmap != null) {
              System.out.println("---"+bitmap);
              bitmap.recycle();
              System.gc();
            }
            InputStream is = httpURLConnection.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
    //				BitmapFactory.Options options = new BitmapFactory.Options();
    //				options.inSampleSize = computeSampleSize(options, -1, 128*128);
    //				options.inJustDecodeBounds = true;
            int length = httpURLConnection.getContentLength();
            // System.out.println(httpURLConnection.get);
            // MediaStore
            map.put("img", bitmap);
            map.put("length", length);
          } else {
            Toast.makeText(context, "服务器端响应错误", Toast.LENGTH_LONG).show();
          }
          httpURLConnection.disconnect();
        } catch (MalformedURLException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
        return map;
    
      }
    
      public static int computeSampleSize(BitmapFactory.Options options,
          int minSideLength, int maxNumOfPixels) {
        int initialSize = computeInitialSampleSize(options, minSideLength,
            maxNumOfPixels);
        int roundedSize;
        if (initialSize <= 8) {
          roundedSize = 1;
          while (roundedSize < initialSize) {
            roundedSize <<= 1;
          }
        } else {
          roundedSize = (initialSize + 7) / 8 * 8;
        }
        return roundedSize;
      }
    
      public static int computeInitialSampleSize(BitmapFactory.Options options,
          int minSideLength, int maxNumOfPixels) {
        double w = options.outWidth;
        double h = options.outHeight;
        int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math
            .sqrt(w * h / maxNumOfPixels));
        int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(
            Math.floor(w / minSideLength), Math.floor(h / minSideLength));
        if (upperBound < lowerBound) {
          // return the larger one when there is no overlapping zone.
          return lowerBound;
        }
        if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
          return 1;
        } else if (minSideLength == -1) {
          return lowerBound;
        } else {
          return upperBound;
        }
      }
    
      // 获取服务器端images文件下的所有图片名称
      public static List<String> httpClientJSON(String path) {
        List<String> list = null;
        try {
          list = new ArrayList<String>();
          HttpGet httpGet = new HttpGet(path);
          HttpClient httpClient = new DefaultHttpClient();
          HttpResponse httpResponse = httpClient.execute(httpGet);
          if (httpResponse.getStatusLine().getStatusCode() == 200) {
            StringBuilder builder = new StringBuilder();
            BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(httpResponse.getEntity()
                    .getContent()));
            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
              builder.append(str);
            }
            JSONObject jsonObject = new JSONObject(builder.toString());
            JSONArray jsonArray = jsonObject.getJSONArray("list");
            for (int i = 0; i < jsonArray.length(); i++) {
              Object obj = jsonArray.opt(i);
              list.add(obj.toString());
              System.out.println(obj.toString());
            }
          }
        } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
        } catch (ClientProtocolException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        } catch (JSONException e) {
          e.printStackTrace();
        }
        return list;
      }
    }
    
    //

    这么多代码写出来了,要是没有授权还是不行的,必须有网络权限

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.INTERNET"/>

    布局文件

    GridView布局 

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
    
        <ProgressBar
            android:id="@+id/progressBar1"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="160dp" />
    
        <GridView
            android:id="@+id/gridView1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:numColumns="3"
            tools:ignore="AdapterViewChildren,UselessParent" >
        </GridView>
    
    </RelativeLayout>

    单个图片的布局

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="4dip" >
    
        <ImageView
            android:id="@+id/ItemImage"
            android:layout_width="85dp"
            android:layout_height="85dp"
            android:layout_centerHorizontal="true"
            tools:ignore="ContentDescription" >
        </ImageView>
    
        <TextView
            android:id="@+id/ItemText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/ItemImage"
            android:layout_centerHorizontal="true" >
        </TextView>
    
    </RelativeLayout>


    ProgressBar是加载数据时的一个加载效果 

  • 相关阅读:
    String和StringBuffer相关
    ReactNative 2018了解一下
    发送验证码倒计时效果
    图片实际尺寸大小
    ES6(一)
    组件开发之选项卡-2
    (function(){代码})()自执行函数
    Vue组件学习之三
    Vue下拉菜单实例demo
    窗口大小左右拖动demo
  • 原文地址:https://www.cnblogs.com/mochaMM/p/5110091.html
Copyright © 2020-2023  润新知