Android中如何使用ImageEditContainer圖片選擇器,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)圍場,十載網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
1. 簡介
ImageEditButton 和 ImageEditContainer。其中ImageEditContainer 是在 ImageEditButton,兩個組件可單獨使用。
在demo中,實現(xiàn)了 圖片選擇(拍照+本地),裁剪,壓縮,保存本地 以及對已選擇圖片的刪除操作(如果有修改需求,也可以使用對應(yīng)方法進行操作,該方法已添加);
還有就是 針對 6.0權(quán)限的處理問題,本次使用了第三方庫 rxpermissions 進行權(quán)限的處理。
2.項目主目錄結(jié)構(gòu)
3. 功能介紹
MainActivity.java 界面效果圖:
ImageEditContainer 組件初始化:
layImageContainer = (ImageEditContainer) findViewById(R.id.lay_image_container); layImageContainer.setEditListener(this); layImageContainer.setBtnImageResource(R.drawable.icon_picture_photograph); layImageContainer.setTotalImageQuantity(3);
如上代碼,設(shè)置組件的監(jiān)聽,添加按鈕展示圖,以及最多選擇圖片個數(shù)。
implements ImageEditContainer.ImageEditContainerListener 的實現(xiàn)
@Override public void doAddImage() { PopupWindow mCameraPop = SelectPicturePopupWindowUtils.showSelectPicturePopupWindow(this); if (mCameraPop != null) mCameraPop.showAtLocation(layImageContainer, Gravity.BOTTOM, 0, 0); } @Override public void doEditLocalImage(ImageItem imageItem) { if (imageItem != null) { layImageContainer.updateEditedImageItem(imageItem); } } @Override public void doEditRemoteImage(RemoteImageItem remoteImageItem) { if (remoteImageItem != null) { if (remoteImageItem.isDeleted) { layImageContainer.removeRemoteImageItem(remoteImageItem); } else { layImageContainer.updateRemoteImageItem(remoteImageItem); } } }
當圖片選擇數(shù)量達到最大個數(shù)時,添加按鈕會消失。效果圖如下所示:
圖片裁剪 效果圖如下所示:
圖片可拖拽,縮放
圖片選擇好后,進行圖片壓縮:
private void compressImage(String path) { if (TextUtils.isEmpty(path)) { return; } compressImage = compressImage + 1; ImageItem imageItem = new ImageItem(); imageItem.storedPath = path; File file = new File(FilePathUtils.getImageSavePath()); if (!file.exists()) { file.mkdirs(); } String filePath = FilePathUtils.getImageSavePath() + System.currentTimeMillis() + ".jpg"; new Thread(new MyThread(imageItem, path, filePath)).start(); ListimagePaths = new ArrayList<>(); imagePaths.add(path); layImageContainer.addNewImageItem(imageItem); }
圖片壓縮比較慢,要開啟個 線程進行壓縮:
public class MyThread implements Runnable { private String imgPath; private String outPath; private ImageItem imageItem; public MyThread(ImageItem imageItem, String imgPath, String outPath) { this.imageItem = imageItem; this.imgPath = imgPath; this.outPath = outPath; } public void run() { try { BitmapUtil.compressAndGenImage(imgPath, outPath, 500, false); compressImage = compressImage - 1; imageItem.storedPath = outPath; } catch (IOException e) { compressImage = compressImage - 1; e.printStackTrace(); } } }
使用的壓縮方法:
/** * Compress by quality, and generate image to the path specified * * @param imgPath * @param outPath * @param maxSize target will be compressed to be smaller than this size.(kb) * @param needsDelete Whether delete original file after compress * @throws IOException */ public static void compressAndGenImage(String imgPath, String outPath, int maxSize, boolean needsDelete) throws IOException { compressAndGenImage(getBitmap(imgPath), outPath, maxSize); // Delete original file if (needsDelete) { File file = new File(imgPath); if (file.exists()) { file.delete(); } } }
組件 ImageEditContainer 添加圖片方法介紹:
可添加本地和網(wǎng)絡(luò)圖片
/** * 添加本地圖片 * ListstorePaths 本地圖片路徑數(shù)組 */ public void addNewImages(List storePaths) { } /** * 添加本地圖片 */ public void addNewImageItem(ImageItem imageItem) { } /** * 添加網(wǎng)絡(luò)圖片 */ public void addRemoteImageItem(RemoteImageItem remoteImageItem) { }
組件 ImageEditContainer 其他方法介紹:
/** * 設(shè)置組件中 選擇按鈕的寬高 */ public void setImvHeightAndWidth(int height, int width) { } /** * 設(shè)置圖片最大數(shù)量 */ public void setTotalImageQuantity(int totalImageQuantity) { } /** * 設(shè)置圖片展示圖 */ public void setBtnImageResource(int resid) { } /** * 獲取組件中所有圖片對象(本地+網(wǎng)絡(luò)) */ public List
4. 組件代碼
1.ImageEditButton.java
/** * Created by dingzuoqiang on 2017/6/20. * Email: 530858106@qq.com */ public class ImageEditButton extends RelativeLayout { private final static String TAG = "ImageEditButton"; private ImageView imvAddImage; private ImageView imvEdit; private int imvHeight; private int imvWidth; public ImageEditButtonListener editButtonListener; public ImageEditButton(Context context) { this(context, null); } public ImageEditButton(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.image_edit_button_view, this, true); imvHeight = CommonUtil.dip2px(getContext(), 70); imvWidth = imvHeight; imvAddImage = (ImageView) findViewById(R.id.imv_add_image); imvEdit = (ImageView) findViewById(R.id.imv_edit); setImvHeightAndWidth(imvHeight, imvWidth); imvAddImage.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { doEditImage(); } }); imvEdit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { doEditImage2(); } }); } public void setImvHeightAndWidth(int height, int width) { this.imvHeight = height; this.imvWidth = width; ViewGroup.LayoutParams layoutParams = imvAddImage.getLayoutParams(); layoutParams.width = imvHeight; layoutParams.height = imvWidth; imvAddImage.setLayoutParams(layoutParams); } public int getImvHeight() { return imvHeight; } public int getImvWidth() { return imvWidth; } public void setPadding2(int left, int top, int right, int bottom) { this.setPadding(left, top, right, bottom); } public void setBtnImageResource(int resid) { imvAddImage.setImageResource(resid); // ImageLoaderUtils.loadImageFromDrawable(resid, imvAddImage, null); } public void reset() { imvEdit.setVisibility(GONE); } public void setEditButtonListener(ImageEditButtonListener editButtonListener) { this.editButtonListener = editButtonListener; } public BaseImageItem getImageItem() { Object object = this.getTag(); if (object instanceof BaseImageItem) return (BaseImageItem) object; return null; } public void displayUI() { // Object object = this.getTag(); if (object == null) return; if (object instanceof ImageItem) { ImageItem imageItem = (ImageItem) object; if (TextUtils.isEmpty(imageItem.storedPath)) return; File file = new File(imageItem.storedPath); if (file.exists()) { // 其實Glide加載本地圖片和加載網(wǎng)絡(luò)圖片調(diào)用的方法是一樣的,唯一的區(qū)別是說加載SD卡的圖片需要SD卡的權(quán)限,加載網(wǎng)絡(luò)需要網(wǎng)絡(luò)權(quán)限 Glide.with(getContext()).load(file).crossFade().into(imvAddImage); } } else if (object instanceof RemoteImageItem) { // 如果是 remoteImageItem 則需要從讀取圖片,同時不可以裁剪 RemoteImageItem remoteImageItem = (RemoteImageItem) object; Glide.with(getContext()).load(remoteImageItem.thumbUrl).centerCrop().crossFade().into(imvAddImage); } // TODO BaseImageItem baseImageItem = (BaseImageItem) object; displayNoteIcons(baseImageItem); } private void displayNoteIcons(BaseImageItem baseImageItem) { imvEdit.setVisibility(VISIBLE); } private void doEditImage() { if (editButtonListener == null) return; Object object = this.getTag(); if (object == null) { // add image editButtonListener.doAddImage(); } else { // if (object instanceof ImageItem) { editButtonListener.doEditLocalImage((ImageItem) object); } else if (object instanceof RemoteImageItem) { editButtonListener.doEditRemoteImage((RemoteImageItem) object); } } } private void doEditImage2() { if (editButtonListener == null) return; Object object = this.getTag(); if (object != null) { // if (object instanceof ImageItem) { ImageItem imageItem = (ImageItem) object; imageItem.isDeleted = true; editButtonListener.doEditLocalImage(imageItem); } else if (object instanceof RemoteImageItem) { RemoteImageItem remoteImageItem = (RemoteImageItem) object; remoteImageItem.isDeleted = true; editButtonListener.doEditRemoteImage(remoteImageItem); } } } public interface ImageEditButtonListener { public void doAddImage(); public void doEditLocalImage(ImageItem imageItem1); public void doEditRemoteImage(RemoteImageItem remoteImageItem); } }
2.ImageEditContainer.java
/** * Created by dingzuoqiang on 2017/6/20. * Email: 530858106@qq.com */ public class ImageEditContainer extends HorizontalScrollView implements ImageEditButton.ImageEditButtonListener { private final static String TAG = "ImageEditContainer"; public ImageEditContainerListener mEditListener; private int idValue = 0; ImageEditButton imbAddImage; ViewGroup buttonsContainer; private int totalImageQuantity = 3;// 總添加數(shù)量 private int mBtnBgResid = 0; public ImageEditContainer(Context context) { //super(context); this(context, null); } public ImageEditContainer(Context context, AttributeSet attrs) { super(context, attrs); // LayoutInflater.from(context).inflate(R.layout.image_edit_container, this, true); imbAddImage = (ImageEditButton) findViewById(R.id.imb_add_image); imbAddImage.setEditButtonListener(this); // buttonsContainer = (ViewGroup) findViewById(R.id.lay_container); setHorizontalScrollBarEnabled(false); setHorizontalFadingEdgeEnabled(false); } public void setImvHeightAndWidth(int height, int width) { for (int i = 0; i < buttonsContainer.getChildCount(); i++) { ImageEditButton imageEditButton = (ImageEditButton) buttonsContainer.getChildAt(i); if (imageEditButton == null) continue; imageEditButton.setImvHeightAndWidth(height, width); } } public void setTotalImageQuantity(int totalImageQuantity) { if (totalImageQuantity > 0) this.totalImageQuantity = totalImageQuantity; } public void setBtnImageResource(int resid) { mBtnBgResid = resid; imbAddImage.setBtnImageResource(mBtnBgResid); } public List
關(guān)于Android中如何使用ImageEditContainer圖片選擇器問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。