使用南尘的ImagePicker实现仿微信的相册图片选择以及拍照上传
来源:互联网 发布:泰德奥plc编程软件 编辑:程序博客网 时间:2024/05/17 22:52
在记录之前先放上原作的GitHub项目地址:ImagePicker
南尘的框架写得相当不错,我们可以在我们的项目中添加依赖直接使用,但是我在使用的时候发现了一个小bug,就在图片预览的界面选择了图片后,点击返回到所有图片界面时,在预览被选中的图片的CheckBox没有勾上,但是图片是确实已经添加上去了,于是我在他源码的基础上进行了修改,但是我感觉我修改的方法有点low,欢迎大神指点更高级的修改方法。
首先先来说一下这个框架怎么使用,因为这里我要修改源码,所以我直接将源码的module导入到我的工程了,然后在gradle里面加一句:compile project(':imagepicker')
另外,我用了glide框架来加载图片,所以还要加上:compile 'com.github.bumptech.glide:glide:3.7.0'
假设我们添加图片的界面就是MainActivity,所以先上其布局代码activity_main.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:choiceMode="singleChoice" android:divider="@null" android:fadingEdge="none" android:listSelector="@android:color/transparent" android:scrollbarStyle="outsideOverlay" app:layoutManager="android.support.v7.widget.GridLayoutManager" app:spanCount="4" tools:listitem="@layout/list_item_image"/></RelativeLayout>其次先新建两个工具类
第一个是图片的加载器,这里我使用的是Glide加载:GlideImageLoader
package demo.yang.com.myimagepicker;import android.app.Activity;import android.net.Uri;import android.widget.ImageView;import com.bumptech.glide.Glide;import com.bumptech.glide.load.engine.DiskCacheStrategy;import com.lzy.imagepicker.loader.ImageLoader;import java.io.File;/** * Created by yxy on 2017/4/10. * email:1084625746@qq.com */public class GlideImageLoader implements ImageLoader { @Override public void displayImage(Activity activity, String path, ImageView imageView, int width, int height) { Glide.with(activity) .load(Uri.fromFile(new File(path))) .error(R.mipmap.f) .placeholder(R.mipmap.f) .diskCacheStrategy(DiskCacheStrategy.ALL) .into(imageView); } @Override public void clearMemoryCache() { }}至于里面的error和placeholder的图片资源大家就自己随便放吧
第二个是一个自定义dialog(这个是南尘大神写的):SelectDialog
package demo.yang.com.myimagepicker;import android.app.Activity;import android.app.Dialog;import android.os.Bundle;import android.text.TextUtils;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.view.ViewGroup.LayoutParams;import android.view.Window;import android.view.WindowManager;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.TextView;import java.util.List;/** * 选择对话框 * * Author: nanchen * Email: liushilin520@foxmail.com * Date: 2017-03-22 11:38 */public class SelectDialog extends Dialog implements OnClickListener,OnItemClickListener { private SelectDialogListener mListener; private Activity mActivity; private Button mMBtn_Cancel; private TextView mTv_Title; private List<String> mName; private String mTitle; private boolean mUseCustomColor = false; private int mFirstItemColor; private int mOtherItemColor; public interface SelectDialogListener { public void onItemClick(AdapterView<?> parent, View view, int position, long id); } /** * 取消事件监听接口 * */ private SelectDialogCancelListener mCancelListener; public interface SelectDialogCancelListener { public void onCancelClick(View v); } public SelectDialog(Activity activity, int theme, SelectDialogListener listener, List<String> names) { super(activity, theme); mActivity = activity; mListener = listener; this.mName=names; setCanceledOnTouchOutside(true); } /** * @param activity 调用弹出菜单的activity * @param theme 主题 * @param listener 菜单项单击事件 * @param cancelListener 取消事件 * @param names 菜单项名称 * */ public SelectDialog(Activity activity, int theme, SelectDialogListener listener, SelectDialogCancelListener cancelListener , List<String> names) { super(activity, theme); mActivity = activity; mListener = listener; mCancelListener = cancelListener; this.mName=names; // 设置是否点击外围不解散 setCanceledOnTouchOutside(false); } /** * @param activity 调用弹出菜单的activity * @param theme 主题 * @param listener 菜单项单击事件 * @param names 菜单项名称 * @param title 菜单标题文字 * */ public SelectDialog(Activity activity, int theme, SelectDialogListener listener, List<String> names, String title) { super(activity, theme); mActivity = activity; mListener = listener; this.mName=names; mTitle = title; // 设置是否点击外围可解散 setCanceledOnTouchOutside(true); } public SelectDialog(Activity activity, int theme, SelectDialogListener listener, SelectDialogCancelListener cancelListener, List<String> names, String title) { super(activity, theme); mActivity = activity; mListener = listener; mCancelListener = cancelListener; this.mName=names; mTitle = title; // 设置是否点击外围可解散 setCanceledOnTouchOutside(true); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View view = getLayoutInflater().inflate(R.layout.view_dialog_select, null); setContentView(view, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); Window window = getWindow(); // 设置显示动画 window.setWindowAnimations(R.style.main_menu_animstyle); WindowManager.LayoutParams wl = window.getAttributes(); wl.x = 0; wl.y = mActivity.getWindowManager().getDefaultDisplay().getHeight(); // 以下这两句是为了保证按钮可以水平满屏 wl.width = LayoutParams.MATCH_PARENT; wl.height = LayoutParams.WRAP_CONTENT; // 设置显示位置 onWindowAttributesChanged(wl); initViews(); } private void initViews() { DialogAdapter dialogAdapter=new DialogAdapter(mName); ListView dialogList=(ListView) findViewById(R.id.dialog_list); dialogList.setOnItemClickListener(this); dialogList.setAdapter(dialogAdapter); mMBtn_Cancel = (Button) findViewById(R.id.mBtn_Cancel); mTv_Title = (TextView) findViewById(R.id.mTv_Title); mMBtn_Cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(mCancelListener != null){ mCancelListener.onCancelClick(v); } dismiss(); } }); if(!TextUtils.isEmpty(mTitle) && mTv_Title != null){ mTv_Title.setVisibility(View.VISIBLE); mTv_Title.setText(mTitle); }else{ mTv_Title.setVisibility(View.GONE); } } @Override public void onClick(View v) { dismiss(); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mListener.onItemClick(parent, view, position, id); dismiss(); } private class DialogAdapter extends BaseAdapter { private List<String> mStrings; private Viewholder viewholder; private LayoutInflater layoutInflater; public DialogAdapter(List<String> strings) { this.mStrings = strings; this.layoutInflater=mActivity.getLayoutInflater(); } @Override public int getCount() { // TODO Auto-generated method stub return mStrings.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return mStrings.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (null == convertView) { viewholder=new Viewholder(); convertView=layoutInflater.inflate(R.layout.view_dialog_item, null); viewholder.dialogItemButton=(TextView) convertView.findViewById(R.id.dialog_item_bt); convertView.setTag(viewholder); }else{ viewholder=(Viewholder) convertView.getTag(); } viewholder.dialogItemButton.setText(mStrings.get(position)); if (!mUseCustomColor) { mFirstItemColor = mActivity.getResources().getColor(R.color.blue); mOtherItemColor = mActivity.getResources().getColor(R.color.blue); } if (1 == mStrings.size()) { viewholder.dialogItemButton.setTextColor(mFirstItemColor); viewholder.dialogItemButton.setBackgroundResource(R.drawable.dialog_item_bg_only); } else if (position == 0) { viewholder.dialogItemButton.setTextColor(mFirstItemColor); viewholder.dialogItemButton.setBackgroundResource(R.drawable.select_dialog_item_bg_top); } else if (position == mStrings.size() - 1) { viewholder.dialogItemButton.setTextColor(mOtherItemColor); viewholder.dialogItemButton.setBackgroundResource(R.drawable.select_dialog_item_bg_buttom); } else { viewholder.dialogItemButton.setTextColor(mOtherItemColor); viewholder.dialogItemButton.setBackgroundResource(R.drawable.select_dialog_item_bg_center); } return convertView; } } public static class Viewholder { public TextView dialogItemButton; } /** * 设置列表项的文本颜色 */ public void setItemColor(int firstItemColor, int otherItemColor) { mFirstItemColor = firstItemColor; mOtherItemColor = otherItemColor; mUseCustomColor = true; }}这个里面会用到一些style,添加到style.xml里面:
<style name="main_menu_animstyle"> <item name="android:windowEnterAnimation">@anim/photo_dialog_in_anim</item> <item name="android:windowExitAnimation">@anim/photo_dialog_out_anim</item> </style> <style name="transparentFrameWindowStyle" parent="android:style/Theme.Dialog"> <item name="android:windowBackground">@drawable/photo_choose_bg</item> </style>在res文件夹下新建anim文件夹,新建两个xml文件:photo_dialog_in_anim.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="200" android:fromXDelta="0" android:fromYDelta="1000" android:toXDelta="0" android:toYDelta="0" /></set>photo_dialog_out_anim.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="300" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="0" android:toYDelta="1000" /></set>然后在drawable文件夹里新建photo_choose_bg.xml
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#00000000"/> <corners android:radius="20dp"/> <padding android:bottom="5dp" android:left="5dp" android:right="5dp" android:top="5dp"/></shape>新建一个layout文件:view_dialog_select.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00000000" android:gravity="bottom" android:orientation="vertical" android:padding="5dip" > <TextView android:id="@+id/mTv_Title" android:layout_width="match_parent" android:layout_height="68dp" android:layout_marginTop="5dip" android:background="@drawable/dialog_item_bg_only" android:padding="10dip" android:textColor="#0073FF" android:textSize="18sp" android:gravity="center" android:visibility="gone"/> <ListView android:id="@+id/dialog_list" android:layout_width="match_parent" android:dividerHeight="0.5dp" android:divider="#DAD9DB" android:layout_marginTop="5dip" android:listSelector="@android:color/transparent" android:cacheColorHint="@android:color/transparent" android:layout_height="wrap_content" > </ListView> <Button android:id="@+id/mBtn_Cancel" android:layout_width="match_parent" android:layout_height="40dp" android:layout_marginTop="5dip" android:background="@drawable/dialog_item_bg_only" android:text="取消" android:gravity="center" android:textColor="#0073FF" android:textSize="18sp" /></LinearLayout>以及对应ListView的item的layout:view_dialog_item.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/dialog_item_bt" android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center" android:textColor="#0073FF" android:textSize="18sp" /></RelativeLayout>还有四个按钮的背景样式
只有一列时:dialog_item_bg_only.xml
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"><shape> <solid android:color="#CACACB" /> <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" /> </shape></item> <item><shape> <solid android:color="#EBEBEB" /> <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" /> </shape></item></selector>多条数据时,第一条数据的背景:select_dialog_item_bg_top.xml
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"><shape> <solid android:color="#CACACB" /> <corners android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" /> </shape></item> <item><shape> <solid android:color="#EBEBEB" /> <corners android:bottomLeftRadius="0dp" android:bottomRightRadius="0dp" android:topLeftRadius="5dp" android:topRightRadius="5dp" /> </shape></item></selector>多条数据时,最后一条数据的背景:select_dialog_item_bg_buttom.xml
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"><shape> <solid android:color="#CACACB" /> <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="0dp" android:topRightRadius="0dp" /> </shape></item> <item><shape> <solid android:color="#EBEBEB" /> <corners android:bottomLeftRadius="5dp" android:bottomRightRadius="5dp" android:topLeftRadius="0dp" android:topRightRadius="0dp" /> </shape></item></selector>多条数据时,中间数据的背景:select_dialog_item_bg_center.xml
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"><shape> <solid android:color="#CACACB" /> </shape></item> <item><shape> <solid android:color="#EBEBEB" /> </shape></item></selector>工具类添加完后,就可以写显示我们已选择的图片的适配器了:ImagePickerAdapter
package demo.yang.com.myimagepicker;import android.app.Activity;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import com.lzy.imagepicker.ImagePicker;import com.lzy.imagepicker.bean.ImageItem;import java.util.ArrayList;import java.util.List;/** * Created by yxy on 2017/4/10. * email:1084625746@qq.com */public class ImagePickerAdapter extends RecyclerView.Adapter<ImagePickerAdapter.SelectedPicViewHolder>{ private OnRecyclerViewItemClickListener listener; private int maxImgCount; private Context context; private List<ImageItem> mData; private LayoutInflater mInflater; private boolean isAdded;//是否还能添加图片 public ImagePickerAdapter(int maxImgCount, Context context, List<ImageItem> mData) { this.maxImgCount = maxImgCount; this.context = context; this.mInflater = LayoutInflater.from(context); setImages(mData); } public void setImages(List<ImageItem> data){ mData = new ArrayList<>(data); if (getItemCount()<maxImgCount){ mData.add(new ImageItem()); isAdded = true; }else{ isAdded = false; } notifyDataSetChanged(); } //返回已选的所有图片 public List<ImageItem> getImages(){ if (isAdded) return new ArrayList<>(mData.subList(0,mData.size()-1)); else return mData; } @Override public SelectedPicViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new SelectedPicViewHolder(mInflater.inflate(R.layout.list_item_image,parent,false)); } @Override public void onBindViewHolder(SelectedPicViewHolder holder, int position) { holder.bind(position); } @Override public int getItemCount() { return mData.size(); } public interface OnRecyclerViewItemClickListener{ void onItemClick(View view,int position); } public void setOnItemClickListener(OnRecyclerViewItemClickListener listener){ this.listener = listener; } public class SelectedPicViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private ImageView img; private int clickPosition; public SelectedPicViewHolder(View itemView) { super(itemView); img = (ImageView) itemView.findViewById(R.id.img); } public void bind(int position){ itemView.setOnClickListener(this); ImageItem item = mData.get(position); if (isAdded&&position==getItemCount()-1){ img.setImageResource(R.drawable.selector_image_add); clickPosition = MainActivity.IMAGE_ITEM_ADD; }else{ ImagePicker.getInstance().getImageLoader().displayImage((Activity) context,item.path,img,0,0); clickPosition = position; } } @Override public void onClick(View view) { if (listener!=null){ listener.onItemClick(view,clickPosition); } } }}这里面的排版就看自己的项目需求了,因为我MainActivity的布局只写了一个RecyclerView,所以我的适配器就只放了一个ImageView:list_item_image.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:padding="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/img" android:scaleType="centerCrop" android:src="@drawable/selector_image_add" android:layout_width="70dp" android:layout_height="70dp" /></LinearLayout>在drawable文件夹里面新建一个selector_image_add.xml
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@mipmap/image_add_sel" android:state_focused="true"/> <item android:drawable="@mipmap/image_add_sel" android:state_pressed="true"/> <item android:drawable="@mipmap/image_add_sel" android:state_selected="true"/> <item android:drawable="@mipmap/image_add_nor"/></selector>下面是这两个图片资源
最后就是MainActivity的代码了
package demo.yang.com.myimagepicker;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.util.Log;import android.view.View;import android.widget.AdapterView;import com.lzy.imagepicker.ImagePicker;import com.lzy.imagepicker.bean.ImageItem;import com.lzy.imagepicker.ui.ImageGridActivity;import com.lzy.imagepicker.ui.ImagePreviewDelActivity;import com.lzy.imagepicker.view.CropImageView;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity implements ImagePickerAdapter.OnRecyclerViewItemClickListener { public static final int IMAGE_ITEM_ADD = -1;//设置是否为添加图片的那个image public static final int REQUEST_CODE_SELECT = 100; public static final int REQUEST_CODE_PREVIEW = 101; private ImagePickerAdapter adapter; private List<ImageItem> selImageList;//当前选择的所有图片 private int maxImgCount = 8;//允许选择的图片最大数量 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initImagePicker(); initWidget(); } private void initImagePicker(){ ImagePicker imagePicker = ImagePicker.getInstance(); imagePicker.setImageLoader(new GlideImageLoader());//设置图片加载器 imagePicker.setShowCamera(true);//显示拍照按钮 imagePicker.setCrop(true);//允许裁剪(单选的时候才有效) imagePicker.setSaveRectangle(true);//是否按矩形区域保存 imagePicker.setSelectLimit(maxImgCount);//选中数量限制 imagePicker.setStyle(CropImageView.Style.RECTANGLE);//裁剪框的形状 imagePicker.setFocusWidth(800);//裁剪框的宽度,单位像素 imagePicker.setFocusHeight(800);//裁剪框的高度,单位像素 imagePicker.setOutPutX(1000);//保存文件的宽度,单位像素 imagePicker.setOutPutY(1000);//保存文件的高度,单位像素 } private void initWidget(){ RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); selImageList = new ArrayList<>(); adapter = new ImagePickerAdapter(maxImgCount,this,selImageList); adapter.setOnItemClickListener(this); recyclerView.setLayoutManager(new GridLayoutManager(this,4)); recyclerView.setHasFixedSize(true); recyclerView.setAdapter(adapter); } private SelectDialog showDialog(SelectDialog.SelectDialogListener listener,List<String> names){ SelectDialog dialog = new SelectDialog(this,R.style.transparentFrameWindowStyle,listener,names); if (!this.isFinishing()){ dialog.show(); } return dialog; } @Override public void onItemClick(View view, int position) { switch (position){ case IMAGE_ITEM_ADD: List<String> names = new ArrayList<>(); names.add("拍照"); names.add("相册"); showDialog(new SelectDialog.SelectDialogListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { switch (position){ case 0://直接调起相机 //打开选择,本次允许选择的数量 ImagePicker.getInstance().setSelectLimit(maxImgCount - selImageList.size()); Intent intent = new Intent(MainActivity.this, ImageGridActivity.class); intent.putExtra(ImageGridActivity.EXTRAS_TAKE_PICKERS,true); startActivityForResult(intent,REQUEST_CODE_SELECT); break; case 1://打开相册 //打开选择,本次允许选择的数量 ImagePicker.getInstance().setSelectLimit(maxImgCount - selImageList.size()); Intent intent1 = new Intent(MainActivity.this,ImageGridActivity.class); startActivityForResult(intent1,REQUEST_CODE_SELECT); break; default: break; } } },names); break; default: //打开预览 Intent intentPreView = new Intent(this, ImagePreviewDelActivity.class); intentPreView.putExtra(ImagePicker.EXTRA_IMAGE_ITEMS,(ArrayList<ImageItem>)adapter.getImages()); intentPreView.putExtra(ImagePicker.EXTRA_SELECTED_IMAGE_POSITION,position); intentPreView.putExtra(ImagePicker.EXTRA_FROM_ITEMS,true); startActivityForResult(intentPreView,REQUEST_CODE_PREVIEW); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == ImagePicker.RESULT_CODE_ITEMS){//添加图片返回 if (data!=null&&requestCode==REQUEST_CODE_SELECT){ ArrayList<ImageItem> images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS); if (images!=null){ selImageList.addAll(images); adapter.setImages(selImageList); Log.e("TAG", "onActivityResult: "+selImageList.get(0).path+" "+selImageList.get(1).path ); } } }else if (resultCode == ImagePicker.RESULT_CODE_BACK){//预览图片返回 if (data!=null&&requestCode == REQUEST_CODE_PREVIEW){ ArrayList<ImageItem> images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_IMAGE_ITEMS); if (images!=null){ selImageList.clear(); selImageList.addAll(images); adapter.setImages(selImageList); } } } }}
最后就是我在源码上的修改了,
首先是ImageRecyclerAdapter.java,这里我只粘出我添加的代码,先写一个函数来更新CheckBox的状态
public void updatecheck(ImageViewHolder holder,int position){ holder.cbCheck.setChecked(false); for (int j = 0;j<mSelectedImages.size();j++){ if (mSelectedImages.get(j).equals(images.get(position-1))){ holder.cbCheck.setChecked(true); } } }然后在onBindViewHolder里面进行调用
接着是ImageGrideActivity.java,在activity的回调函数里面设置刷新,注意要放在resultCode为ImagePicker.RESULT_CODE_BACK的条件里面,即:
if (resultCode == ImagePicker.RESULT_CODE_BACK) { isOrigin = data.getBooleanExtra(ImagePreviewActivity.ISORIGIN, false); mRecyclerAdapter.notifyDataSetChanged(); }写到这儿,之前我所说的bug就解决了,另外发现,,,还有一个bug,,就是选择图片的预览界面的返回按钮点击后不会激起activity的回调,最后发现是没有findViewById,以及setOnClickListener,所以在ImagePreviewActivity初始化控件的时候添加上就可以了
mBtnBack = (ImageView) topBar.findViewById(R.id.btn_back); mBtnBack.setVisibility(View.VISIBLE); mBtnBack.setOnClickListener(this);
到这儿所有想要的效果就都实现了,欢迎各路大神指点。
- 使用南尘的ImagePicker实现仿微信的相册图片选择以及拍照上传
- 图片拍照或相册选择的实现以及裁剪功能
- 使用AFNetworking上传相册或拍照的图片
- 个人界面 < 头像 > 图片选择(相册,拍照)--如何调用系统的相册,裁剪并且上传
- Ionic3学习笔记(十二)拍照上传图片以及从相册选择图片上传
- Android开发:相册读取、拍照、图片裁剪和图片上传服务器等功能的实现
- 拍照上传图片与从相册中选择图片上传
- iOS访问相册以及拍照保存至相册的实现
- 上传图片到服务器和图片内存处理以及拍照或从相册选取图片的小总结
- 使用OKhttp的封装类 进行本地相册或拍照的图片上传显示
- ionic 的项目实现从手机相册选取图片或拍照并上传至服务器
- 微信公众号js接口,实现图片的上传(拍照+本地相册)
- 微信小程序从本地相册选择图片或使用相机拍照之我的理解
- Android 2种图片(相册--拍照)的上传方式
- # 仿照微信类的图片上传,支持相册及拍照
- Android 实现从相册选择图片,拍照选择图片
- Android实现拍照,以及从相册选择图片裁剪功能同时保存在本地
- android 拍照或选择相册图片压缩上传
- Iframe和a标签的downLoad新属性实现-调用浏览器的本地下载功能
- H5基础第五课时CSS篇(2)
- 抽象工厂模式
- Android Studio混淆打包
- extern和static的区别
- 使用南尘的ImagePicker实现仿微信的相册图片选择以及拍照上传
- 关于ctrl+c 和 ctrl+z的区别
- matplotlib学习记录(一)
- 自己用过的linux命令(二)
- linux c语言 模拟键盘输入
- dp46上 HDU1421
- Linux下演示编辑和运行C语言程序
- SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient
- socket编程