文档章节

android学习3

 易水寒521
发布于 2015/06/09 16:37
字数 827
阅读 4
收藏 0

MainActivity

 package com.zhy.imageloader;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.GridView;
import android.widget.PopupWindow.OnDismissListener;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.zhy.bean.ImageFloder;
import com.zhy.imageloader.ListImageDirPopupWindow.OnImageDirSelected;
public class MainActivity extends Activity implements OnImageDirSelected
{
 private ProgressDialog mProgressDialog;
 /**
  * 存储文件夹中的图片数量
  */
 private int mPicsSize;
 /**
  * 图片数量最多的文件夹
  */
 private File mImgDir;
 /**
  * 所有的图片
  */
 private List<String> mImgs;
 private GridView mGirdView;
 private MyAdapter mAdapter;
 /**
  * 临时的辅助类,用于防止同一个文件夹的多次扫描
  */
 private HashSet<String> mDirPaths = new HashSet<String>();
 /**
  * 扫描拿到所有的图片文件夹
  */
 private List<ImageFloder> mImageFloders = new ArrayList<ImageFloder>();
 private RelativeLayout mBottomLy;
 private TextView mChooseDir;
 private TextView mImageCount;
 int totalCount = 0;
 private int mScreenHeight;
 private ListImageDirPopupWindow mListImageDirPopupWindow;
 private Handler mHandler = new Handler()
 {
  public void handleMessage(android.os.Message msg)
  {
   mProgressDialog.dismiss();
   // 为View绑定数据
   data2View();
   // 初始化展示文件夹的popupWindw
   initListDirPopupWindw();
  }
 };
 /**
  * 为View绑定数据
  */
 private void data2View()
 {
  if (mImgDir == null)
  {
   Toast.makeText(getApplicationContext(), "擦,一张图片没扫描到",
     Toast.LENGTH_SHORT).show();
   return;
  }
  mImgs = Arrays.asList(mImgDir.list());
  /**
   * 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗;
   */
  mAdapter = new MyAdapter(getApplicationContext(), mImgs,
    R.layout.grid_item, mImgDir.getAbsolutePath());
  mGirdView.setAdapter(mAdapter);
  mImageCount.setText(totalCount + "张");
 };
 /**
  * 初始化展示文件夹的popupWindw
  */
 private void initListDirPopupWindw()
 {
  mListImageDirPopupWindow = new ListImageDirPopupWindow(
    LayoutParams.MATCH_PARENT, (int) (mScreenHeight * 0.7),
    mImageFloders, LayoutInflater.from(getApplicationContext())
      .inflate(R.layout.list_dir, null));
  mListImageDirPopupWindow.setOnDismissListener(new OnDismissListener()
  {
   @Override
   public void onDismiss()
   {
    // 设置背景颜色变暗
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.alpha = 1.0f;
    getWindow().setAttributes(lp);
   }
  });
  // 设置选择文件夹的回调
  mListImageDirPopupWindow.setOnImageDirSelected(this);
 }
 @Override
 protected void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  DisplayMetrics outMetrics = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
  mScreenHeight = outMetrics.heightPixels;
  initView();
  getImages();
  initEvent();
 }
 /**
  * 利用ContentProvider扫描手机中的图片,此方法在运行在子线程中 完成图片的扫描,最终获得jpg最多的那个文件夹
  */
 private void getImages()
 {
  if (!Environment.getExternalStorageState().equals(
    Environment.MEDIA_MOUNTED))
  {
   Toast.makeText(this, "暂无外部存储", Toast.LENGTH_SHORT).show();
   return;
  }
  // 显示进度条
  mProgressDialog = ProgressDialog.show(this, null, "正在加载...");
  new Thread(new Runnable()
  {
   @Override
   public void run()
   {
    String firstImage = null;
    Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    ContentResolver mContentResolver = MainActivity.this
      .getContentResolver();
    // 只查询jpeg和png的图片
    Cursor mCursor = mContentResolver.query(mImageUri, null,
      MediaStore.Images.Media.MIME_TYPE + "=? or "
        + MediaStore.Images.Media.MIME_TYPE + "=?",
      new String[] { "image/jpeg", "image/png" },
      MediaStore.Images.Media.DATE_MODIFIED);
    Log.e("TAG", mCursor.getCount() + "");
    while (mCursor.moveToNext())
    {
     // 获取图片的路径
     String path = mCursor.getString(mCursor
       .getColumnIndex(MediaStore.Images.Media.DATA));
     Log.e("TAG", path);
     // 拿到第一张图片的路径
     if (firstImage == null)
      firstImage = path;
     // 获取该图片的父路径名
     File parentFile = new File(path).getParentFile();
     if (parentFile == null)
      continue;
     String dirPath = parentFile.getAbsolutePath();
     ImageFloder imageFloder = null;
     // 利用一个HashSet防止多次扫描同一个文件夹(不加这个判断,图片多起来还是相当恐怖的~~)
     if (mDirPaths.contains(dirPath))
     {
      continue;
     } else
     {
      mDirPaths.add(dirPath);
      // 初始化imageFloder
      imageFloder = new ImageFloder();
      imageFloder.setDir(dirPath);
      imageFloder.setFirstImagePath(path);
     }
     int picSize = parentFile.list(new FilenameFilter()
     {
      @Override
      public boolean accept(File dir, String filename)
      {
       if (filename.endsWith(".jpg")
         || filename.endsWith(".png")
         || filename.endsWith(".jpeg"))
        return true;
       return false;
      }
     }).length;
     totalCount += picSize;
     imageFloder.setCount(picSize);
     mImageFloders.add(imageFloder);
     if (picSize > mPicsSize)
     {
      mPicsSize = picSize;
      mImgDir = parentFile;
     }
    }
    mCursor.close();
    // 扫描完成,辅助的HashSet也就可以释放内存了
    mDirPaths = null;
    // 通知Handler扫描图片完成
    mHandler.sendEmptyMessage(0x110);
   }
  }).start();
 }
 /**
  * 初始化View
  */
 private void initView()
 {
  mGirdView = (GridView) findViewById(R.id.id_gridView);
  mChooseDir = (TextView) findViewById(R.id.id_choose_dir);
  mImageCount = (TextView) findViewById(R.id.id_total_count);
  mBottomLy = (RelativeLayout) findViewById(R.id.id_bottom_ly);
 }
 private void initEvent()
 {
  /**
   * 为底部的布局设置点击事件,弹出popupWindow
   */
  mBottomLy.setOnClickListener(new OnClickListener()
  {
   @Override
   public void onClick(View v)
   {
    mListImageDirPopupWindow
      .setAnimationStyle(R.style.anim_popup_dir);
    mListImageDirPopupWindow.showAsDropDown(mBottomLy, 0, 0);
    // 设置背景颜色变暗
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.alpha = .3f;
    getWindow().setAttributes(lp);
   }
  });
 }
 @Override
 public void selected(ImageFloder floder)
 {
  mImgDir = new File(floder.getDir());
  mImgs = Arrays.asList(mImgDir.list(new FilenameFilter()
  {
   @Override
   public boolean accept(File dir, String filename)
   {
    if (filename.endsWith(".jpg") || filename.endsWith(".png")
      || filename.endsWith(".jpeg"))
     return true;
    return false;
   }
  }));
  /**
   * 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗;
   */
  mAdapter = new MyAdapter(getApplicationContext(), mImgs,
    R.layout.grid_item, mImgDir.getAbsolutePath());
  mGirdView.setAdapter(mAdapter);
  // mAdapter.notifyDataSetChanged();
  mImageCount.setText(floder.getCount() + "张");
  mChooseDir.setText(floder.getName());
  mListImageDirPopupWindow.dismiss();
 }
}

