Android 위 챗 사진 선택 기 미리 보기 그림 보기

자,이제 본론 으로 들 어가 서 실현 효 과 를 살 펴 보 자.




다음은 코드 를 소개 하 겠 습 니 다.
 본 사고방식 은 다음 과 같다.
  • 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); 
    
    
    여기 서 한 가지 설명 이 있 습 니 다.바로 제 가 그림 을 지 울 때 오류 가 발생 했 습 니 다.자바 Concurrent ModificationException 이상 입 니 다.이 오 류 는 우리 의 Vector,List 또는 Array List 의 데이터 원본 이 변화 할 때 이 list 를 다시 조작 하면 이 이상 한 오류 가 발생 합 니 다.해결 방법 은 이 그림 배열 을 옮 겨 다 니 는 것 입 니 다.비교 경로 가 같은 지(가장 좋 은 방법 은 id 가 같은 지 비교 하 는 것 입 니 다)new 한 배열 은 같은 그림 을 new 배열 에서 마지막 으로 이전 그림 배열 removeAll 로 제거 하면 이상 오 류 를 보고 하지 않 습 니 다.물론 우리 new 배열 은 우리 의 이전 배열 데이터 원본 보다 적 거나 같 을 것 입 니 다.
    이상 은 본 고의 모든 내용 입 니 다.여러분 이 안 드 로 이 드 소프트웨어 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.

    좋은 웹페이지 즐겨찾기