1. 程式人生 > >安卓選擇圖片上傳功能【支援多選拍照預覽等】

安卓選擇圖片上傳功能【支援多選拍照預覽等】

在網上找了很多第三方的相簿拍照框架,都不盡人意,最後終於找到了一個比較好的框架,並且整合到了自己的demo中,花了兩天的時間吧感覺挺值的。老規矩不說廢話,直接上程式碼。

感謝某開源庫的作者:Alum

思路


目錄


先看目錄,我儘可能的在自己力所能及的範圍內,用最簡單的方式和程式碼來實現。這裡最重要的玩意兒是那個介面卡。最下面的那個popupwindow是個自己寫的控制元件,如果有興趣我回頭再把這個玩意兒放出來。

先看看功能吧:


功能


簡單來說就是點選加號可以新增或拍照,拍照後可直接返回到主頁面直接更新圖片。可以控制選擇的圖片數量,主題,以及預覽等等。

先看佈局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/llMain"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <GridView
        android:id="@+id/gvImage"
        android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_margin="5dp" android:horizontalSpacing="5dp" android:numColumns="3" android:verticalSpacing="5dp" />
</LinearLayout>

主頁只有一個GridView+介面卡
然後看一下每一個item的佈局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical">
<!--顯示圖片--> <RelativeLayout android:id="@+id/rlItemShow" android:layout_width="match_parent" android:layout_height="120dp" android:background="?android:attr/selectableItemBackground" android:visibility="gone"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/sdvItemShowImg" android:layout_width="match_parent" android:layout_height="match_parent" fresco:actualImageScaleType="fitXY" fresco:placeholderImage="@color/blue1" fresco:placeholderImageScaleType="fitXY" /> <!--刪除圖片--> <ImageView android:id="@+id/ivDeleteImg" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignParentRight="true" android:layout_margin="5dp" android:scaleType="fitXY" android:src="@mipmap/ic_delete_img" /> </RelativeLayout> <!--新增圖片--> <ImageView android:id="@+id/ivItemAdd" android:layout_width="match_parent" android:layout_height="120dp" android:background="@drawable/shape_iv_add_img" android:padding="20dp" android:scaleType="centerInside" android:src="@mipmap/ic_plus_img" android:visibility="gone" /> </LinearLayout>

手動控制一下寬高,這裡對於每一個item來說,可以坐三件事情,顯示圖片,刪除圖片,新增圖片。其中,點選顯示的圖片可以跳轉到預覽介面,點選刪除圖片可以刪除被點的這張,點選新增圖片跳轉到相簿。這個邏輯應該是簡單而又清晰的。

那麼我們主要來看一下介面卡