© 著作权归作者所有

上一篇: OptionMenuActivity
下一篇: android学习2
粉丝 0
博文 130
码字总数 120077
作品 0
虹口
私信 提问
Android学习攻略:手把手教你循序渐进地学习Android知识

前言 如果你也学习Android,那么你大概率会看过我的文章。经常有读者给我留言:“该怎么学习Android?”、“日常学习Android的方法是什么”。 所以,今天,我将献上一份《Android学习指南》,...

Carson_Ho
04/24
0
0
Android实战经验之图像处理及特效处理的集锦(总结版)

1 Android学习笔记进阶之在图片上涂鸦(能清屏) 2 Android学习笔记之详细讲解画圆角图片 3 Android学习笔记进阶20之得到图片的缩略图 4 Android学习笔记进阶19之给图片加边框 5 Android学习笔...

xiaosi
2012/03/12
39.3K
25
Android知识图谱:我们到底需要学习哪些Android知识?

前言 如果你也学习Android,那么你大概率会看过我的文章。经常有读者给我留言:“该怎么学习Android?”、“日常学习Android的方法是什么”。 所以,今天,我将献上一份《Android知识图谱》,...

Carson_Ho
04/22
0
0
android学习资料收集整理

本人习惯学习一门技术之前习惯先收集足够的相关资料后选择优秀的资料进行学习,android资料收集可以说是耗时最长的一次了,因为种种原因导致一直没有放下其他事情来专门学习,所以资料收集也...

阿酷
2011/12/26
401
0
这是一份全面 & 详细的Android学习指南

前言 如果你也学习Android,那么你大概率会看过我的文章。 经常有读者给我留言:“该怎么学习Android?”、“日常学习Android的方法是什么”、”如何实践应用Android“等。 所以,今天,我将...

Carson_Ho
05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java的战争

本文来自微信公众号: 金捷幡(ID:jin-jiefan) ,作者:金捷幡,封面:拉里·埃里森(东方IC) 2019年5月,彻底撕破脸的特朗普掀起对华为的战争,谷歌被迫吊销了华为的Android授权。开源软...

Java领航员
35分钟前
1
0
超详细的LM3414MRX/NOPB规格参数介绍就在这里

超详细的LM3414MRX/NOPB规格参数介绍就在这里 描述 LM3414和LM3414MRX/NOPB是具有1-A 60 W(1)共阳极功能的恒流降压LED驱动器。它们适用于驱动单串3-W HBLED,效率高达96%。它们可接受4.5...

不能吃肉的仙女
41分钟前
1
0
Eclipse国内镜像源配置方法

Table of Contents 我们在国内从官网下载Eclipse以及插件非常慢,那么,有没有方法变快呢? 有,那就是使用国内的公开镜像源替换官方源。 1 下载Eclipse 首先,我们看一个链接地址: http:/...

求神
今天
5
0
java 请求服务

一.第一种基于java web http 请求服务,必须用tomcat 容器启动才能对外提供服务 在maven 工程中pox 文件导入jar <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>h......

zaolonglei
今天
5
0
HDFS工作机制——自开发分布式数据采集系统

需求描述: 在业务系统的服务器上,业务程序会不断生成业务日志(比如网站的页面访问日志) 业务日志是用log4j生成的,会不断地切出日志文件,需要定期(比如每小时)从业务服务器上的日志目...

须臾之余
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部