Android實(shí)現(xiàn)圖片選擇器功能
本文實(shí)例為大家分享了Android實(shí)現(xiàn)圖片選擇器功能的具體代碼,供大家參考,具體內(nèi)容如下
圖片選擇功能用的是GitHub上的依賴庫(kù),網(wǎng)址
先來(lái)看下我運(yùn)行的效果圖如下所示:
該依賴庫(kù)是Android平臺(tái)上拍照/錄像,圖片/視頻選擇,編輯和壓縮的一站式解決方案。
添加依賴,在app->build.gradle里面添加依賴
//圖片/視頻選擇、預(yù)覽、編輯與拍照 implementation 'com.github.guoxiaoxing:phoenix:1.0.15'
初始化:
public class App extends Application { @Override public void onCreate() { super.onCreate(); Phoenix.config() .imageLoader(new ImageLoader() { @Override public void loadImage(Context mContext, ImageView imageView , String imagePath, int type) { Glide.with(mContext) .load(imagePath) .into(imageView); } }); } }
開啟功能:
private void callUpSelecter(boolean isCamera, int type, int REQUEST_CODE) { if (TextUtils.isEmpty(fileID)) { Phoenix.with() .theme(PhoenixOption.THEME_RED)// 主題 .fileType(MimeType.ofImage())//顯示的文件類型圖片、視頻、圖片和視頻 .maxPickNumber(9)// 最大選擇數(shù)量 .minPickNumber(0)// 最小選擇數(shù)量 .spanCount(4)// 每行顯示個(gè)數(shù) .enablePreview(true)// 是否開啟預(yù)覽 .enableCamera(isCamera)// 是否開啟拍照 .enableAnimation(false)// 選擇界面圖片點(diǎn)擊效果 .enableCompress(true)// 是否開啟壓縮 .compressPictureFilterSize(300)//多少kb以下的圖片不壓縮 .compressVideoFilterSize(2018)//多少kb以下的視頻不壓縮 .thumbnailHeight(160)// 選擇界面圖片高度 .thumbnailWidth(160)// 選擇界面圖片寬度 .enableClickSound(false)// 是否開啟點(diǎn)擊聲音 .pickedMediaList(add_lists)// 已選圖片數(shù)據(jù) .videoFilterTime(0)//顯示多少秒以內(nèi)的視頻 .mediaFilterSize(0)//顯示多少kb以下的圖片/視頻,默認(rèn)為0,表示不限制 .start(UploadMorePicActivity.this, type, REQUEST_CODE); } }
獲取結(jié)果:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 889 && resultCode == RESULT_OK) {//相冊(cè) //返回的數(shù)據(jù) List<MediaEntity> result = Phoenix.result(data); Log.e("=====result==", result.toString()); add_lists.clear(); add_lists.addAll(result); adapter.updateItems(add_lists); btnOkEnable(add_lists); } else if (requestCode == 899 && resultCode == RESULT_OK) {//拍照 List<MediaEntity> result = Phoenix.result(data); add_lists.addAll(result); adapter.updateItems(add_lists); btnOkEnable(add_lists); } }
recyclerView的適配基類:
/** * recyclerView適配器基類 */ public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public OnRecyclerViewItemClickListener mOnItemClickListener = null; public OnRecyclerViewItemClickListenerData listenerData; /** * 數(shù)據(jù)集合 */ protected List<T> mItems; protected Context mContext; /** * 構(gòu)造函數(shù) */ public BaseRecyclerAdapter(Context context) { this.mContext = context; mItems = new ArrayList<>(); } /** * 返回?cái)?shù)據(jù)集 */ public List<T> getList() { return mItems; } /** * 添加單條數(shù)據(jù) */ public void addItem(T item) { if (item == null) return; mItems.add(mItems.size(), item); notifyItemInserted(mItems.size()); } /** * 追加數(shù)據(jù)集合 */ public void addItems(List<T> items) { if (items == null) return; this.mItems.addAll(items); notifyDataSetChanged(); } public boolean containsAll(List<T> items) { return mItems.containsAll(items); } /** * 更新指定行數(shù)據(jù) */ public void updateItem(T tasks, int position) { if (tasks == null) return; mItems.set(position, tasks); notifyItemChanged(position); } /** * 更新全部數(shù)據(jù) */ public void updateItems(List<T> items) { if (items == null) return; this.mItems.clear(); this.mItems.addAll(items); notifyDataSetChanged(); } /** * 移除指定行數(shù)據(jù) */ public void removeItem(int index) { mItems.remove(index); notifyItemRemoved(index); notifyItemRangeChanged((index - 1) >= 0 ? index - 1 : 0, mItems.size()); } public void getView(int position, RecyclerView.ViewHolder viewHolder, int type, T item) { } /** * 返回指定行數(shù)據(jù) */ public T getItem(int location) { if (mItems == null || mItems.isEmpty()) { return null; } else { return mItems.get(location); } } /** * 返回?cái)?shù)據(jù)集合總數(shù) */ @Override public int getItemCount() { return mItems == null ? 0 : mItems.size(); } /** * 清除全部數(shù)據(jù) */ public void clear() { mItems.clear(); notifyDataSetChanged(); } public static interface OnRecyclerViewItemClickListener { void onItemClick(View view, String data); } public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) { this.mOnItemClickListener = listener; } public interface OnRecyclerViewItemClickListenerData<T> { void onItemClickData(View view, T data); } public void setOnItemClickListenerData(OnRecyclerViewItemClickListenerData listener) { listenerData = listener; } }
顯示選擇的圖片的適配器:
/** * Created by YuShuangPing on 2018/7/16. */ public class UpLoadMorePicAdapter extends BaseRecyclerAdapter<MediaEntity> { /** * 構(gòu)造函數(shù) * * @param context */ public UpLoadMorePicAdapter(Context context) { super(context); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view= LayoutInflater.from(mContext).inflate(R.layout.item_upload_more_pic_refresh,parent,false); return new ViewHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { if (holder instanceof ViewHolder){ final ViewHolder viewHolder= (ViewHolder) holder; if(mItems.size()<9&&position==mItems.size()){ Glide.with(mContext).load(R.mipmap.add_consumer).centerCrop().into(viewHolder.iv_pic); }else{ final MediaEntity mediaEntity=mItems.get(position); Glide.with(mContext).load(mediaEntity.getLocalPath()).centerCrop().into(viewHolder.iv_pic); } viewHolder.iv_pic.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (listenerData!=null){ listenerData.onItemClickData(viewHolder.iv_pic,position); } } }); } } @Override public int getItemCount() { return mItems.size()<9? mItems.size()+1:9; } class ViewHolder extends RecyclerView.ViewHolder{ private CustomHeightImageView iv_pic; public ViewHolder(View view) { super(view); iv_pic= (CustomHeightImageView) view.findViewById(R.id.iv_pic); } } }
適配器布局文件:
R.layout.item_upload_more_pic_refresh
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <com.sinosig.ygqd.widget.CustomHeightImageView android:id="@+id/iv_pic" android:layout_width="230px" android:layout_height="230px" android:layout_marginBottom="28.8px" app:scale="1" /> </LinearLayout>
Activity中的代碼:
public class UploadMorePicActivity extends AppCompatActivity { private RecyclerView rl_pic; private UpLoadMorePicAdapter adapter; private List<MediaEntity> add_lists = new ArrayList<>(); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); rl_pic = (RecyclerView) findViewById(R.id.rl_pic); adapter = new UpLoadMorePicAdapter(this); rl_pic.setLayoutManager(new GridLayoutManager(this, 4)); rl_pic.setAdapter(adapter); adapter.updateItems(add_lists); adapter.setOnItemClickListenerData(new BaseRecyclerAdapter.OnRecyclerViewItemClickListenerData() { @Override public void onItemClickData(View view, Object data) { int position = (int) data; if (position >= add_lists.size()) { callUpSelecter(false, PhoenixOption.TYPE_PICK_MEDIA, 889); } else { } } }); } private void callUpSelecter(boolean isCamera, int type, int REQUEST_CODE) { if (TextUtils.isEmpty(fileID)) { Phoenix.with() .theme(PhoenixOption.THEME_RED)// 主題 .fileType(MimeType.ofImage())//顯示的文件類型圖片、視頻、圖片和視頻 .maxPickNumber(9)// 最大選擇數(shù)量 .minPickNumber(0)// 最小選擇數(shù)量 .spanCount(4)// 每行顯示個(gè)數(shù) .enablePreview(true)// 是否開啟預(yù)覽 .enableCamera(isCamera)// 是否開啟拍照 .enableAnimation(false)// 選擇界面圖片點(diǎn)擊效果 .enableCompress(true)// 是否開啟壓縮 .compressPictureFilterSize(300)//多少kb以下的圖片不壓縮 .compressVideoFilterSize(2018)//多少kb以下的視頻不壓縮 .thumbnailHeight(160)// 選擇界面圖片高度 .thumbnailWidth(160)// 選擇界面圖片寬度 .enableClickSound(false)// 是否開啟點(diǎn)擊聲音 .pickedMediaList(add_lists)// 已選圖片數(shù)據(jù) .videoFilterTime(0)//顯示多少秒以內(nèi)的視頻 .mediaFilterSize(0)//顯示多少kb以下的圖片/視頻,默認(rèn)為0,表示不限制 .start(UploadMorePicActivity.this, type, REQUEST_CODE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 889 && resultCode == RESULT_OK) {//相冊(cè) //返回的數(shù)據(jù) List<MediaEntity> result = Phoenix.result(data); Log.e("=====result==", result.toString()); add_lists.clear(); add_lists.addAll(result); adapter.updateItems(add_lists); btnOkEnable(add_lists); } }
自定義ImageView:
public class CustomHeightImageView extends android.support.v7.widget.AppCompatImageView { float scale = 0; public CustomHeightImageView(Context context) { super(context); } public CustomHeightImageView(Context context, float scale) { super(context); this.scale = scale; } public CustomHeightImageView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CustomHeightRelativeLayout); scale = a.getFloat(R.styleable.CustomHeightRelativeLayout_scale, -1f); // float scale = a. } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (scale == -1) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } else { super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec( (int) (MeasureSpec.getSize(widthMeasureSpec) * (scale)), MeasureSpec.getMode(widthMeasureSpec))); } } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android自定義HorizontalScrollView打造超強(qiáng)Gallery效果
這篇文章主要介紹了Android自定義HorizontalScrollView打造圖片橫向滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05詳解Flutter WebView與JS互相調(diào)用簡(jiǎn)易指南
這篇文章主要介紹了詳解Flutter WebView與JS互相調(diào)用簡(jiǎn)易指南,分為JS調(diào)用Flutter和Flutter調(diào)用JS,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04android第三方分享方式的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了android第三方分享方式的簡(jiǎn)單實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10android自定義進(jìn)度條漸變色View的實(shí)例代碼
這篇文章主要介紹了android自定義進(jìn)度條漸變色View的實(shí)例代碼,有需要的朋友可以參考一下2014-01-01Android使用Notification實(shí)現(xiàn)普通通知欄(一)
這篇文章主要為大家詳細(xì)介紹了Android使用Notification實(shí)現(xiàn)普通通知欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Android開發(fā)中的數(shù)據(jù)庫(kù)事務(wù)用法分析
這篇文章主要介紹了Android開發(fā)中的數(shù)據(jù)庫(kù)事務(wù)用法,分析了Android數(shù)據(jù)庫(kù)事務(wù)的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-06-06Android實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)學(xué)生管理系統(tǒng)的相關(guān)代碼,供大家學(xué)習(xí)借鑒,感興趣的小伙伴們可以參考一下2016-03-03android studio 3.0 service項(xiàng)目背景音樂(lè)實(shí)現(xiàn)
這篇文章主要介紹了android studio 3.0中service項(xiàng)目實(shí)現(xiàn)插入背景音樂(lè)的方法。2017-11-11Android實(shí)現(xiàn)3D標(biāo)簽云簡(jiǎn)單效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)3D標(biāo)簽云簡(jiǎn)單效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05