Android 위 챗 사진 선택 기 미리 보기 그림 보기
다음은 코드 를 소개 하 겠 습 니 다.
본 사고방식 은 다음 과 같다.
구체 적 인 코드 를 보십시오.
먼저 스 레 드 를 열 어 그림 을 스 캔 합 니 다.
/**
* 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 배열 은 우리 의 이전 배열 데이터 원본 보다 적 거나 같 을 것 입 니 다.이상 은 본 고의 모든 내용 입 니 다.여러분 이 안 드 로 이 드 소프트웨어 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.