package com.anthony.imagepicker.ui; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.util.Log; import android.view.Gravity; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.GridView; import com.anthony.imagepicker.ImageDataSource; import com.anthony.imagepicker.ImagePicker; import com.anthony.imagepicker.R; import com.anthony.imagepicker.adapter.ImageFolderAdapter; import com.anthony.imagepicker.adapter.ImageGridAdapter; import com.anthony.imagepicker.bean.ImageFolder; import com.anthony.imagepicker.bean.ImageItem; import com.anthony.imagepicker.view.FolderPopUpWindow; import java.util.List; /** * ================================================ * 作 者:jeasonlzy(廖子尧 Github地址:https://github.com/jeasonlzy0216 * 版 本:1.0 * 创建日期:2016/5/19 * 描 述: * 修订历史: * ================================================ */ public class ImageGridActivity extends ImageBaseActivity implements ImageDataSource.OnImagesLoadedListener, ImageGridAdapter.OnImageItemClickListener, ImagePicker.OnImageSelectedListener, View.OnClickListener { public static final int REQUEST_PERMISSION_STORAGE = 0x01; public static final int REQUEST_PERMISSION_CAMERA = 0x02; private ImagePicker imagePicker; private boolean isOrigin = false; //是否选中原图 private GridView mGridView; //图片展示控件 private View mFooterBar; //底部栏 private Button mBtnOk; //确定按钮 private Button mBtnDir; //文件夹切换按钮 private Button mBtnPre; //预览按钮 private ImageFolderAdapter mImageFolderAdapter; //图片文件夹的适配器 private FolderPopUpWindow mFolderPopupWindow; //ImageSet的PopupWindow private List<ImageFolder> mImageFolders; //所有的图片文件夹 private ImageGridAdapter mImageGridAdapter; //图片九宫格展示的适配器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_image_grid); imagePicker = ImagePicker.getInstance(); imagePicker.clear(); imagePicker.addOnImageSelectedListener(this); 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.setOnClickListener(this); mGridView = (GridView) findViewById(R.id.gridview); mFooterBar = findViewById(R.id.footer_bar); if (imagePicker.isMultiMode()) { mBtnOk.setVisibility(View.VISIBLE); mBtnPre.setVisibility(View.VISIBLE); } else { mBtnOk.setVisibility(View.GONE); mBtnPre.setVisibility(View.GONE); } mImageGridAdapter = new ImageGridAdapter(this, null); mImageFolderAdapter = new ImageFolderAdapter(this, null); onImageSelected(0, null, false); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { if (checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { new ImageDataSource(this, null, this); } else { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_STORAGE); } } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_PERMISSION_STORAGE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { new ImageDataSource(this, null, this); } else { showToast("权限被禁止,无法选择本地图片"); } } else if (requestCode == REQUEST_PERMISSION_CAMERA) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { imagePicker.takePicture(this, ImagePicker.REQUEST_CODE_TAKE); } else { showToast("权限被禁止,无法打开相机"); } } } @Override protected void onDestroy() { imagePicker.removeOnImageSelectedListener(this); super.onDestroy(); } @Override public void onClick(View v) { int id = v.getId(); if (id == R.id.btn_ok) { 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_dir) { if (mImageFolders == null) { Log.i("ImageGridActivity", "您的手机没有图片"); return; } //点击文件夹按钮 createPopupFolderList(); mImageFolderAdapter.refreshData(mImageFolders); //刷新数据 if (mFolderPopupWindow.isShowing()) { mFolderPopupWindow.dismiss(); } else { mFolderPopupWindow.showAtLocation(mFooterBar, Gravity.NO_GRAVITY, 0, 0); //默认选择当前选择的上一个,当目录很多时,直接定位到已选中的条目 int index = mImageFolderAdapter.getSelectIndex(); index = index == 0 ? index : index - 1; mFolderPopupWindow.setSelection(index); } } else if (id == R.id.btn_preview) { Intent intent = new Intent(ImageGridActivity.this, ImagePreviewActivity.class); intent.putExtra(ImagePicker.EXTRA_SELECTED_IMAGE_POSITION, 0); intent.putExtra(ImagePicker.EXTRA_IMAGE_ITEMS, imagePicker.getSelectedImages()); intent.putExtra(ImagePreviewActivity.ISORIGIN, isOrigin); startActivityForResult(intent, ImagePicker.REQUEST_CODE_PREVIEW); } else if (id == R.id.btn_back) { //点击返回按钮 finish(); } } /** 创建弹出的ListView */ private void createPopupFolderList() { mFolderPopupWindow = new FolderPopUpWindow(this, mImageFolderAdapter); mFolderPopupWindow.setOnItemClickListener(new FolderPopUpWindow.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { mImageFolderAdapter.setSelectIndex(position); imagePicker.setCurrentImageFolderPosition(position); mFolderPopupWindow.dismiss(); ImageFolder imageFolder = (ImageFolder) adapterView.getAdapter().getItem(position); if (null != imageFolder) { mImageGridAdapter.refreshData(imageFolder.images); mBtnDir.setText(imageFolder.name); } mGridView.smoothScrollToPosition(0);//滑动到顶部 } }); mFolderPopupWindow.setMargin(mFooterBar.getHeight()); } @Override public void onImagesLoaded(List<ImageFolder> imageFolders) { this.mImageFolders = imageFolders; imagePicker.setImageFolders(imageFolders); if (imageFolders.size() == 0) mImageGridAdapter.refreshData(null); else mImageGridAdapter.refreshData(imageFolders.get(0).images); mImageGridAdapter.setOnImageItemClickListener(this); mGridView.setAdapter(mImageGridAdapter); mImageFolderAdapter.refreshData(imageFolders); } @Override public void onImageItemClick(View view, ImageItem imageItem, int position) { //根据是否有相机按钮确定位置 position = imagePicker.isShowCamera() ? position - 1 : position; if (imagePicker.isMultiMode()) { Intent intent = new Intent(ImageGridActivity.this, ImagePreviewActivity.class); intent.putExtra(ImagePicker.EXTRA_SELECTED_IMAGE_POSITION, position); intent.putExtra(ImagePicker.EXTRA_IMAGE_ITEMS, imagePicker.getCurrentImageFolderItems()); intent.putExtra(ImagePreviewActivity.ISORIGIN, isOrigin); startActivityForResult(intent, ImagePicker.REQUEST_CODE_PREVIEW); //如果是多选,点击图片进入预览界面 } else { imagePicker.clearSelectedImages(); imagePicker.addSelectedImageItem(position, imagePicker.getCurrentImageFolderItems().get(position), true); if (imagePicker.isCrop()) { Intent intent = new Intent(ImageGridActivity.this, ImageCropActivity.class); startActivityForResult(intent, ImagePicker.REQUEST_CODE_CROP); //单选需要裁剪,进入裁剪界面 } else { Intent intent = new Intent(); intent.putExtra(ImagePicker.EXTRA_RESULT_ITEMS, imagePicker.getSelectedImages()); setResult(ImagePicker.RESULT_CODE_ITEMS, intent); //单选不需要裁剪,返回数据 finish(); } } } @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); mBtnPre.setEnabled(true); } else { mBtnOk.setText(getString(R.string.complete)); mBtnOk.setEnabled(false); mBtnPre.setEnabled(false); } mBtnPre.setText(getResources().getString(R.string.preview_count, imagePicker.getSelectImageCount())); mImageGridAdapter.notifyDataSetChanged(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (data != null) { if (resultCode == ImagePicker.RESULT_CODE_BACK) { isOrigin = data.getBooleanExtra(ImagePreviewActivity.ISORIGIN, false); } else { //从拍照界面返回 //点击 X , 没有选择照片 if (data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS) == null) { //什么都不做 } else { //说明是从裁剪页面过来的数据,直接返回就可以 setResult(ImagePicker.RESULT_CODE_ITEMS, data); finish(); } } } else { //如果是裁剪,因为裁剪指定了存储的Uri,所以返回的data一定为null if (resultCode == RESULT_OK && requestCode == ImagePicker.REQUEST_CODE_TAKE) { //发送广播通知图片增加了 ImagePicker.galleryAddPic(this, imagePicker.getTakeImageFile()); ImageItem imageItem = new ImageItem(); imageItem.path = imagePicker.getTakeImageFile().getAbsolutePath(); imagePicker.clearSelectedImages(); imagePicker.addSelectedImageItem(0, imageItem, true); if (imagePicker.isCrop()) { Intent intent = new Intent(ImageGridActivity.this, ImageCropActivity.class); startActivityForResult(intent, ImagePicker.REQUEST_CODE_CROP); //单选需要裁剪,进入裁剪界面 } else { Intent intent = new Intent(); intent.putExtra(ImagePicker.EXTRA_RESULT_ITEMS, imagePicker.getSelectedImages()); setResult(ImagePicker.RESULT_CODE_ITEMS, intent); //单选不需要裁剪,返回数据 finish(); } } } } }