Android Photo Selection interface

Source: Internet
Author: User

Package cc.vv.btongbaselibrary.ui.view.imagepicker;

Import Android. Manifest;
Import Android.animation.Animator;
Import Android.animation.AnimatorListenerAdapter;
Import Android.animation.ObjectAnimator;
Import android.app.Activity;
Import Android.app.AlertDialog;
Import Android.content.DialogInterface;
Import android.content.Intent;
Import Android.content.pm.PackageManager;
Import android.content.res.Configuration;
Import Android.graphics.Color;
Import Android.net.Uri;
Import Android.os.Build;
Import Android.os.Bundle;
Import android.os.Environment;
Import android.provider.Settings;
Import android.support.annotation.Nullable;
Import Android.support.v4.app.ActivityCompat;
Import Android.support.v4.content.ContextCompat;
Import android.support.v7.app.AppCompatActivity;
Import Android.support.v7.widget.GridLayoutManager;
Import Android.support.v7.widget.LinearLayoutManager;
Import Android.support.v7.widget.RecyclerView;
Import Android.support.v7.widget.SimpleItemAnimator;
Import android.view.KeyEvent;
Import Android.view.View;
Import Android.view.Window;
Import Android.view.WindowManager;
Import Android.widget.FrameLayout;
Import Android.widget.TextView;
Import Android.widget.Toast;

Import java.util.ArrayList;

Import CC.VV.BTONGBASELIBRARY.R;
Import Cc.vv.btongbaselibrary.ui.view.imagepicker.adapter.FolderAdapter;
Import Cc.vv.btongbaselibrary.ui.view.imagepicker.adapter.ImageAdapter;
Import CC.VV.BTONGBASELIBRARY.UI.VIEW.IMAGEPICKER.ENTRY.FOLDEROBJ;
Import CC.VV.BTONGBASELIBRARY.UI.VIEW.IMAGEPICKER.ENTRY.IMAGEOBJ;
Import Cc.vv.btongbaselibrary.ui.view.imagepicker.model.ImageModel;
Import Cc.vv.btongbaselibrary.vFinal.BTResultCode;

