亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android仿微信照片選擇器實現預覽查看圖片

2020-04-11 10:53:53
字體:
來源:轉載
供稿:網友

好了下面進入正題,我們先看一下實現效果吧:

下面來介紹一下代碼:

 本思路就是:

  • 1.先到手機中掃描jpeg和png的圖片
  • 2.獲取導圖片的路徑和圖片的父路徑名也就是文件夾名
  • 3.將圖片路徑和文件夾名分別添加導數據源中
  • 4.數據源有了就是顯示了,文件夾顯示是利用的popwindow,而圖片顯示則是GridView

看一下具體代碼:

首先開啟一個線程去掃描圖片

/**  * 利用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 = AlbumActivity.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();   }

代碼很詳細不多說
文件夾popwindow彈出事件

private void initEvent()  {  /**   * 為底部的布局設置點擊事件,彈出popupWindow   */  mBottomLy.setOnClickListener(new View.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);   }  });  } 

最后是設置圖片的點擊事件

//設置ImageView的點擊事件  mImageView.setOnClickListener(new OnClickListener()  {   //選擇,則將圖片變暗,反之則反之   @Override   public void onClick(View v)   {    // 已經選擇過該圖片   if (mSelectedImage.contains(mDirPath + "/" + item))   {    mSelectedImage.remove(mDirPath + "/" + item);    mSelect.setImageResource(R.drawable.picture_unselected);    mImageView.setColorFilter(null);    List<ImageBean> delete = new ArrayList<ImageBean>();    for (ImageBean im:Bimp.tempSelectBitmap){    if (im.getPath().equals(mDirPath + "/" + item)){     delete.add(im);    }    }    Bimp.tempSelectBitmap.removeAll(delete);    Message msg = new Message();    msg.what=0;    AlbumActivity.handler.sendMessage(msg);   } else   // 未選擇該圖片   {    if (Bimp.tempSelectBitmap.size()>8){    Toast.makeText(context,"超出可選圖片數",Toast.LENGTH_SHORT).show();    return;    }    else {    mSelectedImage.add(mDirPath + "/" + item);    mSelect.setImageResource(R.drawable.pictures_selected);    mImageView.setColorFilter(Color.parseColor("#77000000"));    ImageBean imageBean = new ImageBean();    imageBean.setPath(mDirPath + "/" + item);    try {     imageBean.setBitmap(Bimp.revitionImageSize(mDirPath + "/" + item));    } catch (IOException e) {     e.printStackTrace();    }    Bimp.tempSelectBitmap.add(imageBean);    Message msg = new Message();    msg.what=0;    AlbumActivity.handler.sendMessage(msg);    }    }    } 

這里面為了配合之前的博客,我加入了選中圖片和取消選中圖片將圖片在Bimp.tempSelectBitmap中刪除和添加的操作,更新選擇圖片的數量,也就是下面這兩段代碼:

List<ImageBean> delete = new ArrayList<ImageBean>();    for (ImageBean im:Bimp.tempSelectBitmap){    if (im.getPath().equals(mDirPath + "/" + item)){     delete.add(im);    }    }    Bimp.tempSelectBitmap.removeAll(delete);    Message msg = new Message();    msg.what=0;    AlbumActivity.handler.sendMessage(msg); 
ImageBean imageBean = new ImageBean();    imageBean.setPath(mDirPath + "/" + item);    try {     imageBean.setBitmap(Bimp.revitionImageSize(mDirPath + "/" + item));    } catch (IOException e) {     e.printStackTrace();    }    Bimp.tempSelectBitmap.add(imageBean);    Message msg = new Message();    msg.what=0;    AlbumActivity.handler.sendMessage(msg); 

這里有一點說明,就是我在寫移除圖片的時候遇到了一個錯誤,Java ConcurrentModificationException異常,這個錯誤就是說當我們的Vector,List或者ArrayList中的數據源發生變化的時候,你再去操作這個list就會出現這個異常錯誤,解決辦法是,遍歷這個圖片數組,比較路徑是否相同(最好的辦法是比較id是否相同),new 一個數組將相同的圖片假如new的數組中,最后用之前的圖片數組removeAll來移除,這樣就不會報異常錯誤了,當然我們new的數組肯定比我們之前的數組數據源少或者等同。

