国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > 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軟件編程有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 囊谦县| 罗甸县| 斗六市| 兴安盟| 荃湾区| 双牌县| 巴青县| 镇平县| 青河县| 新泰市| 峨眉山市| 新乡市| 吴江市| 蓬溪县| 和静县| 青阳县| 瓦房店市| 永平县| 沭阳县| 天水市| 通江县| 图木舒克市| 雅安市| 闵行区| 佳木斯市| 诸暨市| 方城县| 临夏市| 安乡县| 凤庆县| 紫金县| 衢州市| 司法| 咸阳市| 个旧市| 固安县| 通江县| 中卫市| 滨州市| 疏附县| 应用必备|