安卓選擇圖片上傳功能【支援多選拍照預覽等】
在網上找了很多第三方的相簿拍照框架,都不盡人意,最後終於找到了一個比較好的框架,並且整合到了自己的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