public class ImgGridAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<String> imgList;
    private int maxImgCount;
    private FreshImgCallBack freshImgCallBack;//針對三種操作邏輯所自定義的回撥

    public ImgGridAdapter(Context context, ArrayList<String> imgList, int maxImgCount) {
        this.context = context;
        this.imgList = imgList;
        this.maxImgCount = maxImgCount;
    }

    /**
     * 設定回撥
     *
     * @param callBack freshImgCallBack
     */
    public void setImgShowFresh(FreshImgCallBack callBack) {
        freshImgCallBack = callBack;
    }

    @Override
    public int getCount() {
        if (imgList.size() < maxImgCount) {
            return imgList.size() + 1;
        } else {
            return maxImgCount;
        }
    }

    @Override
    public Object getItem(int position) {
        return imgList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (holder != null) {
            holder = (ViewHolder) convertView.getTag();
        } else {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.itme_gridview, null);
            holder.sdvItemShowImg = (SimpleDraweeView) convertView.findViewById(R.id.sdvItemShowImg);
            holder.ivDeleteImg = (ImageView) convertView.findViewById(R.id.ivDeleteImg);
            holder.ivItemAdd = (ImageView) convertView.findViewById(R.id.ivItemAdd);
            holder.ivItemAdd.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    freshImgCallBack.openGallery();//開啟相簿放在裡面即可
                }
            });
            holder.rlItemShow = (RelativeLayout) convertView.findViewById(R.id.rlItemShow);
        }
        //——————————————————————————————設定圖片邏輯——————————————————————————————
        holder.ivItemAdd.setVisibility(View.GONE);
        holder.rlItemShow.setVisibility(View.GONE);
        if (imgList.size() < 5) {
            if (position == getCount() - 1) {
                holder.ivItemAdd.setVisibility(View.VISIBLE);
            } else {
                if (getCount() > 1) {
                    showImg(position, holder);
                }
            }
        } else {
            showImg(position, holder);
        }

        //放在外面用於更新position
        holder.sdvItemShowImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                freshImgCallBack.previewImg(position);//預覽圖片
            }
        });
        holder.ivDeleteImg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                freshImgCallBack.updateGvImgShow(position);//更新資料
            }
        });
        return convertView;
    }

    //顯示圖片
    private void showImg(int position, ViewHolder holder) {
        holder.ivItemAdd.setVisibility(View.GONE);
        holder.rlItemShow.setVisibility(View.VISIBLE);
        //設定圖片
        ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse("file://" + imgList.get(position)))
                .setProgressiveRenderingEnabled(true)
                .setResizeOptions(new ResizeOptions(100, 100))
                .build();
        DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setImageRequest(request)
                .setAutoPlayAnimations(true)
                .setTapToRetryEnabled(true)
                .setOldController(holder.sdvItemShowImg.getController())
                .build();
        holder.sdvItemShowImg.setController(controller);
    }

    class ViewHolder {
        SimpleDraweeView sdvItemShowImg;
        ImageView ivDeleteImg;
        ImageView ivItemAdd;
        RelativeLayout rlItemShow;
    }

}

粗略看了一下一百多行,應該不算多吧- -!這裡使用了Fresco是因為自己的專案裡面用了這個框架,並且這裡針對縮圖做了壓縮處理。

針對如何顯示新增圖片,這裡把邏輯理了一下:如果圖片數量小於最大數量,那麼就讓gridview多顯示一個,並且最後一個item只顯示新增,否則就顯示所有的圖片。控制可見不可見對於記憶體資源的消耗相對較少。

介面卡就是原生的介面卡,我在裡面寫了一個介面的實現,用於在外部暴露一個入口來重新整理圖片。這裡主要使用了觀察者模式,不懂的同學自行學習介面回撥。這裡不再贅述。

看一下我定義的介面:

public interface FreshImgCallBack {

    void previewImg(int position);//用於預覽圖片

    void updateGvImgShow(int position);//用於重新整理GridView

    void openGallery();//用於開啟相簿

}

然後我們在Activity裡面去實現它

public class MainActivity extends AppCompatActivity implements FreshImgCallBack {

    private static final int REQUEST_CODE_GALLERY = 100;//開啟相簿
    private static final int REQUEST_CODE_PREVIEW = 101;//預覽圖片

