使用南塵的ImagePicker實現仿微信的相簿圖片選擇以及拍照上傳
在記錄之前先放上原作的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: [email protected]
*/
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: [email protected]
* 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:[email protected]
*/
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實現仿微信的相簿圖片選擇以及拍照上傳
在記錄之前先放上原作的GitHub專案地址:ImagePicker 南塵的框架寫得相當不錯,我們可以在我們的專案中新增依賴直接使用,但是我在使用的時候發現了一個小bug,就在圖片預覽的介面選擇了圖片後,點選返回到所有圖片介面時,在預覽被選中的圖片的CheckBox沒有勾上,
Android圖片選擇器,仿微信的圖片選擇器的樣式和效果。支援圖片預覽和圖片切換
Android圖片選擇器,仿微信的圖片選擇器的樣式和效果。支援圖片的單選、限數量的多選和不限數量的多選。支援圖片預覽和圖片資料夾的切換。支援圖片單選並剪裁。先上效果圖:1、引入依賴在Project的build.gradle在新增以下程式碼allprojects { repositories {
Android 仿微信的圖片選擇器ImageSelector的使用
今天給大家介紹一個仿微信的圖片選擇器:ImageSelector。ImageSelector支援圖片的單選、限數量的多選和不限數量的多選。支援圖片預覽和圖片資料夾的切換。在上一篇文章 《Android 實現一個仿微信的圖片選擇器》 中我介紹了ImageSelec
仿微信多圖片選擇、預覽、手勢處理
https://github.com/wangluu/PicSelect 因為覺得網上其他的仿微信圖片選擇都不夠好,特別是手勢處理,大圖檢視時,稍微放大圖片,再左滑右滑效果很不理想,所以我自己做了一個。 (Gif太麻煩了,截幾張圖吧) featur
Android實現仿微信朋友圈釋出動態(拍照、相簿選擇、照片壓縮、顯示、儲存、縮圖、點選縮圖刪除對應檔案等)附原始碼
原創作品,轉載請註明出處:http://blog.csdn.net/zhang3776813/article/details/52092591 最近專案需求中要用到類似微信朋友圈釋出動態選擇圖片的UI效果,研究了一下,特來分享成果,多的不說來看程式碼。
JAVA實現仿微信紅包分配規則
個人部落格站已經上線了,網址 www.llwjy.com ~歡迎各位吐槽~-------------------------------------------------------------------------------------------------
Android ViewPager和Fragment實現仿微信導航介面及滑動效果
1 先看看實現的效果: ps:上面每一幀Fragment中,包含是來自網路的圖片; 實現ViewPager+Fragment的頁面滑動和底部導航原理 主佈局檔案如下: <?xml version="1.0" encoding="utf-8"?> <L
android 融雲 + 科大訊飛 實現仿微信語音訊息轉換為文字(附DEMO原始碼)
融雲SDK 使用很方便,簡單配置就可以搭建即時通訊功能,配合科大訊飛的語音識別, 即可實現微信中語音訊息轉換為文字的功能 融雲sdk的基本使用就不細說了, 網上很多資料 使用融雲sdk自帶的聊天會話介面,想要在此會話介面上增加語音訊息長按時彈出 “轉換為文
用 node 實現仿微信風格的 token 獲取介面
流程圖 依賴項 "dependencies": { "express": "^4.12.3", "jsonwebtoken": "^5.0.0", "mongoose": "^4.0.2", "redis-fast-d
Android Studio使用ViewPager+Fragment實現仿微信滑動切換介面
前言 微信的滑動切換獲得大家一致好評,在我們開發的過程中我們也經常模仿微信的導航效果。 首先看下效果圖 效果還算不錯,可以滑動切換和點選切換,微信介面用listview展示資料,通訊錄介面用的recyclerview展示資料,在接下來就帶著大家一一
仿微信相簿資料夾選擇的互動
前言 這是按照微信相簿中資料夾選擇的展示動畫做出來的PopupWindow。之前自己做過相簿部分,發現微信相簿中這個資料夾顯示和消失的動畫很自然,很舒服,而之前做的不是那麼自然,於是就做了這麼個東西。 效果 PopupWindow 做這個互動
Android使用RecyclerView實現仿微信聯絡人列表
現在聯絡人列表基本都是按照字母或者拼音來進行分類,右邊有一排字母供使用者快速定位到指定的字母位置,效果圖如下: OK,輸入的聯絡人型別可能有很多種,比如漢字、英文、數字、特殊符號等等,其中漢字會轉化成拼音,完後和英文一起進行分類,分類的原則是首字母排序,而數字、特殊符號等
iOS 關於視訊錄製實現 (仿微信)
專案demo tips:建議參照我的demo進行了解,如果有幫助到你的話請幫我點亮 star, 謝謝啦~ 類似於微信的 點選拍照 , 長按拍視訊的功能. 匯入框架 #import <AVFoundation/AVFoundation.h>
Android自定義ListView實現仿微信側滑刪除
經常在遇到問題第一時間都會在網上搜索解決的方法,因此看到很多前輩們的比較精闢的技術文章,學習了很多東西,現在將自己平時工作中開發的一些小功能坐下總結,也寫出來,既方便自己理清思路記憶功能塊實現思路,又能與大家一起交流分享技術。 第一次寫文章,哪裡有不對的希望大
Android簡單實現仿微信選擇圖片以及拍照(PhotoPicker)
實現仿微信的圖片選擇,預覽以及拍照,屬性可以設定顯示照相機以及預覽時是否顯示刪除按鈕等,功能齊全並且可以根據儲存照片的路徑進行修改等 Gradle配置 dependencies { co
Android RadioGroup+ViewPager+ActionBar實現仿微信6.0介面(底部滑動選單欄+導航欄)
轉載請註明原文地址:http://blog.csdn.net/anyfive/article/details/41296341 本文主要使用RadioGroup+ViewPager來實現滑動介面,使用ActionBar來實現頂部選單欄。先上圖(使用GifCam錄製)。
仿微信選取圖片發表朋友圈功能
一、思路 第一,圖片拖拽位置互換/刪除,參照第三方; 第二,圖片用scrollview瀏覽,縮放用zoomToRect,不用CGAffineTransformScale; 其次,還要返回當前縮放圖片 //放回當前縮放圖片 - (UIView *)viewForZoomingInScrollVi
android 仿微信多圖選擇器(帶預覽、照相功能)
實現了單選、多選 、拍照 、預覽 等功能;先上圖: 程式碼結構 下面不如正題: 一、新增依賴、許可權 1)新增以下依賴 dependencies { compile fileTree(dir: 'libs', include: ['*.jar'])
Android之WebView仿微信中圖片操作(含二維碼識別)
HitTestResult類: WebView中被點選內容的相應資訊,通過WebView的getHitTestResult()獲取! 自定義WebView /** * 自定義WebView,長按圖片獲取圖片url * @author LinZhang
微信企業號 JS-SDK:上傳圖片
代碼示例 tlist ace iframe ram string menu 服務 add 微信企業號 JS-SDK:上傳圖片 微信的JS-SDK提供了微信客戶端相關的功能,如:拍照、選圖、語音、位置等手機系統的能力,同時可以直接使用微信分享、掃一掃等微信特有
