国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android自定義組件獲取本地圖片和相機拍照圖片

2019-12-12 04:00:26
字體:
來源:轉載
供稿:網友

iOS中有封裝好的選擇圖片后長按出現動畫刪除效果,效果如下 

這里寫圖片描述 

而Android找了很久都沒有找到有這樣效果的第三方組件,最后懶得找了還是自己實現這效果吧

選擇圖片后還可對圖片進行剪裁 

這里寫圖片描述

當然,代碼中還有很多不完善的地方,我接下來會繼續完善這個組件的
已經上傳到開源社區,歡迎大家來Star啊~

Demo源碼:傳送門

設計中的碰到的一些問題和解決思路

1.如何讓加號圖片顯示在GridView最后面

首先在調用GridAdapter構造方法時就加載加號圖片

 /** * 圖片適配器 * @param context 上下文 * @param imagesum 最大可添加圖片數 */ public GridAdapter(Context context, int imagesum) { this.context = context; this.imageSum = imagesum; // 加號圖片 mAddBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_add_image); }

然后在getCount()方法里對圖片數據集合加1,在該位置上添加加號圖片

 @Override public int getCount() { // 數據集合加一,在該位置上添加加號 return imageItemData == null ? 0 : imageItemData.size() + 1; }

最后在getView()方法中,每次顯示圖片時都對數據集合中的元素數量進行判斷,如果數據集合的數量大于position,則表示需要顯示加號圖片

 if (imageItemData != null && imageItemData.size() > position) { // 正常圖片 } else { // 加號圖片 }

這樣就能保證加號圖片一直在GridView最后一個item上

2.如何顯示出刪除按鈕

在item布局時,在圖片的右上角覆蓋一層刪除按鈕,在Adapter中對這個圖片的顯示和隱藏進行處理

/** 判斷是否顯示清除按鈕 true=顯示 */ private boolean showImageClear = false; //對外提供顯示和隱藏的方法 /** * 設置圖片顯示狀態 * @param clear 圖片狀態 */ public void setClearImgShow(boolean clear) { showImageClear = clear; } /** * 圖片顯示狀態 * @return 狀態 true=顯示 */ public boolean getClearImgShow() { return showImageClear; }

刪除按鈕默認不顯示,當用戶長按圖片時就顯示出來

// 長按顯示刪除按鈕mGridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { if (!(position == gridAdapter.imageItemData.size())) { // 如果刪除按鈕已經顯示了則不再設置 if (!gridAdapter.getClearImgShow()) { gridAdapter.setClearImgShow(true); gridAdapter.notifyDataSetChanged(); } } // 返回true,停止事件向下傳播 return true; }});

這里需要攔截長按點擊事件,把返回值設置為true,因為我們還設置了點擊事件的監聽,如果不攔截事件,那么長按事件結束后還會同時執行單擊事件

最后關鍵的一點,在GridAdapter類中的getView方法里進行控制,通過getClearImgShow方法獲取刪除圖片是否需要顯示,如果返回為true則顯示出來,并獲取動畫實例,讓圖片開始執行動畫效果

 if (imageItemData != null && imageItemData.size() > position) { // 正常顯示 // 判斷是否需要顯示刪除按鈕 ,為true則顯示,并執行動畫效果 if (getClearImgShow()) { holder.imgclear.setVisibility(View.VISIBLE); CustomRotateAnim anim = CustomRotateAnim.getCustomRotateAnim(); anim.setDuration(300); anim.setRepeatCount(2); anim.setInterpolator(new LinearInterpolator()); // 設置為勻速 holder.img.startAnimation(anim); } else { // 關閉動畫,隱藏刪除按鈕 holder.img.clearAnimation(); holder.imgclear.setVisibility(View.GONE); } holder.img.setImageBitmap(PhotoBitmapUtil.getCompressPhoto(imageItemData.get(position))); } else { ......省略...... }

3.如何設置當圖片達到最大數時,隱藏加號按鈕

在使用GridAdapter的時候,調用方需要傳入一個最大圖片數:

gridAdapter = new GridAdapter(MainActivity.this, 8);mGridView.setAdapter(gridAdapter);

然后在GridAdapter中接收這個最大圖片數,并在getView()方法中對加號圖片的顯示進行管控

 if (imageItemData != null && imageItemData.size() > position) { // 顯示選擇的圖片 ......省略...... } else { // 顯示加號按鈕 // 圖片數達到最大限制時隱藏加號圖片 if (imageItemData.size() != imageSum) { holder.imgclear.setVisibility(View.GONE); // 不顯示刪除按鈕 holder.img.clearAnimation(); // 去除動畫 holder.img.setImageBitmap(mAddBitmap); } }

“gridAdapter.getCount() - 1”是因為我們在添加加號圖片時加了1,所以使用時需要減1

 // 點擊圖片 mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 如果單擊時刪除按鈕處在顯示狀態,則隱藏它 if (gridAdapter.getClearImgShow()) {  gridAdapter.setClearImgShow(false);  gridAdapter.notifyDataSetChanged(); } else {  if (gridAdapter.getCount() - 1 == position) {  // 判斷是否達到了可添加圖片最大數  if (!(gridAdapter.imageItemData.size() == gridAdapter.imageSum)) {  selectPhoto.showPopupSelect(mGridView);  }  } else {  popupViewGridPhoto(position);  } } } });

4.如何降低圖片加載時的內存消耗量

要在GridView中顯示那么多的圖片,肯定是需要多圖片進行壓縮處理的,不然很容易出現OOM錯誤
這里通過質量壓縮,降低加載圖片的內存大小

 /** * 把原圖按1/5的比例壓縮 * * @param path 原圖的路徑 * @return 壓縮后的圖片 */ public static Bitmap getCompressPhoto(String path) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = false; options.inSampleSize = 5; // 圖片的長寬設置為原來的五分之一 Bitmap bmp = BitmapFactory.decodeFile(path, options); options = null; return bmp; }

也可以通過其它的方式,可以參考這篇博客《Android避免內存溢出(Out of Memory)方法總結》

5.如何防止部分手機拍照后圖片被旋轉的問題

在測試中,部分三星手機拍攝完照片后會把圖片旋轉90度,這個設計實在是坑,為此還得專門為了這個問題進行處理,每次拍攝完照片后都要獲取圖片的旋轉角度,如果圖片被旋轉了的話就再旋轉回去
可以參考這篇博客
《Android 解決部分手機拍照后獲取的圖片被旋轉的問題》

6.如何讓圖片左右搖擺

想要實現圖片左右搖擺的效果,需要我們自定義Animation
可參看這篇博客
《Android 自定義Animation實現View搖擺效果》

這里就先介紹這么多,詳細的解釋代碼注釋中都有的,就不再多說啦

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 商都县| 寻乌县| 云霄县| 新巴尔虎左旗| 贵南县| 阿荣旗| 江华| 临猗县| 玛沁县| 阳春市| 鹤岗市| 南投县| 康乐县| 昭苏县| 汉寿县| 界首市| 观塘区| 济阳县| 潼关县| 读书| 鹿邑县| 土默特右旗| 水富县| 长武县| 台安县| 永定县| 富民县| 威远县| 莱芜市| 瑞金市| 莲花县| 普陀区| 于都县| 遵化市| 泌阳县| 吴堡县| 南涧| 漯河市| 山西省| 宜兴市| 龙胜|