Android照片选择界面

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);    }}

原文地址:https://www.cnblogs.com/Dorr/p/8979820.html

时间: 2024-11-08 21:39:19

Android照片选择界面的相关文章

android 视频播放器选择界面弹出机制

1,file manager与videos识别视频的机制不同 a)   file manager简单根据后缀识别,3gp.mp4和avi分别被认为是三种不同的视频格式,因此会分别弹出视频播放器选择界面 b)   videos中视频识别是按照文件mimetype来设定,3gp属于简化的mp4,可以认为是同一类文件.在android设计里3gp和mp4文件使用同一个parser,两种文件的mimetype 也一致,都是video/mp4.由于android default将3gp和mp4使用同一个m

android中选择控件与选择界面自然过度效果的实现--一种新的交互设计

转载请标明出处: http://blog.csdn.net/jianghejie123/article/details/40648931 在安卓中经常遇到须要选择一个东西的功能,比方选择日期.选择文件,选择地点等,通常我们的做法是使用选择对话框.比方选择日期用datepicker,有时候也使用activity,可是这两种方式都有一个缺点,就是用户非常明显的感觉到了界面之间的切换. 有时候.以下这样的选择数据的交互方式应该会更好些: 事实上上面的app效果来自与CapitaineTrain应用,好

ios开发——实用技术篇Swift篇&amp;照片选择

照片选择 1 // MARK: - 选择照片 2 /*----- 选择照片 ------*/ 3 @IBAction func addImageButtonClick() 4 { 5 let actionSheet = UIActionSheet(title: "请选择", delegate: self, cancelButtonTitle: "取消", destructiveButtonTitle: nil, otherButtonTitles: "从相

android列表选择模式的实现

我们或许曾一次又一次的接到这样的需求,有一堆数据需要用户去选择,并且以列表的方式呈现,根据需求,我们需要单选或者复选列表里面的数据,并且最终取得所选数据作下一步的操作.那么对于这个需求,我们聪明的程序员往往都能想到一些解决方案去处理.譬如我,咳咳,虽然我不是很聪明,但是我想到了. [也许这样实现是对的]通常需要选择的列表数据我都会在adapter所绑定的数据实体内增加一个标记代表是否选中,在点击的时候去遍历并改变adapter中的实体标记,通知更新,然后根据标记在adapter的getView方

Android的配置界面PreferenceActivity

原文地址:http://www.cnblogs.com/zhangdongzi/archive/2012/01/05/2313519.html 我想大家对于android的系统配置界面应该不会陌生吧,即便陌生,那么下面的界面应该似曾相识吧,假若还是不认识,那么也没有关系,我们这一节主要就是介绍并讲解android 中系统配置界面的使用,相信大家看完本节后,一定能知道怎么使用这些东西了. 从上述界面中(其实是一个界面),我们可以看到有2组元素,第一组为:自动更新,更新频率.第二组为:是否登录,账号

Android研究之为基于 x86 的 Android* 游戏选择合适的引擎详解

摘要 游戏开发人员知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中,它们所占的比例超过 90%). 如要跻身该市场,开发速度非常关键. 一些刚起步的独立开发人员更愿意从零开始来开发自己的所有代码:但是为了达到更高的质量而不用花费数年的时间进行开发,其他人可能会选择已有的游戏引擎.上章研究了英特尔 Android* 开发人员指南上的对等应用详解,在选择引擎时,你可以考虑以下几个因素: 成本 - 你

xamarin android 文件选择

调出选择界面: Intent intent = new Intent(Intent.ActionGetContent); intent.AddCategory(Intent.CategoryOpenable); intent.SetType("file/*"); StartActivityForResult(Intent.CreateChooser(intent, "选择备份文件"), 20); 接收选择结果: protected override void OnA

Cocos2d-JS中使用CocosStudio资源——关卡选择界面

在本篇博客中,我们将通过一个在Cocos2d-JS中使用从CocosStudio导出的关卡选择界面资源的例子,来简要介绍以下内容:Button控件,Text控件,PageView控件,即翻页容器的使用. 一.CocosStudio准备 第一步:从官网下载相应的示例,LevelSelection.效果图如下: 第二步:修改其中的一些控件的名称,方便寻找获取,如: 由于官网给的例子中的控件名字有的较复杂,所以可以按照自己的想法进行修改. 第三步:发布资源.注意发布设置中应该将数据格式改为JSON格式

android单选按钮选择,RadioGroup,radioButton

android单选按钮选择,RadioGroup,radioButton 14. 四 / android基础 / 没有评论 单选布局绑定 如何识别选择