Android照片選擇介面

來源:互聯網
上載者:User

標籤:raw   cape   resources   nis   ast   this   配置   car   final   

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;

/**
* 圖片選擇介面
*
* @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;

/**
* 用於接收從外面傳進來的已選擇的圖片列表。當使用者原來已經有選擇過圖片,現在重新開啟選取器,
* 允許使用者把先前選過的圖片傳進來,並把這些圖片預設為選中狀態。
*/
private ArrayList<String> mSelectedImages;

/**
* 啟動圖片選取器
*
* @param activity
* @param requestCode
* @param isSingle 是否單選
* @param maxSelectCount 圖片的最大選擇數量,小於等於0時,不限數量,isSingle為false時才有用。
* @param selected 接收從外面傳進來的已選擇的圖片列表。當使用者原來已經有選擇過圖片,現在重新開啟
* 選取器,允許使用者把先前選過的圖片傳進來,並把這些圖片預設為選中狀態。
*/
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);
}

/**
* 修改狀態列顏色
*/
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();
}
});
}

/**
* 初始化圖片列表
*/
private void initImageList() {
// 判斷螢幕方向
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);
}
});
}

/**
* 初始化圖片資料夾清單
*/
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);
}
}

/**
* 剛開始的時候資料夾清單預設是隱藏的
*/
private void hideFolderList() {
rvFolder.post(new Runnable() {
@Override
public void run() {
rvFolder.setTranslationY(rvFolder.getHeight());
rvFolder.setVisibility(View.GONE);
}
});
}

/**
* 設定選中的檔案夾,同時重新整理圖片列表
*
* @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("確定");
tvPreview.setText("預覽");
} else {
btnConfirm.setEnabled(true);
btnPreview.setEnabled(true);
tvPreview.setText("預覽(" + count + ")");
if (isSingle) {
tvConfirm.setText("確定");
} else if (mMaxCount > 0) {
tvConfirm.setText("確定(" + count + "/" + mMaxCount + ")");
} else {
tvConfirm.setText("確定(" + count + ")");
}
}
}

/**
* 彈出資料夾清單
*/
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;
}
}

/**
* 收合資料夾清單
*/
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;
}
//因為圖片的實體類是Image,而我們返回的是String數組,所以要進行轉換。
ArrayList<ImageObj> selectImages = mAdapter.getSelectImages();
ArrayList<String> images = new ArrayList<>();
for (ImageObj image : selectImages) {
images.add(image.getPath());
}

//點擊確定,把選中的圖片通過Intent傳給上一個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();
}
}

/**
* 處理圖片預覽頁返回的結果
*
* @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)) {
//如果使用者在預覽頁點擊了確定,就直接把使用者選中的圖片返回給使用者。
confirm();
} else {
//否則,就重新整理當前頁面。
mAdapter.notifyDataSetChanged();
setSelectImageCount(mAdapter.getSelectImages().size());
}
}
}

/**
* 橫豎屏切換處理
*
* @param newConfig
*/
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (mLayoutManager != null && mAdapter != null) {
//切換為豎屏
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
mLayoutManager.setSpanCount(3);
}
//切換為橫屏
else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
mLayoutManager.setSpanCount(5);
}
mAdapter.notifyDataSetChanged();
}
}

/**
* 檢查許可權並載入SD卡裡的圖片。
*/
private void checkPermissionAndLoadImages() {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(this, "沒有圖片", Toast.LENGTH_LONG).show();
return;
}
int hasWriteContactsPermission = ContextCompat.checkSelfPermission(getApplication(),
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (hasWriteContactsPermission == PackageManager.PERMISSION_GRANTED) {
//有許可權,載入圖片。
loadImageForSDCard();
} else {
//沒有許可權,申請許可權。
ActivityCompat.requestPermissions(ImageSelectorActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
}
}

/**
* 處理許可權申請的回調。
*
* @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) {
//允許許可權,載入圖片。
loadImageForSDCard();
} else {
//拒絕許可權,彈出提示框。
showExceptionDialog();
}
}
}

/**
* 發生沒有許可權等異常時,顯示一個提示dialog.
*/
private void showExceptionDialog() {
new AlertDialog.Builder(this)
.setCancelable(false)
.setTitle("提示")
.setMessage("該相簿需要賦予訪問儲存的許可權,請到“設定”>“應用”>“許可權”中配置許可權。")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
finish();
}
}).setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
startAppSettings();
isToSettings = true;
}
}).show();
}

/**
* 從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;
}
}
}
});
}
});
}

/**
* 啟動應用的設定
*/
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照片選擇介面

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.