diff --git a/README.md b/README.md index d129753..f901482 100644 --- a/README.md +++ b/README.md @@ -106,9 +106,10 @@ class CustomerActivity extends Activity implements MultiImageSelectorFragment.Ca ###Change Log -* 2015-4-9 - 1. Fixed. When set `EXTRA_SHOW_CAMERA` to `true`, the first grid item onclick event were messed. - 2. Add. Support initial selected image list. +* 2015-5-5 + 1. Fixed. Can't display some images. (Issue by[sd6352051](https://github.com/sd6352051), [larry](https://github.com/18611480882)) + 2. Fixed. `ListPopupWindow` can not fill parent + 3. Added. Add checked mask. * 2015-4-16 1. Fixed. Crack when rotate device. (Issue by [@Leminity](https://github.com/Leminity)) @@ -116,6 +117,10 @@ class CustomerActivity extends Activity implements MultiImageSelectorFragment.Ca 3. Change. Demo application shortcut. 4. Change. Readme file. +* 2015-4-9 + 1. Fixed. When set `EXTRA_SHOW_CAMERA` to `true`, the first grid item onclick event were messed. + 2. Add. Support initial selected image list. + ------------------- ###Thanks diff --git a/README_zh.md b/README_zh.md index b4900fa..b6ba2cc 100644 --- a/README_zh.md +++ b/README_zh.md @@ -106,9 +106,10 @@ class CustomerActivity extends Activity implements MultiImageSelectorFragment.Ca ###更新日志 -* 2015-4-9 - 1. 修复. 当设置 `EXTRA_SHOW_CAMERA` 为 `true` 时, 点击第一个Item会混乱的问题. - 2. 新增. 支持初始化图片选择设定。 +* 2015-5-5 + 1. 修复. 某些图片无法显示. (Issue by[sd6352051](https://github.com/sd6352051), [larry](https://github.com/18611480882)) + 2. 修复. `ListPopupWindow` 无法填充父控件 + 3. 新增. 选中的遮罩效果. * 2015-4-16 1. 修复. 旋转设备时,程序会崩溃. (Issue by [@Leminity](https://github.com/Leminity)) @@ -116,6 +117,11 @@ class CustomerActivity extends Activity implements MultiImageSelectorFragment.Ca 3. 更改. 演示程序截图. 4. 更改. Readme 文件. +* 2015-4-9 + 1. 修复. 当设置 `EXTRA_SHOW_CAMERA` 为 `true` 时, 点击第一个Item会混乱的问题. + 2. 新增. 支持初始化图片选择设定。 + + ------------------- ###感谢 diff --git a/multi-image-selector/build.gradle b/multi-image-selector/build.gradle index 3e16f12..397c989 100644 --- a/multi-image-selector/build.gradle +++ b/multi-image-selector/build.gradle @@ -21,5 +21,5 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.0.0' - compile 'com.squareup.picasso:picasso:2.5.2' + compile 'com.squareup.picasso:picasso:2.4.0' } diff --git a/multi-image-selector/multi-image-selector.iml b/multi-image-selector/multi-image-selector.iml index 658af94..325fdde 100644 --- a/multi-image-selector/multi-image-selector.iml +++ b/multi-image-selector/multi-image-selector.iml @@ -90,6 +90,6 @@ - + \ No newline at end of file diff --git a/multi-image-selector/src/main/java/me/nereo/multi_image_selector/MultiImageSelectorFragment.java b/multi-image-selector/src/main/java/me/nereo/multi_image_selector/MultiImageSelectorFragment.java index 01876c6..cf0a0b6 100644 --- a/multi-image-selector/src/main/java/me/nereo/multi_image_selector/MultiImageSelectorFragment.java +++ b/multi-image-selector/src/main/java/me/nereo/multi_image_selector/MultiImageSelectorFragment.java @@ -5,9 +5,12 @@ import android.app.Activity; import android.content.Intent; import android.content.res.Configuration; import android.database.Cursor; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.Handler; import android.provider.MediaStore; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; @@ -93,6 +96,9 @@ public class MultiImageSelectorFragment extends Fragment { private int mDesireImageCount; private boolean hasFolderGened = false; + private boolean mIsShowCamera = false; + + private int mGridWidth, mGridHeight; private File mTmpFile; @@ -130,16 +136,11 @@ public class MultiImageSelectorFragment extends Fragment { } // 是否显示照相机 - final boolean showCamera = getArguments().getBoolean(EXTRA_SHOW_CAMERA, true); - mImageAdapter = new ImageGridAdapter(getActivity(), showCamera); + mIsShowCamera = getArguments().getBoolean(EXTRA_SHOW_CAMERA, true); + mImageAdapter = new ImageGridAdapter(getActivity(), mIsShowCamera); // 是否显示选择指示器 mImageAdapter.showSelectIndicator(mode == MODE_MULTI); - // 如果显示了照相机,则创建临时文件 - if(showCamera){ - mTmpFile = FileUtils.createTmpFile(getActivity()); - } - mPopupAnchorView = view.findViewById(R.id.footer); mTimeLineText = (TextView) view.findViewById(R.id.timeline_area); @@ -152,9 +153,14 @@ public class MultiImageSelectorFragment extends Fragment { mCategoryText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - if(mFolderPopupWindow.isShowing()){ + + if(mFolderPopupWindow == null){ + createPopupFolderList(mGridWidth, mGridHeight); + } + + if (mFolderPopupWindow.isShowing()) { mFolderPopupWindow.dismiss(); - }else { + } else { mFolderPopupWindow.show(); int index = mFolderAdapter.getSelectIndex(); index = index == 0 ? index : index - 1; @@ -215,16 +221,15 @@ public class MultiImageSelectorFragment extends Fragment { final int width = mGridView.getWidth(); final int height = mGridView.getHeight(); + mGridWidth = width; + mGridHeight = height; + final int desireSize = getResources().getDimensionPixelOffset(R.dimen.image_size); final int numCount = width / desireSize; final int columnSpace = getResources().getDimensionPixelOffset(R.dimen.space_size); int columnWidth = (width - columnSpace*(numCount-1)) / numCount; mImageAdapter.setItemSize(columnWidth); - if(mFolderPopupWindow == null){ - createPopupFolderList(width, height); - } - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){ mGridView.getViewTreeObserver().removeOnGlobalLayoutListener(this); }else{ @@ -260,33 +265,49 @@ public class MultiImageSelectorFragment extends Fragment { */ private void createPopupFolderList(int width, int height) { mFolderPopupWindow = new ListPopupWindow(getActivity()); + mFolderPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); mFolderPopupWindow.setAdapter(mFolderAdapter); mFolderPopupWindow.setContentWidth(width); - mFolderPopupWindow.setHeight(height * 5/8); + mFolderPopupWindow.setWidth(width); + mFolderPopupWindow.setHeight(height * 5 / 8); mFolderPopupWindow.setAnchorView(mPopupAnchorView); mFolderPopupWindow.setModal(true); mFolderPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) { - if (i == 0) { - getActivity().getSupportLoaderManager().restartLoader(LOADER_ALL, null, mLoaderCallback); - mCategoryText.setText(R.string.folder_all); - mImageAdapter.setShowCamera(true); - } else { - Folder folder = (Folder) adapterView.getAdapter().getItem(i); - if (null != folder) { - Bundle args = new Bundle(); - args.putString("path", folder.path); - getActivity().getSupportLoaderManager().restartLoader(LOADER_CATEGORY, args, mLoaderCallback); - mCategoryText.setText(folder.name); - } - mImageAdapter.setShowCamera(false); - } - mFolderAdapter.setSelectIndex(i); - mFolderPopupWindow.dismiss(); - // 滑动到最初始位置 - mGridView.smoothScrollToPosition(0); + mFolderAdapter.setSelectIndex(i); + + final int index = i; + final AdapterView v = adapterView; + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + mFolderPopupWindow.dismiss(); + + if (index == 0) { + getActivity().getSupportLoaderManager().restartLoader(LOADER_ALL, null, mLoaderCallback); + mCategoryText.setText(R.string.folder_all); + if (mIsShowCamera) { + mImageAdapter.setShowCamera(true); + } else { + mImageAdapter.setShowCamera(false); + } + } else { + Folder folder = (Folder) v.getAdapter().getItem(index); + if (null != folder) { + mImageAdapter.setData(folder.images); + mCategoryText.setText(folder.name); + } + mImageAdapter.setShowCamera(false); + } + + // 滑动到最初始位置 + mGridView.smoothScrollToPosition(0); + } + }, 100); + } }); } @@ -303,13 +324,17 @@ public class MultiImageSelectorFragment extends Fragment { public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 相机拍照完成后,返回图片路径 - if(resultCode == Activity.RESULT_OK) { - if(requestCode == REQUEST_CAMERA){ + if(requestCode == REQUEST_CAMERA){ + if(resultCode == Activity.RESULT_OK) { if (mTmpFile != null) { if (mCallback != null) { mCallback.onCameraShot(mTmpFile); } } + }else{ + if(mTmpFile != null && mTmpFile.exists()){ + mTmpFile.delete(); + } } } } @@ -318,8 +343,6 @@ public class MultiImageSelectorFragment extends Fragment { public void onConfigurationChanged(Configuration newConfig) { Log.d(TAG, "on change"); - final int orientation = newConfig.orientation; - if(mFolderPopupWindow != null){ if(mFolderPopupWindow.isShowing()){ mFolderPopupWindow.dismiss(); @@ -327,27 +350,28 @@ public class MultiImageSelectorFragment extends Fragment { } mGridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override @TargetApi(Build.VERSION_CODES.JELLY_BEAN) + @Override + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public void onGlobalLayout() { final int height = mGridView.getHeight(); final int desireSize = getResources().getDimensionPixelOffset(R.dimen.image_size); - Log.d(TAG, "Desire Size = "+desireSize); + Log.d(TAG, "Desire Size = " + desireSize); final int numCount = mGridView.getWidth() / desireSize; - Log.d(TAG, "Grid Size = "+mGridView.getWidth()); - Log.d(TAG, "num count = "+numCount); + Log.d(TAG, "Grid Size = " + mGridView.getWidth()); + Log.d(TAG, "num count = " + numCount); final int columnSpace = getResources().getDimensionPixelOffset(R.dimen.space_size); - int columnWidth = (mGridView.getWidth() - columnSpace*(numCount-1)) / numCount; + int columnWidth = (mGridView.getWidth() - columnSpace * (numCount - 1)) / numCount; mImageAdapter.setItemSize(columnWidth); - if(mFolderPopupWindow != null){ - mFolderPopupWindow.setHeight(height * 5/8); + if (mFolderPopupWindow != null) { + mFolderPopupWindow.setHeight(height * 5 / 8); } - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { mGridView.getViewTreeObserver().removeOnGlobalLayoutListener(this); - }else{ + } else { mGridView.getViewTreeObserver().removeGlobalOnLayoutListener(this); } } @@ -365,6 +389,8 @@ public class MultiImageSelectorFragment extends Fragment { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if(cameraIntent.resolveActivity(getActivity().getPackageManager()) != null){ // 设置系统相机拍照后的输出路径 + // 创建临时文件 + mTmpFile = FileUtils.createTmpFile(getActivity()); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile)); startActivityForResult(cameraIntent, REQUEST_CAMERA); }else{ @@ -500,9 +526,9 @@ public class MultiImageSelectorFragment extends Fragment { * 回调接口 */ public interface Callback{ - public void onSingleImageSelected(String path); - public void onImageSelected(String path); - public void onImageUnselected(String path); - public void onCameraShot(File imageFile); + void onSingleImageSelected(String path); + void onImageSelected(String path); + void onImageUnselected(String path); + void onCameraShot(File imageFile); } } diff --git a/multi-image-selector/src/main/java/me/nereo/multi_image_selector/adapter/FolderAdapter.java b/multi-image-selector/src/main/java/me/nereo/multi_image_selector/adapter/FolderAdapter.java index b1bd1e3..7e5a237 100644 --- a/multi-image-selector/src/main/java/me/nereo/multi_image_selector/adapter/FolderAdapter.java +++ b/multi-image-selector/src/main/java/me/nereo/multi_image_selector/adapter/FolderAdapter.java @@ -95,7 +95,7 @@ public class FolderAdapter extends BaseAdapter { if(lastSelected == i){ holder.indicator.setVisibility(View.VISIBLE); }else{ - holder.indicator.setVisibility(View.GONE); + holder.indicator.setVisibility(View.INVISIBLE); } } return view; diff --git a/multi-image-selector/src/main/java/me/nereo/multi_image_selector/adapter/ImageGridAdapter.java b/multi-image-selector/src/main/java/me/nereo/multi_image_selector/adapter/ImageGridAdapter.java index 2e042f5..23bed9d 100644 --- a/multi-image-selector/src/main/java/me/nereo/multi_image_selector/adapter/ImageGridAdapter.java +++ b/multi-image-selector/src/main/java/me/nereo/multi_image_selector/adapter/ImageGridAdapter.java @@ -208,10 +208,12 @@ public class ImageGridAdapter extends BaseAdapter { class ViewHolde { ImageView image; ImageView indicator; + View mask; ViewHolde(View view){ image = (ImageView) view.findViewById(R.id.image); indicator = (ImageView) view.findViewById(R.id.checkmark); + mask = view.findViewById(R.id.mask); view.setTag(this); } @@ -223,9 +225,11 @@ public class ImageGridAdapter extends BaseAdapter { if(mSelectedImages.contains(data)){ // 设置选中状态 indicator.setImageResource(R.drawable.btn_selected); + mask.setVisibility(View.VISIBLE); }else{ // 未选择 indicator.setImageResource(R.drawable.btn_unselected); + mask.setVisibility(View.GONE); } }else{ indicator.setVisibility(View.GONE); diff --git a/multi-image-selector/src/main/res/color/folder_text_color.xml b/multi-image-selector/src/main/res/color/folder_text_color.xml new file mode 100644 index 0000000..0a07caf --- /dev/null +++ b/multi-image-selector/src/main/res/color/folder_text_color.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/multi-image-selector/src/main/res/layout-v14/fragment_multi_image.xml b/multi-image-selector/src/main/res/layout-v14/fragment_multi_image.xml new file mode 100644 index 0000000..1b41929 --- /dev/null +++ b/multi-image-selector/src/main/res/layout-v14/fragment_multi_image.xml @@ -0,0 +1,82 @@ + + + + + + + + + +