以上就是本文的全部內容,希望對大家學習Android軟件編程有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品久久中文字幕佐佐木| 夜夜躁日日躁狠狠久久88av| 国产精品视频999| 日日噜噜噜夜夜爽亚洲精品| 国产精品一久久香蕉国产线看观看| 日韩在线视频网站| 91久久久久久久一区二区| 日韩欧美在线免费| 国产精品扒开腿爽爽爽视频| 亚洲男人天堂视频| 国产精品一区专区欧美日韩| 亚洲国产精品久久久久| 欧美一级大片视频| 亚洲社区在线观看| 亚洲国产另类 国产精品国产免费| 日本久久久久久久| 98精品在线视频| 日韩有码视频在线| 成人中心免费视频| 久久精品99久久久香蕉| 久久天天躁狠狠躁夜夜爽蜜月| 欧美理论电影在线观看| 亚洲自拍偷拍福利| 日韩电影在线观看免费| 91精品成人久久| 亚洲三级黄色在线观看| 亚洲综合最新在线| 久久伊人精品一区二区三区| 青青在线视频一区二区三区| 狠狠躁夜夜躁人人爽天天天天97| 最近2019年中文视频免费在线观看| 精品国产一区二区三区在线观看| www.日韩不卡电影av| 成人免费在线视频网站| 性欧美暴力猛交69hd| 欧美黑人xxxx| www欧美日韩| 97视频免费看| 中文字幕成人精品久久不卡| 97超级碰在线看视频免费在线看| 成人女保姆的销魂服务| 久久人人爽人人爽爽久久| 欧美色视频日本版| 国产精品一区专区欧美日韩| 久久久国产成人精品| 久久久久久伊人| 97成人精品视频在线观看| 日本免费在线精品| 成人激情电影一区二区| 欧美激情啊啊啊| 日日噜噜噜夜夜爽亚洲精品| 国产一区二中文字幕在线看| 国产视频精品免费播放| 国产91|九色| 一区二区av在线| 韩国v欧美v日本v亚洲| 亚洲深夜福利在线| 69视频在线免费观看| 久热精品视频在线免费观看| 2019中文字幕免费视频| 国产视频精品自拍| 久久免费精品日本久久中文字幕| 亚洲欧洲高清在线| 久久久综合免费视频| 成人日韩在线电影| 国产一区二区三区三区在线观看| 亚洲综合社区网| 青青精品视频播放| 成人免费观看网址| 国产精品一区二区久久精品| 亚洲成人免费网站| 最近2019中文字幕第三页视频| 国产精品毛片a∨一区二区三区|国| 亚洲成人av资源网| 欧美精品精品精品精品免费| 久久久精品电影| 国产激情999| 欧美在线日韩在线| 国产精品久久久久91| 性欧美在线看片a免费观看| 精品无人区太爽高潮在线播放| 亚洲欧美色图片| 精品国产区一区二区三区在线观看| 久久久久久久久久av| 欧美激情精品久久久久久免费印度| 97涩涩爰在线观看亚洲| 亚洲欧美日韩一区二区在线| 亚洲美女av在线播放| 欧美成人免费全部观看天天性色| 成人观看高清在线观看免费| 欧美区在线播放| 在线精品国产欧美| 日日噜噜噜夜夜爽亚洲精品| 国产精品日韩在线观看| 欧美精品在线观看91| 久久久久中文字幕2018| 亚洲精品久久久久久久久久久久久| 在线观看亚洲区| 欧美激情亚洲国产| 日韩在线观看电影| 欧美亚洲国产另类| 国产精品免费一区| 日韩成人中文字幕| 日韩精品黄色网| 国产一区二区三区直播精品电影| 26uuu亚洲国产精品| 亚洲欧美日韩高清| 国产91色在线|免| 亚洲一区二区三区在线视频| 夜色77av精品影院| 亚洲免费中文字幕| 国产啪精品视频| 日韩在线视频国产| 伊人久久男人天堂| 国产精品久久综合av爱欲tv| 欧美午夜性色大片在线观看| 日本免费一区二区三区视频观看| 91wwwcom在线观看| 中文字幕av一区中文字幕天堂| 亚洲天堂免费视频| 亚洲精品中文字幕女同| 欧美黄色性视频| 色综合导航网站| www.亚洲成人| 午夜免费日韩视频| 国内精品久久久久久久久| 欧美日韩午夜剧场| 亚州欧美日韩中文视频| 欧美电影第一页| 精品视频久久久久久久| 91情侣偷在线精品国产| 久久九九精品99国产精品| 青青草原成人在线视频| 亚洲社区在线观看| 91精品久久久久久久久久| 久久影视电视剧免费网站| www.亚洲免费视频| 麻豆国产va免费精品高清在线| 亚洲片av在线| 欧美床上激情在线观看| 岛国视频午夜一区免费在线观看| 成人福利网站在线观看| 国产精品成人v| 欧美在线视频一二三| 亚洲欧美制服综合另类| 亚洲a在线播放| 丁香五六月婷婷久久激情| 久久久爽爽爽美女图片| 日本久久久a级免费| 亚洲国产精品小视频| 2023亚洲男人天堂| 日韩高清中文字幕| 国产精品一二三在线| 日韩在线资源网| 国产精品久久二区| 青青在线视频一区二区三区| 国产精品视频永久免费播放| 久久综合免费视频| 国产精品免费小视频| 伊人一区二区三区久久精品| 欧美精品在线极品| 日本国产欧美一区二区三区| 91免费精品国偷自产在线| 黄网动漫久久久|