因为需要上传图片,选择图片的效果微信效果很好,所以我在网上找了一些仿微信的例子,但是都不是很全,所以我找了几个并和在一起,效果还行,不废话了上代码.
首先,是一个九宫格显示图片的页面.因为我的代码是fragment嵌套在Activity中的所以主要代码是在fragment中:
MutiPictureFragment布局:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="50dp"
android:layout_marginBottom="40dp"
>
<GridView
android:id="@+id/noScrollgridview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none"
android:numColumns="3"
android:layout_centerInParent="true"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:gravity="center"
android:verticalSpacing="20dp"
android:horizontalSpacing="10dp"
android:columnWidth="75dp"
/>
</RelativeLayout>
MutiPictureFragment代码:
public class MutiPictureFragment extends Fragment {
public static Bitmap mBimap;
private GridAdapter mAdapter;
private GridView mGridView ;
public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {
/*进行图片的初始化*/
mBimap = BitmapFactory.decodeResource(getResources(), R.drawable.icon_addpic_unfocused);
Res.init(getActivity());
PublicWay.activityList.add(getActivity());
View view = inflater.inflate(R.layout.fragment_muti_picture, container, false);
initView(view);
return view;
}
private void initView(View view) {
mGridView = (GridView)view.findViewById(R.id.gridview);
mAdapter = new GridAdapter(getActivity());
mGridView.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
if (arg2 == Bimp.tempSelectBitmap.size()) {
Intent intent = new Intent(getActivity(), MultiImageSelectorActivity.class);
startActivityForResult(intent, 22);
} else {
Intent intent = new Intent(getActivity(), GalleryActivity.class);
intent.putExtra("position", "1");
intent.putExtra("ID", arg2);
startActivityForResult(intent, 11);
}
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 22 && resultCode == Activity.RESULT_OK){
if (Bimp.tempSelectBitmap.size() == Bimp.max) {
mAdapter.notifyDataSetChanged();
} else {
Bimp.max += 1;
mAdapter.notifyDataSetChanged();
}
}else if (requestCode == 11){
if (Bimp.tempSelectBitmap.size() == Bimp.max) {
mAdapter.notifyDataSetChanged();
} else {
Bimp.max += 1;
mAdapter.notifyDataSetChanged();
}
}
}
@SuppressLint("HandlerLeak")
public class GridAdapter extends BaseAdapter {
private int selectedPosition = -1;
private boolean shape;
public boolean isShape() {
return shape;
}
public void setShape(boolean shape) {
this.shape = shape;
}
public GridAdapter(Context context) {
}
public int getCount() {
return (Bimp.tempSelectBitmap.size() + 1);
}
public Object getItem(int arg0) {
return null;
}
public long getItemId(int arg0) {
return arg0;
}
public void setSelectedPosition(int position) {
selectedPosition = position;
}
public int getSelectedPosition() {
return selectedPosition;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = getActivity().getLayoutInflater().inflate(R.layout.item_published_grida, null);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.image = (NPRoundAngleImageView) convertView.findViewById(R.id.item_grida_image);
int width = NPProportion.sharedInstance().getPictureWidth(getActivity(),100);
int height = NPProportion.sharedInstance().getPictureHeight(width);
LinearLayout.LayoutParams divideLayoutParams = new LinearLayout.LayoutParams(width,height);
holder.image.setLayoutParams(divideLayoutParams);
if (position == Bimp.tempSelectBitmap.size()) {
holder.image.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.icon_addpic_unfocused));
/*位置到第几个的时候加号消失*/
if (position == 9) {
holder.image.setVisibility(View.GONE);
}
} else {
holder.image.setImageBitmap(Bimp.tempSelectBitmap.get(position).getBitmap());
}
return convertView;
}
public class ViewHolder {
public NPRoundAngleImageView image;
}
}
}
图库显示页面:
package me.nereo.multi_image_selector;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Bitmap;
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;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v7.widget.ListPopupWindow;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.squareup.picasso.Picasso;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import me.nereo.multi_image_selector.adapter.FolderAdapter;
import me.nereo.multi_image_selector.adapter.ImageGridAdapter;
import me.nereo.multi_image_selector.bean.Folder;
import me.nereo.multi_image_selector.bean.Image;
import me.nereo.multi_image_selector.gallery.Bimp;
import me.nereo.multi_image_selector.utils.FileUtils;
import me.nereo.multi_image_selector.utils.TimeUtils;
/**
* 图片选择Fragment
* Created by Nereo on 2015/4/7.
*/
public class MultiImageSelectorFragment extends Fragment {
private static final String TAG = "MultiImageSelector";
/** 最大图片选择次数,int类型 */
public static final String EXTRA_SELECT_COUNT = "max_select_count";
/** 图片选择模式,int类型 */
public static final String EXTRA_SELECT_MODE = "select_count_mode";
/** 是否显示相机,boolean类型 */
public static final String EXTRA_SHOW_CAMERA = "show_camera";
/** 默认选择的数据集 */
public static final String EXTRA_DEFAULT_SELECTED_LIST = "default_result";
/** 单选 */
public static final int MODE_SINGLE = 0;
/** 多选 */
public static final int MODE_MULTI = 1;
// 不同loader定义
private static final int LOADER_ALL = 0;
private static final int LOADER_CATEGORY = 1;
// 请求加载系统照相机
private static final int TAKE_PICTURE = 0x000001;
private int mDefaultCount = 30;
// 结果数据
// private ArrayList<String> resultList = new ArrayList<>();
// 文件夹数据
private ArrayList<Folder> mResultFolder = new ArrayList<>();
// 图片Grid
private GridView mGridView;
private ImageGridAdapter mImageAdapter;
private FolderAdapter mFolderAdapter;
private ListPopupWindow mFolderPopupWindow;
// 时间线
private TextView mTimeLineText;
// 类别
private Button mCategoryText;
// 预览按钮
private Button mPreviewBtn;
// 底部View
private View mPopupAnchorView;
private boolean hasFolderGened = false;
private boolean mIsShowCamera = true;
private int mGridWidth, mGridHeight;
private File mTmpFile;
private Intent intent;
private Button mSubmitButton;
public List<Image> mImageList;//临时图片列表
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_multi_image, container, false);
initView(view);
return view;
}
private void initView(View view) {
// 是否显示照相机
mImageAdapter = new ImageGridAdapter(getActivity(), mIsShowCamera);
mImageAdapter.setDefaultSelected(Bimp.tempSelectBitmap);
// 是否显示选择指示器
mImageAdapter.showSelectIndicator(true);
mPopupAnchorView = view.findViewById(R.id.footer);
mImageList = new ArrayList<>();
mTimeLineText = (TextView) view.findViewById(R.id.timeline_area);
// 初始化,先隐藏当前timeline
mTimeLineText.setVisibility(View.GONE);
mCategoryText = (Button) view.findViewById(R.id.category_btn);
// 初始化,加载所有图片
mCategoryText.setText(R.string.folder_all);
mCategoryText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mFolderPopupWindow == null) {
createPopupFolderList(mGridWidth, mGridHeight);
}
if (mFolderPopupWindow.isShowing()) {
mFolderPopupWindow.dismiss();
} else {
mFolderPopupWindow.show();
int index = mFolderAdapter.getSelectIndex();
index = index == 0 ? index : index - 1;
mFolderPopupWindow.getListView().setSelection(index);
}
}
});
//预览
mPreviewBtn = (Button) view.findViewById(R.id.preview);
// 完成按钮
mSubmitButton = (Button) view.findViewById(R.id.commit);
// 初始化,按钮状态初始化
if(Bimp.tempSelectBitmap == null || Bimp.tempSelectBitmap.size()<=0){
mPreviewBtn.setText(R.string.preview);
mPreviewBtn.setEnabled(false);
mSubmitButton.setEnabled(false);
mSubmitButton.setText(getResources().getString(R.string.finish));
}else {
mPreviewBtn.setEnabled(true);
mPreviewBtn.setText(getResources().getString(R.string.preview) + "(" + Bimp.tempSelectBitmap.size() + ")");
mSubmitButton.setEnabled(true);
mSubmitButton.setText(getResources().getString(R.string.finish)+"(" + Bimp.tempSelectBitmap.size() + ")");
}
mPreviewBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// TODO 预览
intent = new Intent();
if (Bimp.tempSelectBitmap.size() > 0) {
intent.putExtra("position", "1");
intent.setClass(getActivity(), GalleryActivity.class);
startActivityForResult(intent, 9002);
}
}
});
// 返回按钮
LinearLayout imageViewLayout = (LinearLayout) view.findViewById(R.id.back_layout);
imageViewLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
for (Image image : mImageList){
if (Bimp.tempSelectBitmap.contains(image)){
Bimp.tempSelectBitmap.remove(image);
}
}
getActivity().finish();
}
});
mSubmitButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (Bimp.tempSelectBitmap != null && Bimp.tempSelectBitmap.size() > 0) {
// 返回已选择的图片数据
Intent data = new Intent();
getActivity().setResult(Activity.RESULT_OK, data);
getActivity().finish();
}
}
});
mGridView = (GridView) view.findViewById(R.id.grid);
mGridView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int state) {
final Picasso picasso = Picasso.with(getActivity());
if(state == SCROLL_STATE_IDLE || state == SCROLL_STATE_TOUCH_SCROLL){
picasso.resumeTag(getActivity());
}else{
picasso.pauseTag(getActivity());
}
if(state == SCROLL_STATE_IDLE){
// 停止滑动,日期指示器消失
mTimeLineText.setVisibility(View.GONE);
}else if(state == SCROLL_STATE_FLING){
mTimeLineText.setVisibility(View.VISIBLE);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(mTimeLineText.getVisibility() == View.VISIBLE) {
int index = firstVisibleItem + 1 == view.getAdapter().getCount() ? view.getAdapter().getCount() - 1 : firstVisibleItem + 1;
Image image = (Image) view.getAdapter().getItem(index);
if (image != null) {
mTimeLineText.setText(TimeUtils.formatPhotoDate(image.path));
}
}
}
});
mGridView.setAdapter(mImageAdapter);
mGridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void onGlobalLayout() {
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(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
mGridView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}else{
mGridView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if(mImageAdapter.isShowCamera()){
// 如果显示照相机,则第一个Grid显示为照相机,处理特殊逻辑
if(i == 0){
showCameraAction();
}else{
// 正常操作
Image image = (Image) adapterView.getAdapter().getItem(i);
selectImageFromGrid(image, MODE_MULTI);
}
}else{
// 正常操作
Image image = (Image) adapterView.getAdapter().getItem(i);
selectImageFromGrid(image, MODE_MULTI);
}
}
});
mFolderAdapter = new FolderAdapter(getActivity());
}
/**
* 创建弹出的ListView
*/
private void createPopupFolderList(int width, int height) {
mFolderPopupWindow = new ListPopupWindow(getActivity());
mFolderPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
mFolderPopupWindow.setAdapter(mFolderAdapter);
mFolderPopupWindow.setContentWidth(width);
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) {
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);
// 设定默认选择
if (Bimp.tempSelectBitmap != null && Bimp.tempSelectBitmap.size() > 0) {
mImageAdapter.setDefaultSelected(Bimp.tempSelectBitmap);
}
}
mImageAdapter.setShowCamera(false);
}
// 滑动到最初始位置
mGridView.smoothScrollToPosition(0);
}
}, 100);
}
});
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// 首次加载所有图片
//new LoadImageTask().execute();
getActivity().getSupportLoaderManager().initLoader(LOADER_ALL, null, mLoaderCallback);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// 相机拍照完成后,返回图片路径
if(requestCode == TAKE_PICTURE ){
if (resultCode == Activity.RESULT_OK){
if (mTmpFile != null) {
if (Bimp.tempSelectBitmap.size() < mDefaultCount){
try {
Bitmap bm = Bimp.revitionImageSize(mTmpFile.getAbsolutePath());
Image takePhoto = new Image();
takePhoto.setPath(mTmpFile.getAbsolutePath());
takePhoto.setBitmap(bm);
Bimp.tempSelectBitmap.add(takePhoto);
Intent intent = new Intent();
getActivity().setResult(Activity.RESULT_OK, intent);
getActivity().finish();
} catch (IOException e) {
e.printStackTrace();
}
}else {
Toast.makeText(getActivity(),getResources().getString(R.string.msg_amount_limit),Toast.LENGTH_SHORT).show();
}
}
}else {
if(mTmpFile != null && mTmpFile.exists()){
mTmpFile.delete();
}
}
}else if (requestCode == 9002 && resultCode == 9003){
mImageAdapter.setDefaultSelected(Bimp.tempSelectBitmap);
if (Bimp.tempSelectBitmap != null && Bimp.tempSelectBitmap.size() != 0){
mPreviewBtn.setEnabled(true);
mPreviewBtn.setText(getResources().getString(R.string.preview) + "(" + Bimp.tempSelectBitmap.size() + ")");
mSubmitButton.setEnabled(true);
mSubmitButton.setText(getResources().getString(R.string.finish)+"(" + Bimp.tempSelectBitmap.size() + "/" + mDefaultCount + ")");
}else {
mPreviewBtn.setEnabled(false);
mSubmitButton.setEnabled(false);
mPreviewBtn.setText(R.string.preview);
mSubmitButton.setText(getResources().getString(R.string.finish));
}
}else if (requestCode == 9002 && resultCode == 9004){
//ArrayList<String> list = (ArrayList<String>) intent.getSerializableExtra("list");
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
Log.d(TAG, "on change");
if(mFolderPopupWindow != null){
if(mFolderPopupWindow.isShowing()){
mFolderPopupWindow.dismiss();
}
}
mGridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@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);
final int numCount = mGridView.getWidth() / desireSize;
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;
mImageAdapter.setItemSize(columnWidth);
if (mFolderPopupWindow != null) {
mFolderPopupWindow.setHeight(height * 5 / 8);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mGridView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
mGridView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
super.onConfigurationChanged(newConfig);
}
/**
* 选择相机
*/
private void showCameraAction() {
// 跳转到系统照相机
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, TAKE_PICTURE);
}else{
Toast.makeText(getActivity(), R.string.msg_no_camera, Toast.LENGTH_SHORT).show();
}
}
/**
* 选择图片操作
* @param image
*/
private void selectImageFromGrid(Image image, int mode) {
if(image != null) {
// 多选模式
if(mode == MODE_MULTI) {
if (Bimp.tempSelectBitmap.contains(image)) {
Bimp.tempSelectBitmap.remove(image);
mImageList.remove(image);
if(Bimp.tempSelectBitmap.size() != 0) {
mPreviewBtn.setEnabled(true);
mPreviewBtn.setText(getResources().getString(R.string.preview) + "(" + Bimp.tempSelectBitmap.size() + ")");
mSubmitButton.setEnabled(true);
mSubmitButton.setText(getResources().getString(R.string.finish)+"(" + Bimp.tempSelectBitmap.size() + "/" + mDefaultCount + ")");
}else{
mPreviewBtn.setEnabled(false);
mSubmitButton.setEnabled(false);
mPreviewBtn.setText(R.string.preview);
mSubmitButton.setText(getResources().getString(R.string.finish));
}
} else {
// 判断选择数量问题
if(mDefaultCount == Bimp.tempSelectBitmap.size()){
Toast.makeText(getActivity(), R.string.msg_amount_limit, Toast.LENGTH_SHORT).show();
return;
}
Bimp.tempSelectBitmap.add(image);
mImageList.add(image);
mPreviewBtn.setEnabled(true);
mPreviewBtn.setText(getResources().getString(R.string.preview) + "(" + Bimp.tempSelectBitmap.size() + ")");
mSubmitButton.setEnabled(true);
mSubmitButton.setText(getResources().getString(R.string.finish)+"(" + Bimp.tempSelectBitmap.size() + "/" + mDefaultCount + ")");
}
mImageAdapter.select(image);
}else if(mode == MODE_SINGLE){
// 单选模式
}
}
}
private LoaderManager.LoaderCallbacks<Cursor> mLoaderCallback = new LoaderManager.LoaderCallbacks<Cursor>() {
private final String[] IMAGE_PROJECTION = {
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATE_ADDED,
MediaStore.Images.Media._ID };
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
if(id == LOADER_ALL) {
CursorLoader cursorLoader = new CursorLoader(getActivity(),
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION,
null, null, IMAGE_PROJECTION[2] + " DESC");
return cursorLoader;
}else if(id == LOADER_CATEGORY){
CursorLoader cursorLoader = new CursorLoader(getActivity(),
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_PROJECTION,
IMAGE_PROJECTION[0]+" like '%"+args.getString("path")+"%'", null, IMAGE_PROJECTION[2] + " DESC");
return cursorLoader;
}
return null;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if (data != null) {
List<Image> images = new ArrayList<>();
int count = data.getCount();
if (count > 0) {
data.moveToFirst();
do{
String path = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[0]));
String name = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[1]));
long dateTime = data.getLong(data.getColumnIndexOrThrow(IMAGE_PROJECTION[2]));
Image image = new Image(path, name, dateTime);
images.add(image);
if( !hasFolderGened ) {
// 获取文件夹名称
File imageFile = new File(path);
File folderFile = imageFile.getParentFile();
Folder folder = new Folder();
folder.name = folderFile.getName();
folder.path = folderFile.getAbsolutePath();
folder.cover = image;
if (!mResultFolder.contains(folder)) {
List<Image> imageList = new ArrayList<>();
imageList.add(image);
folder.images = imageList;
mResultFolder.add(folder);
} else {
// 更新
Folder f = mResultFolder.get(mResultFolder.indexOf(folder));
f.images.add(image);
}
}
}while(data.moveToNext());
mImageAdapter.setData(images);
// 设定默认选择
if(Bimp.tempSelectBitmap != null && Bimp.tempSelectBitmap.size()>0){
mImageAdapter.setDefaultSelected(Bimp.tempSelectBitmap);
}
mFolderAdapter.setData(mResultFolder);
hasFolderGened = true;
}
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
};
}
预览页面:
package me.nereo.multi_image_selector;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.hexstudy.npskinlib.CommonSkinConfig;
import java.util.ArrayList;
import java.util.List;
import me.nereo.multi_image_selector.gallery.Bimp;
import me.nereo.multi_image_selector.gallery.PhotoView;
import me.nereo.multi_image_selector.gallery.PublicWay;
import me.nereo.multi_image_selector.gallery.Res;
import me.nereo.multi_image_selector.gallery.ViewPagerFixed;
/**
* 这个是用于进行图片浏览时的界面
*
* @author king
* @QQ:595163260
* @version 2014年10月18日 下午11:47:53
*/
public class GalleryActivity extends FragmentActivity {
private ImageView del_bt;
private Intent intent;
private int position;
//当前的位置
private int location = 0;
private ArrayList<View> listViews = null;
private ViewPagerFixed pager;
private MyPageAdapter adapter;
public List<Bitmap> bmp = new ArrayList<Bitmap>();
public List<String> drr = new ArrayList<String>();
public List<String> del = new ArrayList<String>();
private Context mContext;
private String mStrPosition;
private int mId;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//TODO 许行修改的intent
setContentView(R.layout.plugin_camera_gallery);// 切屏到主界面
PublicWay.activityList.add(this);
mContext = this;
initView();
}
private void initView(){
Intent intent = getIntent();
mStrPosition = intent.getStringExtra("position");
mId = intent.getIntExtra("ID", 0);
RelativeLayout mTopLayout = (RelativeLayout) findViewById(R.id.topLayout);
mTopLayout.setBackgroundColor(CommonSkinConfig.sharedInstance().navitationBarBgColor);
del_bt = (ImageView)findViewById(R.id.navitationRightBut2);
del_bt.setBackgroundResource(R.drawable.upload_iamge_del);
ImageView backBtn = (ImageView) findViewById(R.id.navitationLeftBut);
backBtn.setBackgroundResource(CommonSkinConfig.sharedInstance().navBarbackIconId);
LinearLayout delLayout = (LinearLayout) findViewById(R.id.navitationRightBut2Layout);
delLayout.setOnClickListener(new DelListener());
LinearLayout backLayout = (LinearLayout) findViewById(R.id.navitationLeftButLayout);
backLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
setResult(9003);
finish();
}
});
position = Integer.parseInt(mStrPosition);
pager = (ViewPagerFixed) findViewById(R.id.gallery01);
pager.setOnPageChangeListener(pageChangeListener);
for (int i = 0; i < Bimp.tempSelectBitmap.size(); i++) {
initListViews( Bimp.tempSelectBitmap.get(i).getBitmap() );
}
adapter = new MyPageAdapter(listViews);
pager.setAdapter(adapter);
pager.setPageMargin(10);
pager.setCurrentItem(mId);
}
private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
public void onPageSelected(int arg0) {
location = arg0;
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
public void onPageScrollStateChanged(int arg0) {
}
};
private void initListViews(Bitmap bm) {
if (listViews == null)
listViews = new ArrayList<View>();
PhotoView img = new PhotoView(this);
img.setBackgroundColor(0xff000000);
img.setImageBitmap(bm);
img.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
listViews.add(img);
}
/*// 返回按钮添加的监听器
private class BackListener implements OnClickListener {
public void onClick(View v) {
intent.setClass(GalleryActivity.this, ImageFile.class);
setResult(RESULT_OK,intent);
}
}
*/
// 删除按钮添加的监听器
private class DelListener implements OnClickListener {
public void onClick(View v) {
if (listViews.size() == 1) {
Bimp.tempSelectBitmap.clear();
Bimp.max = 0;
setResult(9003);
finish();
} else {
Bimp.tempSelectBitmap.remove(location);
Bimp.max--;
pager.removeAllViews();
listViews.remove(location);
adapter.setListViews(listViews);
adapter.notifyDataSetChanged();
}
}
}
/**
* 监听返回按钮
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
this.finish();
}
return true;
}
class MyPageAdapter extends PagerAdapter {
private ArrayList<View> listViews;
private int size;
public MyPageAdapter(ArrayList<View> listViews) {
this.listViews = listViews;
size = listViews == null ? 0 : listViews.size();
}
public void setListViews(ArrayList<View> listViews) {
this.listViews = listViews;
size = listViews == null ? 0 : listViews.size();
}
public int getCount() {
return size;
}
public int getItemPosition(Object object) {
return POSITION_NONE;
}
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPagerFixed) arg0).removeView(listViews.get(arg1 % size));
}
public void finishUpdate(View arg0) {
}
public Object instantiateItem(View arg0, int arg1) {
try {
((ViewPagerFixed) arg0).addView(listViews.get(arg1 % size), 0);
} catch (Exception e) {
}
return listViews.get(arg1 % size);
}
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
}
}
主页面就这三个,其他的是一些辅助类和adaper:
/**
* 文件夹Adapter
* Created by Nereo on 2015/4/7.
*/
public class FolderAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater mInflater;
private List<Folder> mFolders = new ArrayList<>();
int mImageSize;
int lastSelected = 0;
public FolderAdapter(Context context){
mContext = context;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mImageSize = mContext.getResources().getDimensionPixelOffset(R.dimen.folder_cover_size);
}
/**
* 设置数据集
* @param folders
*/
public void setData(List<Folder> folders) {
if(folders != null && folders.size()>0){
mFolders = folders;
}else{
mFolders.clear();
}
notifyDataSetChanged();
}
@Override
public int getCount() {
return mFolders.size()+1;
}
@Override
public Folder getItem(int i) {
if(i == 0) return null;
return mFolders.get(i-1);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder;
if(view == null){
view = mInflater.inflate(R.layout.list_item_folder, viewGroup, false);
holder = new ViewHolder(view);
}else{
holder = (ViewHolder) view.getTag();
}
if (holder != null) {
if(i == 0){
holder.name.setText("所有图片");
holder.size.setText(getTotalImageSize()+"张");
if(mFolders.size()>0){
Folder f = mFolders.get(0);
Picasso.with(mContext)
.load(new File(f.cover.path))
.error(R.drawable.default_error)
.resize(mImageSize, mImageSize)
.centerCrop()
.into(holder.cover);
}
}else {
holder.bindData(getItem(i));
}
if(lastSelected == i){
holder.indicator.setVisibility(View.VISIBLE);
}else{
holder.indicator.setVisibility(View.INVISIBLE);
}
}
return view;
}
private int getTotalImageSize(){
int result = 0;
if(mFolders != null && mFolders.size()>0){
for (Folder f: mFolders){
result += f.images.size();
}
}
return result;
}
public void setSelectIndex(int i) {
if(lastSelected == i) return;
lastSelected = i;
notifyDataSetChanged();
}
public int getSelectIndex(){
return lastSelected;
}
class ViewHolder{
ImageView cover;
TextView name;
TextView size;
ImageView indicator;
ViewHolder(View view){
cover = (ImageView)view.findViewById(R.id.cover);
name = (TextView) view.findViewById(R.id.name);
size = (TextView) view.findViewById(R.id.size);
indicator = (ImageView) view.findViewById(R.id.indicator);
view.setTag(this);
}
void bindData(Folder data) {
name.setText(data.name);
size.setText(data.images.size()+"张");
// 显示图片
Picasso.with(mContext)
.load(new File(data.cover.path))
.placeholder(R.drawable.default_error)
.resize(mImageSize, mImageSize)
.centerCrop()
.into(cover);
// TODO 选择标识
}
}
}
/**
* 图片Adapter
* Created by Nereo on 2015/4/7.
*/
public class ImageGridAdapter extends BaseAdapter {
private static final int TYPE_CAMERA = 0;
private static final int TYPE_NORMAL = 1;
private Context mContext;
private LayoutInflater mInflater;
private boolean showCamera = true;
private boolean showSelectIndicator = true;
private List<Image> mImages = new ArrayList<>();
private List<Image> mSelectedImages = new ArrayList<>();
private int mItemSize;
private GridView.LayoutParams mItemLayoutParams;
public ImageGridAdapter(Context context, boolean showCamera){
mContext = context;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.showCamera = showCamera;
mItemLayoutParams = new GridView.LayoutParams(GridView.LayoutParams.MATCH_PARENT, GridView.LayoutParams.MATCH_PARENT);
}
/**
* 显示选择指示器
* @param b
*/
public void showSelectIndicator(boolean b) {
showSelectIndicator = b;
}
public void setShowCamera(boolean b){
if(showCamera == b) return;
showCamera = b;
notifyDataSetChanged();
}
public boolean isShowCamera(){
return showCamera;
}
/**
* 选择某个图片,改变选择状态
* @param image
*/
public void select(Image image) {
if(mSelectedImages.contains(image)){
mSelectedImages.remove(image);
}else{
mSelectedImages.add(image);
}
notifyDataSetChanged();
}
/**
* 通过图片路径设置默认选择
* @param resultList
*/
public void setDefaultSelected(ArrayList<Image> resultList) {
if (resultList != null && resultList.size() > 0){
mSelectedImages.clear();
for(Image image : resultList){
if(image != null){
mSelectedImages.add(image);
}
}
if(mSelectedImages.size() > 0){
notifyDataSetChanged();
}
}else {
mSelectedImages.clear();
notifyDataSetChanged();
}
}
private Image getImageByPath(String path){
if(mImages != null && mImages.size()>0){
for(Image image : mImages){
if(image.path.equalsIgnoreCase(path)){
return image;
}
}
}
return null;
}
/**
* 设置数据集
* @param images
*/
public void setData(List<Image> images) {
mSelectedImages.clear();
if(images != null && images.size()>0){
mImages = images;
}else{
mImages.clear();
}
notifyDataSetChanged();
}
/**
* 重置每个Column的Size
* @param columnWidth
*/
public void setItemSize(int columnWidth) {
if(mItemSize == columnWidth){
return;
}
mItemSize = columnWidth;
mItemLayoutParams = new GridView.LayoutParams(mItemSize, mItemSize);
notifyDataSetChanged();
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
if(showCamera){
return position==0 ? TYPE_CAMERA : TYPE_NORMAL;
}
return TYPE_NORMAL;
}
@Override
public int getCount() {
return showCamera ? mImages.size()+1 : mImages.size();
}
@Override
public Image getItem(int i) {
if(showCamera){
if(i == 0){
return null;
}
return mImages.get(i-1);
}else{
return mImages.get(i);
}
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
int type = getItemViewType(i);
if(type == TYPE_CAMERA){
view = mInflater.inflate(R.layout.list_item_camera, viewGroup, false);
view.setTag(null);
}else if(type == TYPE_NORMAL){
ViewHolde holde;
if(view == null){
view = mInflater.inflate(R.layout.list_item_image, viewGroup, false);
holde = new ViewHolde(view);
}else{
holde = (ViewHolde) view.getTag();
if(holde == null){
view = mInflater.inflate(R.layout.list_item_image, viewGroup, false);
holde = new ViewHolde(view);
}
}
if(holde != null) {
holde.bindData(getItem(i));
}
}
/** Fixed View Size */
GridView.LayoutParams lp = (GridView.LayoutParams) view.getLayoutParams();
if(lp.height != mItemSize){
view.setLayoutParams(mItemLayoutParams);
}
return view;
}
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);
}
void bindData(final Image data){
if(data == null) return;
// 处理单选和多选状态
if(showSelectIndicator){
indicator.setVisibility(View.VISIBLE);
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);
}
File imageFile = new File(data.path);
if(mItemSize > 0) {
// 显示图片
Picasso.with(mContext)
.load(imageFile)
.placeholder(R.drawable.default_error)
//.error(R.drawable.default_error)
.resize(mItemSize, mItemSize)
.centerCrop()
.into(image);
}
}
}
}
其他代码不都一一列出来了
源代码下载:http://download.csdn.net/detail/xuhang1993/9565719
有什么问题可以联系我