    private GridView gvImage;
    private ImgGridAdapter adapter;
    private ArrayList<String> imgList = new ArrayList<>();
    private final static int maxImgSize = 5;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        gvImage = (GridView) findViewById(R.id.gvImage);
        adapter = new ImgGridAdapter(this, imgList, maxImgSize);
        adapter.setImgShowFresh(this);//實現重新整理介面
        gvImage.setAdapter(adapter);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case REQUEST_CODE_GALLERY:
                if (resultCode == RESULT_OK) {
                    imgList.clear();//不可直接指向
                    for (int i = Album.parseResult(data).size() - 1; i < 0; i++) {
                        imgList.add(Album.parseResult(data).get(i));//控制圖片順序
                    }
                    adapter.notifyDataSetChanged();
                }
                break;
        }
    }

    //更新圖片:當前用於刪除
    @Override
    public void updateGvImgShow(int position) {
        imgList.remove(position);
        adapter.notifyDataSetChanged();
    }

    @Override
    public void openGallery() {
        Album.album(this)//開啟相簿
                .requestCode(REQUEST_CODE_GALLERY)
                .toolBarColor(ContextCompat.getColor(this, R.color.colorPrimary))
                .statusBarColor(ContextCompat.getColor(this, R.color.colorPrimaryDark))
                .selectCount(maxImgSize)
                .columnCount(3)
                .camera(true)
                .checkedList(imgList)
                .start();
    }

    @Override
    public void previewImg(int position) {
        Album.gallery(this)//預覽圖片
                .requestCode(REQUEST_CODE_PREVIEW)
                .toolBarColor(ContextCompat.getColor(this, R.color.colorPrimary))
                .statusBarColor(ContextCompat.getColor(this, R.color.colorPrimaryDark))
                .checkedList(imgList)
                .currentPosition(position)
                .checkFunction(false)
                .start();
    }

}

然後大功告成,這個邏輯應該是很簡單的吧,實現方式應該也很簡單。然後對於相簿的功能,我引入的框架地址在文章頭部已經標出來了。使用方法在github上面都寫的很清楚。如果需要的話我後期會在本文下面列出使用教程。

相關推薦

選擇圖片功能支援拍照

在網上找了很多第三方的相簿拍照框架,都不盡人意,最後終於找到了一個比較好的框架,並且整合到了自己的demo中,花了兩天的時間吧感覺挺值的。老規矩不說廢話,直接上程式碼。 感謝某開源庫的作者:Alum 思路 目錄 先看目錄,我儘可能的在自己力所能及的範圍

移動端html5圖片方法更好的相容IOS和微信

<!doctype html>  <html>  <head>  <meta charset="utf-8">  <meta name="viewport" content="width=device-width, initial-scale=1, ma

專案實戰之強大的網路請求框架okGo使用詳解(六):擴充套件專案okServer,更強大的下載功能支援斷點和工管理

OkGo與OkDownload的區別就是,OkGo只是簡單的做一個下載功能,不具備斷點下載,暫停等操作,但是這在很多時候已經能滿足需要了。 而有些app需要有一個下載列表的功能,就像迅雷下載一樣,每個下載任務可以暫停,可以繼續,可以重新下載,可以有下載優先順序,這時候OkDownload就有

淘淘商城第二天—完成商品新增功能 商品類目選擇 圖片 圖片伺服器搭建 kindEditor富文字編輯器的使用 商品新增功能

1、實現商品類目選擇功能 1.1需求 在商品新增頁面,點選“選擇類目”顯示商品類目列表: 請求初始化樹形控制元件的url:/item/cat/list 1.2 EasyUI tree資料結構 資料結構中必須包含: Id:節點id Text:節

移動端實現相機喚起及圖片功能(包括微信)

前言 目前有個需求是圖片拍照上傳的功能,但是我就是死活掉不起相機。。。總是開啟的是檔案目錄OR上傳圖片。。。。而不是相機。。。 所以對比了下 程式碼: 參考了百度移動端實現方式。。。程式碼很簡單,對就這一句! <input type="file" acce

端同時文字和圖片到伺服器,伺服器接收並處理

(更簡單的方法,點選安卓端同時上傳圖片和文字,伺服器接收並處理(二)) 之前看了很多部落格,找到的無非就是要麼只上傳json,要麼只上傳圖片。碰了許多的壁,因此我這裡寫一下自己已經測試成功的程式碼。 Android端使用Post上傳圖片和json程式碼 注

PHP圖片功能實現

php file 圖片上傳 上傳圖片功能:獲取當前文件夾位置,上傳到當前文件夾下為了上傳後文件名重復導致覆蓋,上傳後更改名字為:當前時間+原文件名只允許gif、jpeg、bmg、jpg格式的文件上傳<form name="frm1" enctype="multipart/form-data"