/**
* Image Selection Screen
*
* @author Zml
*/
public class Imageselectoractivity extends Appcompatactivity {

public static final String Key_max_select_count = "Max_select_count";
public static final String key_is_single = "Is_single";
private static final String key_selected = "SELECTED";

Private TextView Tvfoldername;
Private TextView tvconfirm;
Private TextView Tvpreview;
Private Framelayout btnconfirm;
Private Framelayout Btnpreview;
Private Recyclerview rvimage;
Private Recyclerview Rvfolder;
Private View masking;
Private Imageadapter Madapter;
Private Gridlayoutmanager Mlayoutmanager;
Private arraylist<folderobj> mfolders;
Private Folderobj Mfolder;
Private Boolean istosettings = false;
private static final int permission_request_code = 0x0011;

Private Boolean Isopenfolder;
Private Boolean Isinitfolder;
Private Boolean Issingle;
private int mmaxcount;

/**
* Used to receive a list of selected images that came in from the outside. When the user has already selected a picture, now re-open the selector,
* Allow users to pass in previously selected images, and make them default to the selected state.
*/
Private arraylist<string> mselectedimages;

/**
* Start Image Selector
*
* @param activity
* @param requestcode
* @param Issingle is a single choice
* @param the maximum number of maxselectcount pictures, less than or equal to 0 o'clock, an unlimited number, Issingle is false when used.
* @param selected receive a list of selected images that have been sent in from outside. When the user has already selected a picture, now reopen
* Selectors that allow users to pass in previously selected images and leave them selected by default.
*/
public static void openactivity (activity activity, int requestcode,
Boolean issingle, int maxselectcount, arraylist<string> selected) {
Intent Intent = new Intent (activity, imageselectoractivity.class);
Intent.putextra (Key_max_select_count, Maxselectcount);
Intent.putextra (Key_is_single, Issingle);
Intent.putstringarraylistextra (key_selected, SELECTED);
Activity.startactivityforresult (Intent, Requestcode);
}

@Override
protected void OnCreate (@Nullable Bundle savedinstancestate) {
Super.oncreate (savedinstancestate);
Setcontentview (R.layout.activity_image_select);

Intent Intent = Getintent ();
Mmaxcount = Intent.getintextra (key_max_select_count, 0);
Issingle = Intent.getbooleanextra (Key_is_single, false);
Mselectedimages = Intent.getstringarraylistextra (key_selected);

Setstatusbarcolor ();
Initview ();
Initlistener ();
Initimagelist ();
Checkpermissionandloadimages ();
Hidefolderlist ();
Setselectimagecount (0);
}

/**
* Modify status bar color
*/
private void Setstatusbarcolor () {
if (Build.VERSION.SDK_INT >= build.version_codes. LOLLIPOP) {
window window = GetWindow ();
Window.addflags (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
Window.setstatusbarcolor (Color.parsecolor ("#373c3d"));
}
}

private void Initview () {
Rvimage = Findviewbyid (r.id.rv_image);
Rvfolder = Findviewbyid (R.id.rv_folder);
Tvconfirm = Findviewbyid (r.id.tv_confirm);
Tvpreview = Findviewbyid (R.id.tv_preview);
Btnconfirm = Findviewbyid (r.id.btn_confirm);
Btnpreview = Findviewbyid (R.id.btn_preview);
Tvfoldername = Findviewbyid (r.id.tv_folder_name);
masking = Findviewbyid (r.id.masking);
}

private void Initlistener () {
Findviewbyid (R.id.btn_back). Setonclicklistener (New View.onclicklistener () {
@Override
public void OnClick (View v) {
Finish ();
}
});

Btnpreview.setonclicklistener (New View.onclicklistener () {
@Override
public void OnClick (View v) {
arraylist<imageobj> images = new arraylist<> ();
Images.addall (Madapter.getselectimages ());
Topreviewactivity (images, 0);
}
});

Btnconfirm.setonclicklistener (New View.onclicklistener () {
@Override
public void OnClick (View v) {
Confirm ();
}
});

Findviewbyid (R.id.btn_folder). Setonclicklistener (New View.onclicklistener () {
@Override
public void OnClick (View v) {
if (Isinitfolder) {
if (Isopenfolder) {
Closefolder ();
} else {
Openfolder ();
}
}
}
});

Masking.setonclicklistener (New View.onclicklistener () {
@Override
public void OnClick (View v) {
Closefolder ();
}
});
}

/**
* Initialize Picture List
*/
private void Initimagelist () {
Judging the screen orientation
Configuration configuration = Getresources (). GetConfiguration ();
if (configuration.orientation = = configuration.orientation_portrait) {
Mlayoutmanager = new Gridlayoutmanager (this, 3);
} else {
Mlayoutmanager = new Gridlayoutmanager (this, 5);
}

Rvimage.setlayoutmanager (Mlayoutmanager);
Madapter = new Imageadapter (this, mmaxcount, issingle);
Rvimage.setadapter (Madapter);
((Simpleitemanimator) Rvimage.getitemanimator ()). Setsupportschangeanimations (false);
if (mfolders! = null &&!mfolders.isempty ()) {
Setfolder (mfolders.get (0));
}
Madapter.setonimageselectlistener (New Imageadapter.onimageselectlistener () {
@Override
public void Onimageselect (Imageobj image, Boolean isselect, int selectcount) {
Setselectimagecount (SelectCount);
}
});
Madapter.setonitemclicklistener (New Imageadapter.onitemclicklistener () {
@Override
public void Onitemclick (imageobj image, int position) {
Topreviewactivity (Madapter.getdata (), position);
}
});
}

/**
* Initialize picture Folder List
*/
private void Initfolderlist () {
if (mfolders! = null &&!mfolders.isempty ()) {
Isinitfolder = true;
Rvfolder.setlayoutmanager (New Linearlayoutmanager (Imageselectoractivity.this));
Folderadapter adapter = new Folderadapter (imageselectoractivity.this, mfolders);
Adapter.setonfolderselectlistener (New Folderadapter.onfolderselectlistener () {
@Override
public void Onfolderselect (Folderobj folder) {
Setfolder (folder);
Closefolder ();
}
});
Rvfolder.setadapter (adapter);
}
}

/**
* First time Folder List is hidden by default
*/
private void Hidefolderlist () {
Rvfolder.post (New Runnable () {
@Override
public void Run () {
Rvfolder.settranslationy (Rvfolder.getheight ());
Rvfolder.setvisibility (View.gone);
}
});
}

/**
* Set the selected folder while refreshing the picture list
*
* @param folder
*/
private void Setfolder (Folderobj folder) {
if (folder! = NULL && Madapter! = null &&!folder.equals (Mfolder)) {
Mfolder = folder;
Tvfoldername.settext (Folder.getname ());
Rvimage.scrolltoposition (0);
Madapter.refresh (Folder.getimages ());
}
}

private void Setselectimagecount (int count) {
if (count = = 0) {
Btnconfirm.setenabled (FALSE);
Btnpreview.setenabled (FALSE);
Tvconfirm.settext ("OK");
Tvpreview.settext ("preview");
} else {
Btnconfirm.setenabled (TRUE);
Btnpreview.setenabled (TRUE);
Tvpreview.settext ("Preview (" + Count + ")");
if (Issingle) {
Tvconfirm.settext ("OK");
} else if (Mmaxcount > 0) {
Tvconfirm.settext ("OK (" + count + "/" + Mmaxcount + ")");
} else {
Tvconfirm.settext ("OK (" + count + ")");
}
}
}

/**
* Popup Folder List
*/
private void Openfolder () {
if (!isopenfolder) {
Masking.setvisibility (view.visible);
Objectanimator animator = Objectanimator.offloat (Rvfolder, "Translationy",
Rvfolder.getheight (), 0). setduration (300);
Animator.addlistener (New Animatorlisteneradapter () {
@Override
public void Onanimationstart (Animator animation) {
Super.onanimationstart (animation);
Rvfolder.setvisibility (view.visible);
}
});
Animator.start ();
Isopenfolder = true;
}
}

/**
* Close Folder List
*/
private void Closefolder () {
if (Isopenfolder) {
Masking.setvisibility (View.gone);
Objectanimator animator = Objectanimator.offloat (Rvfolder, "Translationy",
0, Rvfolder.getheight ()). Setduration (300);
Animator.addlistener (New Animatorlisteneradapter () {
@Override
public void Onanimationend (Animator animation) {
Super.onanimationend (animation);
Rvfolder.setvisibility (View.gone);
}
});
Animator.start ();
Isopenfolder = false;
}
}

private void confirm () {
if (Madapter = = null) {
Return
}
Because the entity class of the picture is an image, and we are returning a string array, we are going to convert it.
arraylist<imageobj> selectimages = Madapter.getselectimages ();
arraylist<string> images = new arraylist<> ();
for (Imageobj image:selectimages) {
Images.add (Image.getpath ());
}

Click OK to pass the selected image through intent to the previous activity.
Intent Intent = new Intent ();
Intent.putstringarraylistextra (imagegalleryutil.select_result, images);
Setresult (Btresultcode.imageselectoractivity_result_code, intent);
Finish ();
}

private void Topreviewactivity (arraylist<imageobj> images, int position) {
if (images! = null &&!images.isempty ()) {
Previewactivity.openactivity (this, images,
Madapter.getselectimages (), Issingle, mmaxcount, position);
}
}

@Override
protected void OnStart () {
Super.onstart ();
if (istosettings) {
Istosettings = false;
Checkpermissionandloadimages ();
}
}

/**
* Process The results returned by the picture preview page
*
* @param requestcode
* @param ResultCode
* @param data
*/
@Override
protected void Onactivityresult (int requestcode, int resultcode, Intent data) {
Super.onactivityresult (Requestcode, ResultCode, data);
if (Requestcode = = Previewactivity.request_code) {
if (data! = NULL && Data.getbooleanextra (Previewactivity.key_is_confirm, false)) {
If the user clicks OK on the preview page, the user's selected image is returned directly to the user.
Confirm ();
} else {
Otherwise, the current page is refreshed.
Madapter.notifydatasetchanged ();
Setselectimagecount (Madapter.getselectimages (). Size ());
}
}
}

/**
* Screen Switching processing
*
* @param newconfig
*/
@Override
public void onconfigurationchanged (Configuration newconfig) {
Super.onconfigurationchanged (Newconfig);
if (Mlayoutmanager! = NULL && Madapter! = null) {
Switch to vertical screen
if (newconfig.orientation = = configuration.orientation_portrait) {
Mlayoutmanager.setspancount (3);
}
Switch to horizontal screen
else if (newconfig.orientation = = Configuration.orientation_landscape) {
Mlayoutmanager.setspancount (5);
}
Madapter.notifydatasetchanged ();
}
}

/**
* Check permissions and load images from SD card.
*/
private void Checkpermissionandloadimages () {
if (! Environment.getexternalstoragestate (). Equals (environment.media_mounted)) {
Toast.maketext (This, "No picture", Toast.length_long). Show ();
Return
}
int haswritecontactspermission = Contextcompat.checkselfpermission (Getapplication (),
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (haswritecontactspermission = = packagemanager.permission_granted) {
have permission to load the picture.
Loadimageforsdcard ();
} else {
No permissions, request permission.
Activitycompat.requestpermissions (Imageselectoractivity.this,
New String[]{manifest.permission.write_external_storage}, Permission_request_code);
}
}

/**
* Callback that handles permission requests.
*
* @param requestcode
* @param permissions
* @param grantresults
*/
@Override
public void Onrequestpermissionsresult (int requestcode, string[] permissions, int[] grantresults) {
if (Requestcode = = Permission_request_code) {
if (Grantresults.length > 0
&& Grantresults[0] = = packagemanager.permission_granted) {
Allow permissions to load pictures.
Loadimageforsdcard ();
} else {
Deny permission, pop-up prompt box.
Showexceptiondialog ();
}
}
}

/**
* A hint dialog occurs when no permissions, such as exceptions, are displayed.
*/
private void Showexceptiondialog () {
New Alertdialog.builder (This)
. Setcancelable (False)
. Settitle ("hint")
. Setmessage ("the album requires permission to access the store, configure permissions in Settings > Apps > Permissions.") ")
. Setnegativebutton ("Cancel", new Dialoginterface.onclicklistener () {
@Override
public void OnClick (Dialoginterface dialog, int which) {
Dialog.cancel ();
Finish ();
}
}). Setpositivebutton ("OK", new Dialoginterface.onclicklistener () {
@Override
public void OnClick (Dialoginterface dialog, int which) {
Dialog.cancel ();
Startappsettings ();
Istosettings = true;
}
}). Show ();
}

/**
* Load images from SDcard.
*/
private void Loadimageforsdcard () {
Imagemodel.loadimageforsdcard (This, new Imagemodel.datacallback () {
@Override
public void onsuccess (arraylist<folderobj> folders) {
mfolders = folders;
Runonuithread (New Runnable () {
@Override
public void Run () {
if (mfolders! = null &&!mfolders.isempty ()) {
Initfolderlist ();
Setfolder (mfolders.get (0));
if (mselectedimages! = NULL && Madapter! = null) {
Madapter.setselectedimages (mselectedimages);
Mselectedimages = null;
}
}
}
});
}
});
}

/**
* Start the app's settings
*/
private void Startappsettings () {
Intent Intent = new Intent (
Settings.action_application_details_settings);
Intent.setdata (Uri.parse ("package:" + getpackagename ()));
StartActivity (Intent);
}

@Override
public boolean onKeyDown (int keycode, keyevent event) {
if (keycode = = Keyevent.keycode_back && event.getaction () = = Keyevent.action_down && isopenfolder) {
Closefolder ();
return true;
}
Return Super.onkeydown (KeyCode, event);
}
}

Android Photo Selection interface

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.