diff --git a/app/src/main/java/com/lzy/imagepickerdemo/GApp.java b/app/src/main/java/com/lzy/imagepickerdemo/GApp.java index 51faf66..d030e86 100644 --- a/app/src/main/java/com/lzy/imagepickerdemo/GApp.java +++ b/app/src/main/java/com/lzy/imagepickerdemo/GApp.java @@ -22,9 +22,9 @@ public class GApp extends Application { public static DisplayImageOptions imageLoaderOptions = new DisplayImageOptions.Builder()// - .showImageOnLoading(R.mipmap.default_image) //设置图片在下载期间显示的图片 - .showImageForEmptyUri(R.mipmap.default_image) //设置图片Uri为空或是错误的时候显示的图片 - .showImageOnFail(R.mipmap.default_image) //设置图片加载/解码过程中错误时候显示的图片 + .showImageOnLoading(R.drawable.ic_default_image) //设置图片在下载期间显示的图片 + .showImageForEmptyUri(R.drawable.ic_default_image) //设置图片Uri为空或是错误的时候显示的图片 + .showImageOnFail(R.drawable.ic_default_image) //设置图片加载/解码过程中错误时候显示的图片 .cacheInMemory(true) //设置下载的图片是否缓存在内存中 .cacheOnDisk(true) //设置下载的图片是否缓存在SD卡中 .build(); //构建完成 @@ -32,8 +32,8 @@ public class GApp extends Application { public static ImageOptions xUtilsOptions = new ImageOptions.Builder()// .setIgnoreGif(false) //是否忽略GIF格式的图片 .setImageScaleType(ImageView.ScaleType.FIT_CENTER) //缩放模式 - .setLoadingDrawableId(R.mipmap.default_image) //下载中显示的图片 - .setFailureDrawableId(R.mipmap.default_image) //下载失败显示的图片 + .setLoadingDrawableId(R.drawable.ic_default_image) //下载中显示的图片 + .setFailureDrawableId(R.drawable.ic_default_image) //下载失败显示的图片 .build(); //得到ImageOptions对象 @Override diff --git a/app/src/main/java/com/lzy/imagepickerdemo/imageloader/GlideImageLoader.java b/app/src/main/java/com/lzy/imagepickerdemo/imageloader/GlideImageLoader.java index 8787f10..d8bd1df 100644 --- a/app/src/main/java/com/lzy/imagepickerdemo/imageloader/GlideImageLoader.java +++ b/app/src/main/java/com/lzy/imagepickerdemo/imageloader/GlideImageLoader.java @@ -27,8 +27,16 @@ public void displayImage(Activity activity, String path, ImageView imageView, in Glide.with(activity) //配置上下文 .load(Uri.fromFile(new File(path))) //设置图片路径(fix #8,文件名包含%符号 无法识别和显示) - .error(R.mipmap.default_image) //设置错误图片 - .placeholder(R.mipmap.default_image) //设置占位图片 + .error(R.drawable.ic_default_image) //设置错误图片 + .placeholder(R.drawable.ic_default_image) //设置占位图片 + .diskCacheStrategy(DiskCacheStrategy.ALL)//缓存全尺寸 + .into(imageView); + } + + @Override + public void displayImagePreview(Activity activity, String path, ImageView imageView, int width, int height) { + Glide.with(activity) //配置上下文 + .load(Uri.fromFile(new File(path))) //设置图片路径(fix #8,文件名包含%符号 无法识别和显示) .diskCacheStrategy(DiskCacheStrategy.ALL)//缓存全尺寸 .into(imageView); } diff --git a/app/src/main/java/com/lzy/imagepickerdemo/imageloader/PicassoImageLoader.java b/app/src/main/java/com/lzy/imagepickerdemo/imageloader/PicassoImageLoader.java index fc22d82..557360b 100644 --- a/app/src/main/java/com/lzy/imagepickerdemo/imageloader/PicassoImageLoader.java +++ b/app/src/main/java/com/lzy/imagepickerdemo/imageloader/PicassoImageLoader.java @@ -27,8 +27,18 @@ public class PicassoImageLoader implements ImageLoader { public void displayImage(Activity activity, String path, ImageView imageView, int width, int height) { Picasso.with(activity)// .load(Uri.fromFile(new File(path)))// - .placeholder(R.mipmap.default_image)// - .error(R.mipmap.default_image)// + .placeholder(R.drawable.ic_default_image)// + .error(R.drawable.ic_default_image)// + .resize(width, height)// + .centerInside()// + .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)// + .into(imageView); + } + + @Override + public void displayImagePreview(Activity activity, String path, ImageView imageView, int width, int height) { + Picasso.with(activity)// + .load(Uri.fromFile(new File(path)))// .resize(width, height)// .centerInside()// .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)// diff --git a/app/src/main/java/com/lzy/imagepickerdemo/imageloader/UILImageLoader.java b/app/src/main/java/com/lzy/imagepickerdemo/imageloader/UILImageLoader.java index f4c6435..da61f4e 100644 --- a/app/src/main/java/com/lzy/imagepickerdemo/imageloader/UILImageLoader.java +++ b/app/src/main/java/com/lzy/imagepickerdemo/imageloader/UILImageLoader.java @@ -27,6 +27,12 @@ public void displayImage(Activity activity, String path, ImageView imageView, in com.nostra13.universalimageloader.core.ImageLoader.getInstance().displayImage(Uri.fromFile(new File(path)).toString(), imageView, size); } + @Override + public void displayImagePreview(Activity activity, String path, ImageView imageView, int width, int height) { + ImageSize size = new ImageSize(width, height); + com.nostra13.universalimageloader.core.ImageLoader.getInstance().displayImage(Uri.fromFile(new File(path)).toString(), imageView, size); + } + @Override public void clearMemoryCache() { } diff --git a/app/src/main/java/com/lzy/imagepickerdemo/imageloader/XUtils3ImageLoader.java b/app/src/main/java/com/lzy/imagepickerdemo/imageloader/XUtils3ImageLoader.java index b6cf9fb..8502351 100644 --- a/app/src/main/java/com/lzy/imagepickerdemo/imageloader/XUtils3ImageLoader.java +++ b/app/src/main/java/com/lzy/imagepickerdemo/imageloader/XUtils3ImageLoader.java @@ -27,8 +27,19 @@ public class XUtils3ImageLoader implements ImageLoader { @Override public void displayImage(Activity activity, String path, ImageView imageView, int width, int height) { ImageOptions options = new ImageOptions.Builder()// - .setLoadingDrawableId(R.mipmap.default_image)// - .setFailureDrawableId(R.mipmap.default_image)// + .setLoadingDrawableId(R.drawable.ic_default_image)// + .setFailureDrawableId(R.drawable.ic_default_image)// + .setConfig(Bitmap.Config.RGB_565)// + .setSize(width, height)// + .setCrop(false)// + .setUseMemCache(true)// + .build(); + x.image().bind(imageView, Uri.fromFile(new File(path)).toString(), options); + } + + @Override + public void displayImagePreview(Activity activity, String path, ImageView imageView, int width, int height) { + ImageOptions options = new ImageOptions.Builder()// .setConfig(Bitmap.Config.RGB_565)// .setSize(width, height)// .setCrop(false)// diff --git a/imagepicker/build.gradle b/imagepicker/build.gradle index 8058d4b..8a217b1 100644 --- a/imagepicker/build.gradle +++ b/imagepicker/build.gradle @@ -9,6 +9,7 @@ android { targetSdkVersion 25 versionCode 1 versionName "1.0" + vectorDrawables.useSupportLibrary = true } buildTypes { release { diff --git a/imagepicker/src/main/AndroidManifest.xml b/imagepicker/src/main/AndroidManifest.xml index 2f7783b..16bf7ad 100644 --- a/imagepicker/src/main/AndroidManifest.xml +++ b/imagepicker/src/main/AndroidManifest.xml @@ -28,6 +28,10 @@ android:configChanges="orientation|screenSize" android:theme="@style/ImagePickerThemeFullScreen"/> + + loader, Cursor data) { if (data.getCount() > 0) { //构造所有图片的集合 ImageFolder allImagesFolder = new ImageFolder(); - allImagesFolder.name = activity.getResources().getString(R.string.all_images); + allImagesFolder.name = activity.getResources().getString(R.string.ip_all_images); allImagesFolder.path = "/"; allImagesFolder.cover = allImages.get(0); allImagesFolder.images = allImages; diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/ImagePicker.java b/imagepicker/src/main/java/com/lzy/imagepicker/ImagePicker.java index 123984a..52a2bc0 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/ImagePicker.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/ImagePicker.java @@ -9,6 +9,7 @@ import android.net.Uri; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; +import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.support.v4.content.FileProvider; @@ -352,4 +353,43 @@ private void notifyImageSelectedChanged(int position, ImageItem item, boolean is } } + /** + * 用于手机内存不足,进程被系统回收,重启时的状态恢复 + */ + public void restoreInstanceState(Bundle savedInstanceState) { + cropCacheFolder = (File) savedInstanceState.getSerializable("cropCacheFolder"); + takeImageFile = (File) savedInstanceState.getSerializable("takeImageFile"); + imageLoader = (ImageLoader) savedInstanceState.getSerializable("imageLoader"); + style = (CropImageView.Style) savedInstanceState.getSerializable("style"); + multiMode = savedInstanceState.getBoolean("multiMode"); + crop = savedInstanceState.getBoolean("crop"); + showCamera = savedInstanceState.getBoolean("showCamera"); + isSaveRectangle = savedInstanceState.getBoolean("isSaveRectangle"); + selectLimit = savedInstanceState.getInt("selectLimit"); + outPutX = savedInstanceState.getInt("outPutX"); + outPutY = savedInstanceState.getInt("outPutY"); + focusWidth = savedInstanceState.getInt("focusWidth"); + focusHeight = savedInstanceState.getInt("focusHeight"); + } + + /** + * 用于手机内存不足,进程被系统回收时的状态保存 + */ + public void saveInstanceState(Bundle outState) { + outState.putSerializable("cropCacheFolder", cropCacheFolder); + outState.putSerializable("takeImageFile", takeImageFile); + outState.putSerializable("imageLoader", imageLoader); + outState.putSerializable("style", style); + outState.putBoolean("multiMode", multiMode); + outState.putBoolean("crop", crop); + outState.putBoolean("showCamera", showCamera); + outState.putBoolean("isSaveRectangle", isSaveRectangle); + outState.putInt("selectLimit", selectLimit); + outState.putInt("outPutX", outPutX); + outState.putInt("outPutY", outPutY); + outState.putInt("focusWidth", focusWidth); + outState.putInt("focusHeight", focusHeight); + } + + } \ No newline at end of file diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImageFolderAdapter.java b/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImageFolderAdapter.java index 4493079..4a555f5 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImageFolderAdapter.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImageFolderAdapter.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.List; + /** * ================================================ * 作 者:jeasonlzy(廖子尧 Github地址:https://github.com/jeasonlzy0216 @@ -78,7 +79,7 @@ public View getView(int position, View convertView, ViewGroup parent) { ImageFolder folder = getItem(position); holder.folderName.setText(folder.name); - holder.imageCount.setText(mActivity.getString(R.string.folder_image_count, folder.images.size())); + holder.imageCount.setText(mActivity.getString(R.string.ip_folder_image_count, folder.images.size())); imagePicker.getImageLoader().displayImage(mActivity, folder.cover.path, holder.cover, mImageSize, mImageSize); if (lastSelected == position) { diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImageGridAdapter.java b/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImageGridAdapter.java deleted file mode 100644 index b8cff19..0000000 --- a/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImageGridAdapter.java +++ /dev/null @@ -1,185 +0,0 @@ -package com.lzy.imagepicker.adapter; - -import android.Manifest; -import android.app.Activity; -import android.support.v4.app.ActivityCompat; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AbsListView; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.Toast; - -import com.lzy.imagepicker.ImagePicker; -import com.lzy.imagepicker.R; -import com.lzy.imagepicker.util.Utils; -import com.lzy.imagepicker.bean.ImageItem; -import com.lzy.imagepicker.ui.ImageBaseActivity; -import com.lzy.imagepicker.ui.ImageGridActivity; -import com.lzy.imagepicker.view.SuperCheckBox; - -import java.util.ArrayList; - -/** - * ================================================ - * 作 者:jeasonlzy(廖子尧 Github地址:https://github.com/jeasonlzy0216 - * 版 本:1.0 - * 创建日期:2016/5/19 - * 描 述: - * 修订历史: - * ================================================ - */ -public class ImageGridAdapter extends BaseAdapter { - - private static final int ITEM_TYPE_CAMERA = 0; //第一个条目是相机 - private static final int ITEM_TYPE_NORMAL = 1; //第一个条目不是相机 - - private ImagePicker imagePicker; - private Activity mActivity; - private ArrayList images = new ArrayList<>(); //当前需要显示的所有的图片数据 - private ArrayList mSelectedImages; //全局保存的已经选中的图片数据 - private boolean isShowCamera; //是否显示拍照按钮 - private int mImageSize; //每个条目的大小 - private OnImageItemClickListener listener; //图片被点击的监听 - - public ImageGridAdapter(Activity activity, ArrayList images) { - this.mActivity = activity; - if (images != null) { - this.images = images; - } - - mImageSize = Utils.getImageItemWidth(mActivity); - imagePicker = ImagePicker.getInstance(); - isShowCamera = imagePicker.isShowCamera(); - mSelectedImages = imagePicker.getSelectedImages(); - } - - public void refreshData(ArrayList images) { - if (images != null) { - this.images = images; - notifyDataSetChanged(); - } - } - - @Override - public int getViewTypeCount() { - return 2; - } - - @Override - public int getItemViewType(int position) { - if (isShowCamera) return position == 0 ? ITEM_TYPE_CAMERA : ITEM_TYPE_NORMAL; - return ITEM_TYPE_NORMAL; - } - - @Override - public int getCount() { - return isShowCamera ? images.size() + 1 : images.size(); - } - - @Override - public ImageItem getItem(int position) { - if (isShowCamera) { - if (position == 0) return null; - return images.get(position - 1); - } else { - return images.get(position); - } - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(final int position, View convertView, ViewGroup parent) { - int itemViewType = getItemViewType(position); - if (itemViewType == ITEM_TYPE_CAMERA) { - convertView = LayoutInflater.from(mActivity).inflate(R.layout.adapter_camera_item, parent, false); - convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mImageSize)); //让图片是个正方形 - convertView.setTag(null); - convertView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (!((ImageBaseActivity) mActivity).checkPermission(Manifest.permission.CAMERA)) { - ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.CAMERA}, ImageGridActivity.REQUEST_PERMISSION_CAMERA); - } else { - imagePicker.takePicture(mActivity, ImagePicker.REQUEST_CODE_TAKE); - } - } - }); - } else { - final ViewHolder holder; - if (convertView == null) { - convertView = LayoutInflater.from(mActivity).inflate(R.layout.adapter_image_list_item, parent, false); - convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mImageSize)); //让图片是个正方形 - holder = new ViewHolder(convertView); - convertView.setTag(holder); - } else { - holder = (ViewHolder) convertView.getTag(); - } - final ImageItem imageItem = getItem(position); - - holder.ivThumb.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (listener != null) listener.onImageItemClick(holder.rootView, imageItem, position); - } - }); - holder.cbCheck.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - int selectLimit = imagePicker.getSelectLimit(); - if (holder.cbCheck.isChecked() && mSelectedImages.size() >= selectLimit) { - Toast.makeText(mActivity.getApplicationContext(), mActivity.getString(R.string.select_limit, selectLimit), Toast.LENGTH_SHORT).show(); - holder.cbCheck.setChecked(false); - holder.mask.setVisibility(View.GONE); - } else { - imagePicker.addSelectedImageItem(position, imageItem, holder.cbCheck.isChecked()); - holder.mask.setVisibility(View.VISIBLE); - } - } - }); - //根据是否多选,显示或隐藏checkbox - if (imagePicker.isMultiMode()) { - holder.cbCheck.setVisibility(View.VISIBLE); - boolean checked = mSelectedImages.contains(imageItem); - if (checked) { - holder.mask.setVisibility(View.VISIBLE); - holder.cbCheck.setChecked(true); - } else { - holder.mask.setVisibility(View.GONE); - holder.cbCheck.setChecked(false); - } - } else { - holder.cbCheck.setVisibility(View.GONE); - } - imagePicker.getImageLoader().displayImage(mActivity, imageItem.path, holder.ivThumb, mImageSize, mImageSize); //显示图片 - } - return convertView; - } - - private class ViewHolder { - public View rootView; - public ImageView ivThumb; - public View mask; - public SuperCheckBox cbCheck; - - public ViewHolder(View view) { - rootView = view; - ivThumb = (ImageView) view.findViewById(R.id.iv_thumb); - mask = view.findViewById(R.id.mask); - cbCheck = (SuperCheckBox) view.findViewById(R.id.cb_check); - } - } - - public void setOnImageItemClickListener(OnImageItemClickListener listener) { - this.listener = listener; - } - - public interface OnImageItemClickListener { - void onImageItemClick(View view, ImageItem imageItem, int position); - } -} \ No newline at end of file diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImagePageAdapter.java b/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImagePageAdapter.java index a9dcbe1..e6cf5ef 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImagePageAdapter.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImagePageAdapter.java @@ -55,7 +55,7 @@ public void setPhotoViewClickListener(PhotoViewClickListener listener) { public Object instantiateItem(ViewGroup container, int position) { PhotoView photoView = new PhotoView(mActivity); ImageItem imageItem = images.get(position); - imagePicker.getImageLoader().displayImage(mActivity, imageItem.path, photoView, screenWidth, screenHeight); + imagePicker.getImageLoader().displayImagePreview(mActivity, imageItem.path, photoView, screenWidth, screenHeight); photoView.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() { @Override public void onPhotoTap(View view, float x, float y) { diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImageRecyclerAdapter.java b/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImageRecyclerAdapter.java index d3a799a..2f0553e 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImageRecyclerAdapter.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/adapter/ImageRecyclerAdapter.java @@ -126,13 +126,16 @@ private class ImageViewHolder extends ViewHolder{ View rootView; ImageView ivThumb; View mask; + View checkView; SuperCheckBox cbCheck; + ImageViewHolder(View itemView) { super(itemView); rootView = itemView; ivThumb = (ImageView) itemView.findViewById(R.id.iv_thumb); mask = itemView.findViewById(R.id.mask); + checkView=itemView.findViewById(R.id.checkView); cbCheck = (SuperCheckBox) itemView.findViewById(R.id.cb_check); itemView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mImageSize)); //让图片是个正方形 } @@ -145,12 +148,13 @@ public void onClick(View v) { if (listener != null) listener.onImageItemClick(rootView, imageItem, position); } }); - cbCheck.setOnClickListener(new View.OnClickListener() { + checkView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + cbCheck.setChecked(!cbCheck.isChecked()); int selectLimit = imagePicker.getSelectLimit(); if (cbCheck.isChecked() && mSelectedImages.size() >= selectLimit) { - Toast.makeText(mActivity.getApplicationContext(), mActivity.getString(R.string.select_limit, selectLimit), Toast.LENGTH_SHORT).show(); + Toast.makeText(mActivity.getApplicationContext(), mActivity.getString(R.string.ip_select_limit, selectLimit), Toast.LENGTH_SHORT).show(); cbCheck.setChecked(false); mask.setVisibility(View.GONE); } else { diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/bean/ImageItem.java b/imagepicker/src/main/java/com/lzy/imagepicker/bean/ImageItem.java index e4cad35..7a8112d 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/bean/ImageItem.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/bean/ImageItem.java @@ -1,5 +1,8 @@ package com.lzy.imagepicker.bean; +import android.os.Parcel; +import android.os.Parcelable; + import java.io.Serializable; /** @@ -11,7 +14,7 @@ * 修订历史: * ================================================ */ -public class ImageItem implements Serializable { +public class ImageItem implements Serializable, Parcelable { public String name; //图片的名字 public String path; //图片的路径 @@ -31,4 +34,46 @@ public boolean equals(Object o) { return super.equals(o); } + + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.name); + dest.writeString(this.path); + dest.writeLong(this.size); + dest.writeInt(this.width); + dest.writeInt(this.height); + dest.writeString(this.mimeType); + dest.writeLong(this.addTime); + } + + public ImageItem() { + } + + protected ImageItem(Parcel in) { + this.name = in.readString(); + this.path = in.readString(); + this.size = in.readLong(); + this.width = in.readInt(); + this.height = in.readInt(); + this.mimeType = in.readString(); + this.addTime = in.readLong(); + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @Override + public ImageItem createFromParcel(Parcel source) { + return new ImageItem(source); + } + + @Override + public ImageItem[] newArray(int size) { + return new ImageItem[size]; + } + }; } diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/loader/ImageLoader.java b/imagepicker/src/main/java/com/lzy/imagepicker/loader/ImageLoader.java index fceb3c9..d3c2df2 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/loader/ImageLoader.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/loader/ImageLoader.java @@ -18,5 +18,7 @@ public interface ImageLoader extends Serializable { void displayImage(Activity activity, String path, ImageView imageView, int width, int height); + void displayImagePreview(Activity activity, String path, ImageView imageView, int width, int height); + void clearMemoryCache(); } diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImageBaseActivity.java b/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImageBaseActivity.java index f197143..6d84316 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImageBaseActivity.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImageBaseActivity.java @@ -11,6 +11,7 @@ import android.view.WindowManager; import android.widget.Toast; +import com.lzy.imagepicker.ImagePicker; import com.lzy.imagepicker.R; import com.lzy.imagepicker.view.SystemBarTintManager; @@ -35,7 +36,7 @@ protected void onCreate(Bundle savedInstanceState) { } tintManager = new SystemBarTintManager(this); tintManager.setStatusBarTintEnabled(true); - tintManager.setStatusBarTintResource(R.color.status_bar); //设置上方状态栏的颜色 + tintManager.setStatusBarTintResource(R.color.ip_color_primary_dark); //设置上方状态栏的颜色 } @TargetApi(19) @@ -58,4 +59,16 @@ public boolean checkPermission(@NonNull String permission) { public void showToast(String toastText) { Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_SHORT).show(); } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + ImagePicker.getInstance().restoreInstanceState(savedInstanceState); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + ImagePicker.getInstance().saveInstanceState(outState); + } } diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImageCropActivity.java b/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImageCropActivity.java index 3dfe9aa..27cabe5 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImageCropActivity.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImageCropActivity.java @@ -47,10 +47,10 @@ protected void onCreate(Bundle savedInstanceState) { //初始化View findViewById(R.id.btn_back).setOnClickListener(this); Button btn_ok = (Button) findViewById(R.id.btn_ok); - btn_ok.setText(getString(R.string.complete)); + btn_ok.setText(getString(R.string.ip_complete)); btn_ok.setOnClickListener(this); TextView tv_des = (TextView) findViewById(R.id.tv_des); - tv_des.setText(getString(R.string.photo_crop)); + tv_des.setText(getString(R.string.ip_photo_crop)); mCropImageView = (CropImageView) findViewById(R.id.cv_crop_image); mCropImageView.setOnBitmapSaveCompleteListener(this); diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImageGridActivity.java b/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImageGridActivity.java index 402f602..12974bb 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImageGridActivity.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImageGridActivity.java @@ -8,6 +8,7 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; @@ -15,7 +16,7 @@ import android.view.View; import android.widget.AdapterView; import android.widget.Button; -import android.widget.GridView; +import android.widget.TextView; import com.lzy.imagepicker.DataHolder; import com.lzy.imagepicker.ImageDataSource; @@ -26,7 +27,9 @@ import com.lzy.imagepicker.adapter.ImageRecyclerAdapter.OnImageItemClickListener; import com.lzy.imagepicker.bean.ImageFolder; import com.lzy.imagepicker.bean.ImageItem; +import com.lzy.imagepicker.util.Utils; import com.lzy.imagepicker.view.FolderPopUpWindow; +import com.lzy.imagepicker.view.GridSpacingItemDecoration; import java.util.ArrayList; import java.util.List; @@ -38,13 +41,14 @@ * 创建日期:2016/5/19 * 描 述: * 修订历史: - * + *

* 2017-03-17 - * @author nanchen - * 新增可直接传递是否裁剪参数,以及直接拍照 - * * - * ================================================ + * @author nanchen + * 新增可直接传递是否裁剪参数,以及直接拍照 + *

+ *

+ * ================================================ */ public class ImageGridActivity extends ImageBaseActivity implements ImageDataSource.OnImagesLoadedListener, OnImageItemClickListener, ImagePicker.OnImageSelectedListener, View.OnClickListener { @@ -56,15 +60,15 @@ public class ImageGridActivity extends ImageBaseActivity implements ImageDataSou private ImagePicker imagePicker; private boolean isOrigin = false; //是否选中原图 - private GridView mGridView; //图片展示控件 private View mFooterBar; //底部栏 private Button mBtnOk; //确定按钮 - private Button mBtnDir; //文件夹切换按钮 - private Button mBtnPre; //预览按钮 + private View mllDir; //文件夹切换按钮 + private TextView mtvDir; //显示当前文件夹 + private TextView mBtnPre; //预览按钮 private ImageFolderAdapter mImageFolderAdapter; //图片文件夹的适配器 private FolderPopUpWindow mFolderPopupWindow; //ImageSet的PopupWindow private List mImageFolders; //所有的图片文件夹 -// private ImageGridAdapter mImageGridAdapter; //图片九宫格展示的适配器 + // private ImageGridAdapter mImageGridAdapter; //图片九宫格展示的适配器 private boolean directPhoto = false; // 默认不是直接调取相机 private RecyclerView mRecyclerView; private ImageRecyclerAdapter mRecyclerAdapter; @@ -73,7 +77,7 @@ public class ImageGridActivity extends ImageBaseActivity implements ImageDataSou @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); - directPhoto = savedInstanceState.getBoolean(EXTRAS_TAKE_PICKERS,false); + directPhoto = savedInstanceState.getBoolean(EXTRAS_TAKE_PICKERS, false); } @Override @@ -93,9 +97,9 @@ protected void onCreate(Bundle savedInstanceState) { Intent data = getIntent(); // 新增可直接拍照 - if (data != null && data.getExtras() != null){ - directPhoto = data.getBooleanExtra(EXTRAS_TAKE_PICKERS,false); // 默认不是直接打开相机 - if (directPhoto){ + if (data != null && data.getExtras() != null) { + directPhoto = data.getBooleanExtra(EXTRAS_TAKE_PICKERS, false); // 默认不是直接打开相机 + if (directPhoto) { if (!(checkPermission(Manifest.permission.CAMERA))) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, ImageGridActivity.REQUEST_PERMISSION_CAMERA); } else { @@ -113,12 +117,12 @@ protected void onCreate(Bundle savedInstanceState) { findViewById(R.id.btn_back).setOnClickListener(this); mBtnOk = (Button) findViewById(R.id.btn_ok); mBtnOk.setOnClickListener(this); - mBtnDir = (Button) findViewById(R.id.btn_dir); - mBtnDir.setOnClickListener(this); - mBtnPre = (Button) findViewById(R.id.btn_preview); + mBtnPre = (TextView) findViewById(R.id.btn_preview); mBtnPre.setOnClickListener(this); - mGridView = (GridView) findViewById(R.id.gridview); mFooterBar = findViewById(R.id.footer_bar); + mllDir = findViewById(R.id.ll_dir); + mllDir.setOnClickListener(this); + mtvDir = (TextView) findViewById(R.id.tv_dir); if (imagePicker.isMultiMode()) { mBtnOk.setVisibility(View.VISIBLE); mBtnPre.setVisibility(View.VISIBLE); @@ -129,7 +133,7 @@ protected void onCreate(Bundle savedInstanceState) { // mImageGridAdapter = new ImageGridAdapter(this, null); mImageFolderAdapter = new ImageFolderAdapter(this, null); - mRecyclerAdapter = new ImageRecyclerAdapter(this,null); + mRecyclerAdapter = new ImageRecyclerAdapter(this, null); onImageSelected(0, null, false); @@ -139,7 +143,7 @@ protected void onCreate(Bundle savedInstanceState) { } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_STORAGE); } - }else{ + } else { new ImageDataSource(this, null, this); } } @@ -176,7 +180,7 @@ public void onClick(View v) { intent.putExtra(ImagePicker.EXTRA_RESULT_ITEMS, imagePicker.getSelectedImages()); setResult(ImagePicker.RESULT_CODE_ITEMS, intent); //多选不允许裁剪裁剪,返回数据 finish(); - } else if (id == R.id.btn_dir) { + } else if (id == R.id.ll_dir) { if (mImageFolders == null) { Log.i("ImageGridActivity", "您的手机没有图片"); return; @@ -198,7 +202,7 @@ public void onClick(View v) { intent.putExtra(ImagePicker.EXTRA_SELECTED_IMAGE_POSITION, 0); intent.putExtra(ImagePicker.EXTRA_IMAGE_ITEMS, imagePicker.getSelectedImages()); intent.putExtra(ImagePreviewActivity.ISORIGIN, isOrigin); - intent.putExtra(ImagePicker.EXTRA_FROM_ITEMS,true); + intent.putExtra(ImagePicker.EXTRA_FROM_ITEMS, true); startActivityForResult(intent, ImagePicker.REQUEST_CODE_PREVIEW); } else if (id == R.id.btn_back) { //点击返回按钮 @@ -206,7 +210,9 @@ public void onClick(View v) { } } - /** 创建弹出的ListView */ + /** + * 创建弹出的ListView + */ private void createPopupFolderList() { mFolderPopupWindow = new FolderPopUpWindow(this, mImageFolderAdapter); mFolderPopupWindow.setOnItemClickListener(new FolderPopUpWindow.OnItemClickListener() { @@ -219,9 +225,8 @@ public void onItemClick(AdapterView adapterView, View view, int position, lon if (null != imageFolder) { // mImageGridAdapter.refreshData(imageFolder.images); mRecyclerAdapter.refreshData(imageFolder.images); - mBtnDir.setText(imageFolder.name); + mtvDir.setText(imageFolder.name); } - mGridView.smoothScrollToPosition(0);//滑动到顶部 } }); mFolderPopupWindow.setMargin(mFooterBar.getHeight()); @@ -234,15 +239,14 @@ public void onImagesLoaded(List imageFolders) { if (imageFolders.size() == 0) { // mImageGridAdapter.refreshData(null); mRecyclerAdapter.refreshData(null); - } - else{ + } else { // mImageGridAdapter.refreshData(imageFolders.get(0).images); mRecyclerAdapter.refreshData(imageFolders.get(0).images); } // mImageGridAdapter.setOnImageItemClickListener(this); -// mGridView.setAdapter(mImageGridAdapter); mRecyclerAdapter.setOnImageItemClickListener(this); - mRecyclerView.setLayoutManager(new GridLayoutManager(this,3)); + mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3)); + mRecyclerView.addItemDecoration(new GridSpacingItemDecoration(3, Utils.dp2px(this, 2), false)); mRecyclerView.setAdapter(mRecyclerAdapter); mImageFolderAdapter.refreshData(imageFolders); } @@ -287,19 +291,24 @@ public void onImageItemClick(View view, ImageItem imageItem, int position) { @Override public void onImageSelected(int position, ImageItem item, boolean isAdd) { if (imagePicker.getSelectImageCount() > 0) { - mBtnOk.setText(getString(R.string.select_complete, imagePicker.getSelectImageCount(), imagePicker.getSelectLimit())); + mBtnOk.setText(getString(R.string.ip_select_complete, imagePicker.getSelectImageCount(), imagePicker.getSelectLimit())); mBtnOk.setEnabled(true); mBtnPre.setEnabled(true); + mBtnPre.setText(getResources().getString(R.string.ip_preview_count, imagePicker.getSelectImageCount())); + mBtnPre.setTextColor(ContextCompat.getColor(this, R.color.ip_text_primary_inverted)); + mBtnOk.setTextColor(ContextCompat.getColor(this, R.color.ip_text_primary_inverted)); } else { - mBtnOk.setText(getString(R.string.complete)); + mBtnOk.setText(getString(R.string.ip_complete)); mBtnOk.setEnabled(false); mBtnPre.setEnabled(false); + mBtnPre.setText(getResources().getString(R.string.ip_preview)); + mBtnPre.setTextColor(ContextCompat.getColor(this, R.color.ip_text_secondary_inverted)); + mBtnOk.setTextColor(ContextCompat.getColor(this, R.color.ip_text_secondary_inverted)); } - mBtnPre.setText(getResources().getString(R.string.preview_count, imagePicker.getSelectImageCount())); // mImageGridAdapter.notifyDataSetChanged(); // mRecyclerAdapter.notifyItemChanged(position); // 17/4/21 fix the position while click img to preview // mRecyclerAdapter.notifyItemChanged(position + (imagePicker.isShowCamera() ? 1 : 0));// 17/4/24 fix the position while click right bottom preview button - for (int i = imagePicker.isShowCamera()? 1 : 0; i < mRecyclerAdapter.getItemCount(); i++) { + for (int i = imagePicker.isShowCamera() ? 1 : 0; i < mRecyclerAdapter.getItemCount(); i++) { if (mRecyclerAdapter.getItem(i).path != null && mRecyclerAdapter.getItem(i).path.equals(item.path)) { mRecyclerAdapter.notifyItemChanged(i); return; @@ -363,7 +372,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { setResult(ImagePicker.RESULT_CODE_ITEMS, intent); //单选不需要裁剪,返回数据 finish(); } - } else if (directPhoto){ + } else if (directPhoto) { finish(); } } diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImagePreviewActivity.java b/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImagePreviewActivity.java index c0b05a2..0433585 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImagePreviewActivity.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImagePreviewActivity.java @@ -1,10 +1,13 @@ package com.lzy.imagepicker.ui; import android.content.Intent; +import android.graphics.Color; +import android.os.Build; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.text.format.Formatter; import android.view.View; +import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.Button; import android.widget.CompoundButton; @@ -13,6 +16,7 @@ import com.lzy.imagepicker.ImagePicker; import com.lzy.imagepicker.R; import com.lzy.imagepicker.bean.ImageItem; +import com.lzy.imagepicker.util.Utils; import com.lzy.imagepicker.view.SuperCheckBox; /** @@ -47,10 +51,15 @@ protected void onCreate(Bundle savedInstanceState) { bottomBar = findViewById(R.id.bottom_bar); bottomBar.setVisibility(View.VISIBLE); - + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Utils.hasVirtualNavigationBar(this)) { + View marginView = findViewById(R.id.margin_bottom); + ViewGroup.LayoutParams layoutParams = marginView.getLayoutParams(); + layoutParams.height = Utils.getNavigationBarHeight(this); + marginView.requestLayout(); + } mCbCheck = (SuperCheckBox) findViewById(R.id.cb_check); mCbOrigin = (SuperCheckBox) findViewById(R.id.cb_origin); - mCbOrigin.setText(getString(R.string.origin)); + mCbOrigin.setText(getString(R.string.ip_origin)); mCbOrigin.setOnCheckedChangeListener(this); mCbOrigin.setChecked(isOrigin); @@ -58,7 +67,7 @@ protected void onCreate(Bundle savedInstanceState) { onImageSelected(0, null, false); ImageItem item = mImageItems.get(mCurrentPosition); boolean isSelected = imagePicker.isSelect(item); - mTitleCount.setText(getString(R.string.preview_image_count, mCurrentPosition + 1, mImageItems.size())); + mTitleCount.setText(getString(R.string.ip_preview_image_count, mCurrentPosition + 1, mImageItems.size())); mCbCheck.setChecked(isSelected); //滑动ViewPager的时候,根据外界的数据改变当前的选中状态和当前的图片的位置描述文本 mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @@ -68,7 +77,7 @@ public void onPageSelected(int position) { ImageItem item = mImageItems.get(mCurrentPosition); boolean isSelected = imagePicker.isSelect(item); mCbCheck.setChecked(isSelected); - mTitleCount.setText(getString(R.string.preview_image_count, mCurrentPosition + 1, mImageItems.size())); + mTitleCount.setText(getString(R.string.ip_preview_image_count, mCurrentPosition + 1, mImageItems.size())); } }); //当点击当前选中按钮的时候,需要根据当前的选中状态添加和移除图片 @@ -78,7 +87,7 @@ public void onClick(View v) { ImageItem imageItem = mImageItems.get(mCurrentPosition); int selectLimit = imagePicker.getSelectLimit(); if (mCbCheck.isChecked() && selectedImages.size() >= selectLimit) { - Toast.makeText(ImagePreviewActivity.this, ImagePreviewActivity.this.getString(R.string.select_limit, selectLimit), Toast.LENGTH_SHORT).show(); + Toast.makeText(ImagePreviewActivity.this, ImagePreviewActivity.this.getString(R.string.ip_select_limit, selectLimit), Toast.LENGTH_SHORT).show(); mCbCheck.setChecked(false); } else { imagePicker.addSelectedImageItem(mCurrentPosition, imageItem, mCbCheck.isChecked()); @@ -94,11 +103,11 @@ public void onClick(View v) { @Override public void onImageSelected(int position, ImageItem item, boolean isAdd) { if (imagePicker.getSelectImageCount() > 0) { - mBtnOk.setText(getString(R.string.select_complete, imagePicker.getSelectImageCount(), imagePicker.getSelectLimit())); - mBtnOk.setEnabled(true); + mBtnOk.setText(getString(R.string.ip_select_complete, + String.valueOf(imagePicker.getSelectImageCount()), + String.valueOf(imagePicker.getSelectLimit()))); } else { - mBtnOk.setText(getString(R.string.complete)); - mBtnOk.setEnabled(false); + mBtnOk.setText(getString(R.string.ip_complete)); } if (mCbOrigin.isChecked()) { @@ -106,7 +115,7 @@ public void onImageSelected(int position, ImageItem item, boolean isAdd) { for (ImageItem imageItem : selectedImages) size += imageItem.size; String fileSize = Formatter.formatFileSize(this, size); - mCbOrigin.setText(getString(R.string.origin_size, fileSize)); + mCbOrigin.setText(getString(R.string.ip_origin_size, fileSize)); } } @@ -114,10 +123,16 @@ public void onImageSelected(int position, ImageItem item, boolean isAdd) { public void onClick(View v) { int id = v.getId(); if (id == R.id.btn_ok) { + if (imagePicker.getSelectedImages().size() == 0) { + mCbCheck.setChecked(true); + ImageItem imageItem = mImageItems.get(mCurrentPosition); + imagePicker.addSelectedImageItem(mCurrentPosition, imageItem, mCbCheck.isChecked()); + } Intent intent = new Intent(); intent.putExtra(ImagePicker.EXTRA_RESULT_ITEMS, imagePicker.getSelectedImages()); setResult(ImagePicker.RESULT_CODE_ITEMS, intent); finish(); + } else if (id == R.id.btn_back) { Intent intent = new Intent(); intent.putExtra(ImagePreviewActivity.ISORIGIN, isOrigin); @@ -145,10 +160,10 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { size += item.size; String fileSize = Formatter.formatFileSize(this, size); isOrigin = true; - mCbOrigin.setText(getString(R.string.origin_size, fileSize)); + mCbOrigin.setText(getString(R.string.ip_origin_size, fileSize)); } else { isOrigin = false; - mCbOrigin.setText(getString(R.string.origin)); + mCbOrigin.setText(getString(R.string.ip_origin)); } } } @@ -159,7 +174,9 @@ protected void onDestroy() { super.onDestroy(); } - /** 单击时,隐藏头和尾 */ + /** + * 单击时,隐藏头和尾 + */ @Override public void onImageSingleTap() { if (topBar.getVisibility() == View.VISIBLE) { @@ -167,7 +184,7 @@ public void onImageSingleTap() { bottomBar.setAnimation(AnimationUtils.loadAnimation(this, R.anim.fade_out)); topBar.setVisibility(View.GONE); bottomBar.setVisibility(View.GONE); - tintManager.setStatusBarTintResource(R.color.transparent);//通知栏所需颜色 + tintManager.setStatusBarTintResource(Color.TRANSPARENT);//通知栏所需颜色 //给最外层布局加上这个属性表示,Activity全屏显示,且状态栏被隐藏覆盖掉。 // if (Build.VERSION.SDK_INT >= 16) content.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); } else { @@ -175,7 +192,7 @@ public void onImageSingleTap() { bottomBar.setAnimation(AnimationUtils.loadAnimation(this, R.anim.fade_in)); topBar.setVisibility(View.VISIBLE); bottomBar.setVisibility(View.VISIBLE); - tintManager.setStatusBarTintResource(R.color.status_bar);//通知栏所需颜色 + tintManager.setStatusBarTintResource(R.color.ip_color_primary_dark);//通知栏所需颜色 //Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住 // if (Build.VERSION.SDK_INT >= 16) content.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImagePreviewBaseActivity.java b/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImagePreviewBaseActivity.java index 9f3d1b6..894a699 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImagePreviewBaseActivity.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImagePreviewBaseActivity.java @@ -90,9 +90,21 @@ public void OnPhotoTapListener(View view, float v, float v1) { mViewPager.setCurrentItem(mCurrentPosition, false); //初始化当前页面的状态 - mTitleCount.setText(getString(R.string.preview_image_count, mCurrentPosition + 1, mImageItems.size())); + mTitleCount.setText(getString(R.string.ip_preview_image_count, mCurrentPosition + 1, mImageItems.size())); } /** 单击时,隐藏头和尾 */ public abstract void onImageSingleTap(); + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + ImagePicker.getInstance().restoreInstanceState(savedInstanceState); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + ImagePicker.getInstance().saveInstanceState(outState); + } } \ No newline at end of file diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImagePreviewDelActivity.java b/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImagePreviewDelActivity.java index 224c1a4..5d2f1cf 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImagePreviewDelActivity.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/ui/ImagePreviewDelActivity.java @@ -2,6 +2,7 @@ import android.content.DialogInterface; import android.content.Intent; +import android.graphics.Color; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v7.app.AlertDialog; @@ -32,13 +33,13 @@ protected void onCreate(Bundle savedInstanceState) { mBtnDel.setVisibility(View.VISIBLE); topBar.findViewById(R.id.btn_back).setOnClickListener(this); - mTitleCount.setText(getString(R.string.preview_image_count, mCurrentPosition + 1, mImageItems.size())); + mTitleCount.setText(getString(R.string.ip_preview_image_count, mCurrentPosition + 1, mImageItems.size())); //滑动ViewPager的时候,根据外界的数据改变当前的选中状态和当前的图片的位置描述文本 mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { mCurrentPosition = position; - mTitleCount.setText(getString(R.string.preview_image_count, mCurrentPosition + 1, mImageItems.size())); + mTitleCount.setText(getString(R.string.ip_preview_image_count, mCurrentPosition + 1, mImageItems.size())); } }); } @@ -67,7 +68,7 @@ public void onClick(DialogInterface dialog, int which) { if (mImageItems.size() > 0) { mAdapter.setData(mImageItems); mAdapter.notifyDataSetChanged(); - mTitleCount.setText(getString(R.string.preview_image_count, mCurrentPosition + 1, mImageItems.size())); + mTitleCount.setText(getString(R.string.ip_preview_image_count, mCurrentPosition + 1, mImageItems.size())); } else { onBackPressed(); } @@ -92,13 +93,13 @@ public void onImageSingleTap() { if (topBar.getVisibility() == View.VISIBLE) { topBar.setAnimation(AnimationUtils.loadAnimation(this, com.lzy.imagepicker.R.anim.top_out)); topBar.setVisibility(View.GONE); - tintManager.setStatusBarTintResource(com.lzy.imagepicker.R.color.transparent);//通知栏所需颜色 + tintManager.setStatusBarTintResource(Color.TRANSPARENT);//通知栏所需颜色 //给最外层布局加上这个属性表示,Activity全屏显示,且状态栏被隐藏覆盖掉。 // if (Build.VERSION.SDK_INT >= 16) content.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); } else { topBar.setAnimation(AnimationUtils.loadAnimation(this, com.lzy.imagepicker.R.anim.top_in)); topBar.setVisibility(View.VISIBLE); - tintManager.setStatusBarTintResource(com.lzy.imagepicker.R.color.status_bar);//通知栏所需颜色 + tintManager.setStatusBarTintResource(R.color.ip_color_primary_dark);//通知栏所需颜色 //Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住 // if (Build.VERSION.SDK_INT >= 16) content.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/util/Utils.java b/imagepicker/src/main/java/com/lzy/imagepicker/util/Utils.java index aff208a..c25d777 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/util/Utils.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/util/Utils.java @@ -2,8 +2,15 @@ import android.app.Activity; import android.content.Context; +import android.os.Build; import android.os.Environment; import android.util.DisplayMetrics; +import android.util.TypedValue; +import android.view.Display; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; +import android.view.ViewConfiguration; +import android.view.WindowManager; /** * ================================================ @@ -56,4 +63,52 @@ public static DisplayMetrics getScreenPix(Activity activity) { return displaysMetrics; } + /** dp转px */ + public static int dp2px(Context context, float dpVal) { + return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, + dpVal, context.getResources().getDisplayMetrics()); + } + + /** + * 判断手机是否含有虚拟按键 99% + * + */ + public static boolean hasVirtualNavigationBar(Context context) { + boolean hasSoftwareKeys = true; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + Display d = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); + + DisplayMetrics realDisplayMetrics = new DisplayMetrics(); + d.getRealMetrics(realDisplayMetrics); + + int realHeight = realDisplayMetrics.heightPixels; + int realWidth = realDisplayMetrics.widthPixels; + + DisplayMetrics displayMetrics = new DisplayMetrics(); + d.getMetrics(displayMetrics); + + int displayHeight = displayMetrics.heightPixels; + int displayWidth = displayMetrics.widthPixels; + + hasSoftwareKeys = (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0; + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey(); + boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); + hasSoftwareKeys = !hasMenuKey && !hasBackKey; + } + + return hasSoftwareKeys; + } + + /** + * 获取导航栏高度,有些没有虚拟导航栏的手机也能获取到,建议先判断是否有虚拟按键 + */ + public static int getNavigationBarHeight(Context context) { + int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android"); + return resourceId > 0 ? + context.getResources().getDimensionPixelSize(resourceId) : + 0; + } + } diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/view/GridSpacingItemDecoration.java b/imagepicker/src/main/java/com/lzy/imagepicker/view/GridSpacingItemDecoration.java new file mode 100644 index 0000000..45ceaaa --- /dev/null +++ b/imagepicker/src/main/java/com/lzy/imagepicker/view/GridSpacingItemDecoration.java @@ -0,0 +1,46 @@ +package com.lzy.imagepicker.view; + +import android.graphics.Rect; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +/** + * author : zchu + * date : 2017/8/30 + * desc : 为Recyclerview 的GridLayoutManager添加列间距 + */ + +public class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { + + private int spanCount; + private int spacing; + private boolean includeEdge; + + public GridSpacingItemDecoration(int spanCount, int spacing, boolean includeEdge) { + this.spanCount = spanCount; + this.spacing = spacing; + this.includeEdge = includeEdge; + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + int position = parent.getChildAdapterPosition(view); // item position + int column = position % spanCount; // item column + + if (includeEdge) { + outRect.left = spacing - column * spacing / spanCount; // spacing - column * ((1f / spanCount) * spacing) + outRect.right = (column + 1) * spacing / spanCount; // (column + 1) * ((1f / spanCount) * spacing) + + if (position < spanCount) { // top edge + outRect.top = spacing; + } + outRect.bottom = spacing; // item bottom + } else { + outRect.left = column * spacing / spanCount; // column * ((1f / spanCount) * spacing) + outRect.right = spacing - (column + 1) * spacing / spanCount; // spacing - (column + 1) * ((1f / spanCount) * spacing) + if (position >= spanCount) { + outRect.top = spacing; // item top + } + } + } +} diff --git a/imagepicker/src/main/java/com/lzy/imagepicker/view/SuperCheckBox.java b/imagepicker/src/main/java/com/lzy/imagepicker/view/SuperCheckBox.java index a9a84a4..c268264 100644 --- a/imagepicker/src/main/java/com/lzy/imagepicker/view/SuperCheckBox.java +++ b/imagepicker/src/main/java/com/lzy/imagepicker/view/SuperCheckBox.java @@ -1,9 +1,9 @@ package com.lzy.imagepicker.view; import android.content.Context; +import android.support.v7.widget.AppCompatCheckBox; import android.util.AttributeSet; import android.view.SoundEffectConstants; -import android.widget.CheckBox; /** * ================================================ @@ -14,7 +14,7 @@ * 修订历史: * ================================================ */ -public class SuperCheckBox extends CheckBox { +public class SuperCheckBox extends AppCompatCheckBox { public SuperCheckBox(Context context) { super(context); diff --git a/imagepicker/src/main/res/anim/bottom_in.xml b/imagepicker/src/main/res/anim/bottom_in.xml deleted file mode 100644 index c873951..0000000 --- a/imagepicker/src/main/res/anim/bottom_in.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/imagepicker/src/main/res/anim/bottom_out.xml b/imagepicker/src/main/res/anim/bottom_out.xml deleted file mode 100644 index dbe1d4b..0000000 --- a/imagepicker/src/main/res/anim/bottom_out.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - \ No newline at end of file diff --git a/imagepicker/src/main/res/anim/left_in.xml b/imagepicker/src/main/res/anim/left_in.xml deleted file mode 100644 index 2c6203a..0000000 --- a/imagepicker/src/main/res/anim/left_in.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - diff --git a/imagepicker/src/main/res/anim/left_out.xml b/imagepicker/src/main/res/anim/left_out.xml deleted file mode 100644 index 85f5c1b..0000000 --- a/imagepicker/src/main/res/anim/left_out.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - \ No newline at end of file diff --git a/imagepicker/src/main/res/anim/right_in.xml b/imagepicker/src/main/res/anim/right_in.xml deleted file mode 100644 index d0a507d..0000000 --- a/imagepicker/src/main/res/anim/right_in.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - diff --git a/imagepicker/src/main/res/anim/right_out.xml b/imagepicker/src/main/res/anim/right_out.xml deleted file mode 100644 index a6d2312..0000000 --- a/imagepicker/src/main/res/anim/right_out.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - \ No newline at end of file diff --git a/imagepicker/src/main/res/anim/scale_in.xml b/imagepicker/src/main/res/anim/scale_in.xml deleted file mode 100644 index 142e497..0000000 --- a/imagepicker/src/main/res/anim/scale_in.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - \ No newline at end of file diff --git a/imagepicker/src/main/res/anim/scale_out.xml b/imagepicker/src/main/res/anim/scale_out.xml deleted file mode 100644 index 7bb3446..0000000 --- a/imagepicker/src/main/res/anim/scale_out.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - \ No newline at end of file diff --git a/imagepicker/src/main/res/drawable-v21/bg_folder_item.xml b/imagepicker/src/main/res/drawable-v21/bg_folder_item.xml new file mode 100644 index 0000000..416bbfc --- /dev/null +++ b/imagepicker/src/main/res/drawable-v21/bg_folder_item.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/imagepicker/src/main/res/drawable-xxhdpi/bg_btn_dis.9.png b/imagepicker/src/main/res/drawable-xxhdpi/bg_btn_dis.9.png deleted file mode 100644 index 1fa5440..0000000 Binary files a/imagepicker/src/main/res/drawable-xxhdpi/bg_btn_dis.9.png and /dev/null differ diff --git a/imagepicker/src/main/res/drawable-xxhdpi/bg_btn_nor.9.png b/imagepicker/src/main/res/drawable-xxhdpi/bg_btn_nor.9.png deleted file mode 100644 index 8fdc238..0000000 Binary files a/imagepicker/src/main/res/drawable-xxhdpi/bg_btn_nor.9.png and /dev/null differ diff --git a/imagepicker/src/main/res/drawable-xxhdpi/bg_btn_pre.9.png b/imagepicker/src/main/res/drawable-xxhdpi/bg_btn_pre.9.png deleted file mode 100644 index c73edf3..0000000 Binary files a/imagepicker/src/main/res/drawable-xxhdpi/bg_btn_pre.9.png and /dev/null differ diff --git a/imagepicker/src/main/res/drawable/bg_btn_dis.xml b/imagepicker/src/main/res/drawable/bg_btn_dis.xml new file mode 100644 index 0000000..cfe2cf6 --- /dev/null +++ b/imagepicker/src/main/res/drawable/bg_btn_dis.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/imagepicker/src/main/res/drawable/bg_btn_nor.xml b/imagepicker/src/main/res/drawable/bg_btn_nor.xml new file mode 100644 index 0000000..f32cece --- /dev/null +++ b/imagepicker/src/main/res/drawable/bg_btn_nor.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/imagepicker/src/main/res/drawable/bg_btn_pre.xml b/imagepicker/src/main/res/drawable/bg_btn_pre.xml new file mode 100644 index 0000000..59dadf2 --- /dev/null +++ b/imagepicker/src/main/res/drawable/bg_btn_pre.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/imagepicker/src/main/res/drawable/bg_folder_item.xml b/imagepicker/src/main/res/drawable/bg_folder_item.xml new file mode 100644 index 0000000..41dcd10 --- /dev/null +++ b/imagepicker/src/main/res/drawable/bg_folder_item.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/imagepicker/src/main/res/drawable/bg_image_folder.xml b/imagepicker/src/main/res/drawable/bg_image_folder.xml new file mode 100644 index 0000000..e97e927 --- /dev/null +++ b/imagepicker/src/main/res/drawable/bg_image_folder.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/imagepicker/src/main/res/drawable/ic_arrow_back.xml b/imagepicker/src/main/res/drawable/ic_arrow_back.xml new file mode 100644 index 0000000..38fbc26 --- /dev/null +++ b/imagepicker/src/main/res/drawable/ic_arrow_back.xml @@ -0,0 +1,9 @@ + + + diff --git a/imagepicker/src/main/res/drawable/ic_default_image.xml b/imagepicker/src/main/res/drawable/ic_default_image.xml new file mode 100644 index 0000000..f9836ab --- /dev/null +++ b/imagepicker/src/main/res/drawable/ic_default_image.xml @@ -0,0 +1,8 @@ + + + + diff --git a/imagepicker/src/main/res/drawable/ic_vector_check.xml b/imagepicker/src/main/res/drawable/ic_vector_check.xml new file mode 100644 index 0000000..807fa02 --- /dev/null +++ b/imagepicker/src/main/res/drawable/ic_vector_check.xml @@ -0,0 +1,9 @@ + + + diff --git a/imagepicker/src/main/res/drawable/ic_vector_delete.xml b/imagepicker/src/main/res/drawable/ic_vector_delete.xml new file mode 100644 index 0000000..7fcb8c0 --- /dev/null +++ b/imagepicker/src/main/res/drawable/ic_vector_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/imagepicker/src/main/res/drawable/selector_back_press.xml b/imagepicker/src/main/res/drawable/selector_back_press.xml index 3d7814f..35bd783 100644 --- a/imagepicker/src/main/res/drawable/selector_back_press.xml +++ b/imagepicker/src/main/res/drawable/selector_back_press.xml @@ -1,9 +1,9 @@ - - - + + + diff --git a/imagepicker/src/main/res/drawable/selector_grid_camera_bg.xml b/imagepicker/src/main/res/drawable/selector_grid_camera_bg.xml index 8246fbc..2a15899 100644 --- a/imagepicker/src/main/res/drawable/selector_grid_camera_bg.xml +++ b/imagepicker/src/main/res/drawable/selector_grid_camera_bg.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/imagepicker/src/main/res/layout/activity_image_grid.xml b/imagepicker/src/main/res/layout/activity_image_grid.xml index 6c89dcd..f085126 100644 --- a/imagepicker/src/main/res/layout/activity_image_grid.xml +++ b/imagepicker/src/main/res/layout/activity_image_grid.xml @@ -1,6 +1,5 @@ - + layout="@layout/include_top_bar" /> - - + android:paddingTop="2dp" /> + android:background="@color/ip_color_primary"> -