android之使用GridView+仿微信圖片功能(附源代碼)

相冊 ada nbu [] for round pen fromfile idt   由於工作要求最近在使用GridView完成圖片的批量上傳功能,我的例子當中包含仿微信圖片上傳、拍照、本地選擇、相片裁剪等功能,如果有需要的朋友可以看一下,希望我的實際經驗能對您有所幫助。

jquery圖片功能

jquery圖片上傳功能關於jquery圖片上傳功能呢,我引入了jquery.min.js jquery-1.8.3.min.js jquery.ui.widget.js jquery.iframe-transport.js jquery.fileupload.js上傳圖片的代碼:圖片上傳成功之後,可以選擇刪

Vue2.0 引用 exif.js 實現調用攝像頭進行拍照功能以及圖片功能

[0 complete num else imp ada blob can isf vue組件代碼 <template> <div> <div style="padding:20px;"> <div cla

jq圖片功能

focus turn creat css regex extend lba undefine fine //圖片上傳功能jQuery.fn.extend({ uploadPreview: function (opts) { var _self = thi

ssm整合-圖片功能(轉)

需要 PE 添加用戶 名稱 simple target url 完整 dsi 本文介紹 ssm (Spring+SpringMVC+Mybatis)實現上傳功能。 以一個添加用戶的案例介紹(主要是將上傳文件)。 一、需求介紹 我們要實現添加用戶的時候上傳圖片(其實任何文件都

php做圖片功能

圖片預覽 怎樣 emp put html5 .org input pro splay 今天來做一個圖片上傳功能的插件,首先做一個html文件:text.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit

elementUI+koa實現圖片功能

elementUI中的上傳元件為: 大家可以先在自己的專案中執行一下餓了麼上傳元件 <el-upload action="https://jsonplaceholder.typicode.com/posts/" list-type="picture-card" :o

給dedecms廣告管理中增加圖片功能

dedecms的廣告管理功能稍微有點次,本文就是在dedecms廣告管理原有的基礎上增加廣告圖片上傳功能。 安裝方法,對應自己的dedecms版本下載對應的編碼然後解壓把裡面的檔案放在後臺目錄覆蓋即可。 效果圖: 使用辦法:下載相應的版本,覆蓋到對應的目錄。即可,親測無誤 連結:h

CKEditor4.7之使用Java實現圖片功能

1.官網下載CKEditor,基礎包,標準包,全包選擇其一。地址:https://ckeditor.com/ckeditor-4/download/ 2.下載檔案後將其解壓至WebRoot資料夾下,解壓前可以新建一個包檔案FckEditor 3.開啟ckeditor\plugin

使用editor_md支援markdown元件以及其中的圖片功能

一、editor.md的下載與安裝 下載地址 安裝使用 裡面有多個資料夾,在引入的時候,我們不需要examples示例、docs、tests等資料夾。 引用完畢後目錄: 我也試過指引用css和js檔案,頁面只會顯示大概的內容,但是功能不能使用,如字型圖示

使用 MultipartFile 結合 (formData物件、Blob物件) 實現圖片功能簡介

圖片上傳功能的具體實現(當然檔案也一樣): MultipartFile ,這個類可以完全接收到前臺傳過來的圖片資料。 MultipartFile 通過 MultipartFile .transferTo( new File()), 僅需要這步驟,就可以把圖片存到伺

記錄一次使用form表單完成圖片功能(相容ie9)

1.前臺頁面 <div class="dform_con" style="position: relative;" id="uploadform"> <iframe id="file_upload_return" style="d

layui-圖片,可使用選擇圖片->圖片圖片,刪除圖片(轉載)

原文地址:https://gitee.com/AMortal/codes/qt8m6zk30u1g4evr95jhx13 <!DOCTYPE html> <html> <head> <meta