美文网首页伴职创作「banzhi.cc」书客创作[ibooker.cc]Android开发经验谈
【Android】图片选择(拍照+本地相册)Dialog封装,使

【Android】图片选择(拍照+本地相册)Dialog封装,使

作者: 吾非言 | 来源:发表于2017-10-11 10:46 被阅读427次

    作者:邹峰立,微博:zrunker,邮箱:zrunker@yahoo.com,微信公众号:书客创作,个人平台:www.ibooker.cc

    本文选自书客创作平台第19篇文章。阅读原文

    书客创作

    对于大多数Android开发者来说,(拍照+本地相册)选择图片是再平常不过的功能,几乎每一个APP都会用到,但是现今的Android市场,机型,版本等各个方面都存在着不同,那么如何找到一个合适自己的方式呢?下面我们将封装一套属于自己的图片选择器。

    一、选择图片

    选择图片,无外乎拍照和本地相册选择,那么在Android手机中如何实现呢?

    A、启动本地相册(2种方式)

    第一种方式:

    Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    Activity.startActivity(intent);
    

    第二种方式:

    Intent intent =new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    Activity.startActivity(intent);
    

    B、启动拍照

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    Activity.startActivity(intent);
    

    注意:要在清单文件AndroidManifest.xml添加拍照权限android.permission.CAMERA。

    二、保存选中图片

    当选择图片完之后,需要将选中的图片进行保存,一般保存到一个临时文件当中。而我们的最终目的是把选中的图片,供外界使用(初始Activity/Fragment)。这个时候就要使用startActivityForResult来启动拍照或本地相册,方便进行数据回调。

    如下:启动本地相册和启动拍照可以写出如下形式。

    启动本地相册:

    Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    Activity.startActivityForResult(intent, RESULT_LOAD _CODE);
    

    注:RESULT_LOAD _CODE是表示启动本地相册请求码。

    启动拍照:将拍照图片保存到一个临时文件当中。

    try{
       if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
          //创建文件夹
          boolean isSuccess =true;
          File dirFile =new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"photoCache");
          if(!dirFile.exists()) {
             isSuccess = dirFile.mkdirs();
          }
          if(isSuccess) {
             //创建文件
             String imgPath= dirFile.getAbsolutePath() + File.separator+ System.currentTimeMillis() +".png";
             File imgFile = new File(imgPath);
             Uri photoUri= Uri.fromFile(imgFile);
             Intent openCameraIntent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
             openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
             Activity.startActivityForResult(openCameraIntent, RESULT_PHOTO_CODE);
          }
       } else {
          Toast.makeText(context,"SD卡不存在,请插入SD卡!", Toast.LENGTH_SHORT).show();
       }
    }catch(Exception e) {
       e.printStackTrace();
    }
    

    注:这里需要自定义静态变量photoUri和静态整形常量RESULT_PHOTO _CODE。其中photoUri为Uri,是用来保存拍照URI。RESULT_PHOTO _CODE是表示启动拍照请求码。

    可能存在的问题

    在Android7.0+版本中,不再允许在app中把file://Uri暴露给其他app。所以如果采用临时文件的方法可能会引起的FileUriExposedException异常。可以利用FileProvider来解决这个问题。那么该如何使用FileProvider呢?这里针对启动拍照3进行修改。

    首先在AndroidManifest.xml清单文件中添加以下代码:

    <!--Android7.0+用于访问外部文件 -->
    <provider
       android:name=".ZFileProvider"
       android:authorities="cc.ibooker.zdialoglib.fileProvider"
       android:exported="false"
       android:grantUriPermissions="true">
          <meta-data
             android:name="android.support.FILE_PROVIDER_PATHS"
             android:resource="@xml/zdialog_file_paths" />
    </provider>
    

    ZFileProvider是一个空类,该类继承FileProvider,没有任何结构体。

    import android.support.v4.content.FileProvider;
    /**
     * 自定义FileProvider
     * Created by 邹峰立 on 2017/11/9.
     */
    public class ZFileProvider extends FileProvider {
    
    }
    

    zdialog_file _paths文件为res/xml/中的文件:

    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <external-path
            name="ZDialogPhotoCache"
            path="ZDialogPhotoCache" />
    </paths>
    

    修改启动拍照3:

    // 启动拍照3
    public static void startPhoto3(Context context) {
       try {
          if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
             // 创建文件夹
             boolean isSuccess = true;
             File dirFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "ZDialogPhotoCache");
             if (!dirFile.exists()) {
                isSuccess = dirFile.mkdirs();
             }
             if (isSuccess) {
                // 创建文件
                imgPath = dirFile.getAbsolutePath() + File.separator + System.currentTimeMillis() + ".png";
                File imgFile = new File(imgPath);
    
                Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                // 判断是否是AndroidN以及更高的版本
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                   photoUri = ZFileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", imgFile);
                   // 添加权限
                   openCameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                } else
                   photoUri = Uri.fromFile(imgFile);
                   openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
                   ((Activity) context).startActivityForResult(openCameraIntent, ZDialogConstantUtil.RESULT_PHOTO_CODE);
                }
             } else {
                Toast.makeText(context, "SD卡不存在,请插入SD卡!", Toast.LENGTH_SHORT).show();
             }
       } catch (Exception e) {
          e.printStackTrace();
       }
    }
    

    在清单文件AndroidManifest.xml添加拍照权限,如果是保存到临时文件中,还要添加对文件的读写权限。

     <!--用于写入数据到扩展存储卡(SD)-->
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <!-- 往sdcard中读取数据的权限 -->
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <!-- 在sdcard中创建/删除文件的权限 -->
     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
     <!--添加拍照权限-->
     <uses-permission android:name="android.permission.CAMERA" />
     <uses-feature
         android:name="android.hardware.camera"
         android:required="true" />
    

    三、接收返回值

     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         switch (requestCode) {
             case RESULT_PHOTO_CODE:
                 /**
                  * 拍照回调,进行相应的逻辑处理即可
                  */
                 break;
             case RESULT_LOAD_CODE:
                 /**
                   * 从相册中选择图片回调,进行相应的逻辑处理即可
                   */
                 break;
         }
     }
    

    到这里,选择图片的相关逻辑已经分析清楚,那怎么去封装图片选择功能呢?

    四、封装选择图片Dialog

    A、创建选择图片管理类(这里只是对上面的分析,进行进一步的封装),这里我创建一个叫做ChoosePictrueUtil的类,封装对拍照和从本地相册选择方法,如下:

    /**
     * 选择图片管理类
     * Created by 邹峰立 on 2017/7/10.
     */
    public class ChoosePictrueUtil {
        public static Uri photoUri;// 拍照URI,拍照相对于新生产的,所有要进行转换
        public static String imgPath;// 图片地址
    
        // 生成一个URI地址
        public static Uri createImageViewUri(Context context) {
            String name = "tmp" + System.currentTimeMillis();
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.TITLE, name);
            values.put(MediaStore.Images.Media.DISPLAY_NAME, name + ".png");
            values.put(MediaStore.Images.Media.MIME_TYPE, "image/*");
            return context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        }
    
        // 刪除URI
        public static void deleteUri(Context context, Uri uri) {
            if (uri != null) {
                context.getContentResolver().delete(uri, null, null);
            }
        }
    
        // 启动拍照1
        public static void startPhoto(Context context) {
            photoUri = createImageViewUri(context);
            if (photoUri != null) {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); // 将拍照后的图像保存到photoUri
                ((Activity) context).startActivityForResult(intent, ZDialogConstantUtil.RESULT_PHOTO_CODE);
            }
        }
    
        // 启动拍照2
        public static void startPhoto2(Context context) {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            ((Activity) context).startActivityForResult(intent, ZDialogConstantUtil.RESULT_PHOTO_CODE);
        }
    
        // 启动拍照3
        public static void startPhoto3(Context context) {
            try {
                if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                    // 创建文件夹
                    boolean isSuccess = true;
                    File dirFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "ZDialogPhotoCache");
                    if (!dirFile.exists()) {
                        isSuccess = dirFile.mkdirs();
                    }
                    if (isSuccess) {
                        // 创建文件
                        imgPath = dirFile.getAbsolutePath() + File.separator + System.currentTimeMillis() + ".png";
                        File imgFile = new File(imgPath);
    
                        Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        // 判断是否是AndroidN以及更高的版本
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                            photoUri = ZFileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", imgFile);
                            // 添加权限
                            openCameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        } else
                            photoUri = Uri.fromFile(imgFile);
                        openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
                        ((Activity) context).startActivityForResult(openCameraIntent, ZDialogConstantUtil.RESULT_PHOTO_CODE);
                    }
                } else {
                    Toast.makeText(context, "SD卡不存在,请插入SD卡!", Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        // 从相册中获取1
        public static void startLocal(Context context) {
            // 调用android的图库
            Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            ((Activity) context).startActivityForResult(intent, ZDialogConstantUtil.RESULT_LOAD_CODE);
        }
    
        // 从相册中获取2
        public static void startLocal2(Context context) {
            // 调用android的图库
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
            ((Activity) context).startActivityForResult(intent, ZDialogConstantUtil.RESULT_LOAD_CODE);
        }
    }
    

    注:其中ZDialogConstantUtil类是用来保存常量。

    /**
     * 常量管理类
     * Created by 邹峰立 on 2017/7/10.
     */
    public class ZDialogConstantUtil {
        public static final int PERMISSION_CAMERA_REQUEST_CODE = 222;// 拍照权限请求码
        public static final int PERMISSION_READ_EXTERNAL_STORAGE_REQUEST_CODE = 223;// sdcard中读取数据的权限请求码
        public static final int PERMISSION_WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 224;// 写入数据到扩展存储卡(SD)请求码
    
        public static final int REQUEST_CROP_CODE = 10; // 裁剪请求码
        public static final int RESULT_LOAD_CODE = 11; // 从本地相册中获取
        public static final int RESULT_PHOTO_CODE = 12; // 拍照
    }
    

    B、选择图片Dialog。

    选择图片Dialog

    如何自定义这个Dialog呢?其实就是将一个将布局和对于操作方式封装到一个类当中即可,这里我创建一个叫做ChoosePictrueDialog的类。

    首先:XML布局,对于上面的布局来说,一个线性布局包裹三个Button即可。

    其实:定义一个Dialog操作类,同时要对当前布局文件内容进行操作。

    思路:创建ChoosePictrueDialog,在该类中定义一个全局变量Dialog,在该类进行创建操作的时候,进行Dialog初始化,同时将初始化XML布局控件,并设置布局文件三个Button的点击事件,最后将XML文件添加到Dialog中去。

    Dialog dialog=new Dialog(context, R.style.diydialog);
    View view = LayoutInflater.from(context).inflate(R.layout.layout_choose_pictrue, null);
    /**对于按钮的点击事件监听,这里略过。**/
    dialog.setContentView(view);
    

    这里有一个地方需要注意,由于Android 6.0之后,对权限的限制非常多,在启动拍照的时候要对SD和系统拍照进行操作,所以这里几个权限的判断必不可少。

    // 启动拍照
    public void startPhoto() {
         if (onPhotoListener != null) {
             onPhotoListener.onPhoto();
         } else {
             // 判断是否需要拍照权限
             int checkCallPhonePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA);
             if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {
                 ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.CAMERA}, ZDialogConstantUtil.PERMISSION_CAMERA_REQUEST_CODE);
             } else {
                 // 判断是否需要sdcard中读取数据的权限
                 int checkCallSDReadPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
                 if (checkCallSDReadPermission != PackageManager.PERMISSION_GRANTED) {
                     ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, ZDialogConstantUtil.PERMISSION_READ_EXTERNAL_STORAGE_REQUEST_CODE);
                 } else {
                     // 判断是否需要写入数据到扩展存储卡(SD)的权限
                     int checkCallSDWritePermission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
                     if (checkCallSDWritePermission != PackageManager.PERMISSION_GRANTED) {
                         ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, ZDialogConstantUtil.PERMISSION_WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
                     } else {
                         // 启动拍照
                         ChoosePictrueUtil.startPhoto3(context);
                     }
                 }
             }
         }
    }
    

    在初始化Dialog的时候,细心的同学,可能看到Dialog dialog=new Dialog(context,R.style.diydialog),那么R.style.diydialog是什么呢?这个是设置Dialog主题文件,需要在styles.xml中进行书写:

    <style name="diydialog" parent="@android:style/Theme.Dialog">
       <item name="android:windowFrame">@null</item>
       <!--边框-->
       <item name="android:windowIsFloating">true</item>
       <!--是否浮现在activity之上-->
       <item name="android:windowIsTranslucent">true</item>
       <!--半透明-->
       <item name="android:windowNoTitle">true</item>
       <!--无标题-->
       <item name="android:windowBackground">@drawable/bg_white_gray_border</item>
       <!--背景-->
       <item name="android:backgroundDimEnabled">true</item>
       <!--是否为半透明-->
    </style>
    

    至于bg_white_gray_border为背景文件,是在drawable文件夹下:

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
       <item><shape>
          <!--内容-->
          <solid android:color="#FFFFFF"/>
          <!--四角-->
          <corners android:radius="4dp"/>
          <!--边框-->
          <stroke android:width="0.6dp" android:color="#CCCCCC"/>
       </shape></item>
    </layer-list>
    

    ChoosePictrueDialog类需要对外外提供修改样式和功能的类,这些都是采用构造者模式,例如:

    1、设置Dialog显示位置

    Dialog在屏幕当中显示位置,无外乎上、下、左、右、中五种,这里采用枚举enum来标记几种状态,然后通过设置window.getAttributes().gravity便可实现Dialog在窗体中的位置。

    public enum ChoosePictrueDialogGravity {
        GRAVITY_BOTTOM, GRAVITY_CENTER, GRAVITY_LEFT, GRAVITY_RIGHT, GRAVITY_TOP
    }
    
    /**
     * 设置Dialog显示位置
     *
     * @param choosePictrueDialogGravity 左上右下中
     */
    public ChoosePictrueDialog setChoosePictrueDialogGravity(ChoosePictrueDialogGravity choosePictrueDialogGravity) {
         Window window = dialog.getWindow();
         int gravity = Gravity.CENTER;
         if (choosePictrueDialogGravity == ChoosePictrueDialogGravity.GRAVITY_BOTTOM) {
             gravity = Gravity.BOTTOM;
         } else if (choosePictrueDialogGravity == ChoosePictrueDialogGravity.GRAVITY_CENTER) {
             gravity = Gravity.CENTER;
         } else if (choosePictrueDialogGravity == ChoosePictrueDialogGravity.GRAVITY_LEFT) {
             gravity = Gravity.START;
         } else if (choosePictrueDialogGravity == ChoosePictrueDialogGravity.GRAVITY_RIGHT) {
             gravity = Gravity.END;
         } else if (choosePictrueDialogGravity == ChoosePictrueDialogGravity.GRAVITY_TOP) {
             gravity = Gravity.TOP;
         }
         if (window != null)
             window.getAttributes().gravity = gravity;
         return this;
    }
    

    2、设置背景层透明度

    /**
      * 设置背景层透明度
      *
      * @param dimAmount 0~1
      */
    public ChoosePictrueDialog setDimAmount(float dimAmount) {
         Window window = dialog.getWindow();
         if (window != null) {
             WindowManager.LayoutParams lp = window.getAttributes();
             // 设置背景层透明度
             lp.dimAmount = dimAmount;
             window.setAttributes(lp);
         }
         return this;
    }
    

    3、设置Window动画

    /**
      * 设置Window动画
      *
      * @param style R文件
      */
    public ChoosePictrueDialog setWindowAnimations(int style) {
         if (dialog != null) {
             Window window = dialog.getWindow();
             if (window != null) {
                 window.setWindowAnimations(style);
             }
         }
         return this;
    }
    

    按照这样的规则,可以定义出很多方法,其他方法这里不再列出。

    对选择图片的封装,到这儿就已经写完了,一共建了三个类,ZDialogConstantUtil(常量管理类)、ChoosePictrueUtil(选择图片管理类)、ChoosePictrueDialog(选择图片Dialog类)。

    Github地址:
    ZDialog
    ZDialogConstantUtil
    ChoosePictrueUtil
    ChoosePictrueDialog

    这里也可以直接引入该封装内容到自己的工程当中,该如何使用呢?

    一、引入资源

    引入Android Studio:

    在build.gradle文件中添加以下代码:
    allprojects {
       repositories {
          maven { url 'https://www.jitpack.io' }
       }
    }
    dependencies {
       compile 'com.github.zrunker:ZDialog:v1.0.0'
    }
    

    或Maven引入,在pom.xml文件中添加以下代码:

    <repositories>
       <repository>
          <id>jitpack.io</id>
          <url>https://jitpack.io</url>
       </repository>
    </repositories>
    
    <dependency>
       <groupId>com.github.zrunker</groupId>
          <artifactId>ZDialog</artifactId>
       <version>v1.0.0</version>
    </dependency>
    

    二、使用

    // 初始化
    ChoosePictrueDialog choosePictrueDialog=new ChoosePictrueDialog(this);
    choosePictrueDialog.showChoosePictrueDialog();
    

    启动拍照将会对一些权限进行判断,所以要在启动Dialog的Activity中添加权限请求回调处理。

    // 权限设置结果
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
         switch (requestCode) {
             case ZDialogConstantUtil.PERMISSION_CAMERA_REQUEST_CODE:
                 if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                     choosePictrueDialog.startPhoto();
                 } else {
                     Toast.makeText(this, "获取拍照权限失败", Toast.LENGTH_SHORT).show();
                 }
                 break;
             case ZDialogConstantUtil.PERMISSION_READ_EXTERNAL_STORAGE_REQUEST_CODE:
                 if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                     choosePictrueDialog.startPhoto();
                 } else {
                     Toast.makeText(this, "sdcard中读取数据的权限失败", Toast.LENGTH_SHORT).show();
                 }
                 break;
             case ZDialogConstantUtil.PERMISSION_WRITE_EXTERNAL_STORAGE_REQUEST_CODE:
                 if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                     choosePictrueDialog.startPhoto();
                 } else {
                     Toast.makeText(this, "写入数据到扩展存储卡(SD)权限失败", Toast.LENGTH_SHORT).show();
                 }
                 break;
         }
    }
    

    选择图片之后,会进行图片选择结果回调,所以这里可以进行图片选择回调进行监听:

    /**
     * 通过回调方法处理图片
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         switch (requestCode) {
             case ZDialogConstantUtil.RESULT_PHOTO_CODE:
                 /**
                  * 拍照,获取返回结果
                  */
                 closeChoosePictrueDialog();
                 Uri photoUri = ChoosePictrueUtil.photoUri;
                 if (photoUri != null) {
                    /**
                     * 拍照回调,进行相应的逻辑处理即可
                     */
                 }
                 break;
             case ZDialogConstantUtil.RESULT_LOAD_CODE:
                 /**
                  * 从相册中选择图片,获取返回结果
                  */
                 closeChoosePictrueDialog();
                 if (data == null) {
                     return;
                 } else {
                     Uri uri = data.getData();// 获取图片是以content开头
                     if (uri != null) {
                         // 进行相应的逻辑操作
                     }
                 }
                 break;
             }
        }
    }
    
    // 关闭选择图片Dialog
    private void closeChoosePictrueDialog() {
        if (choosePictrueDialog != null)
            choosePictrueDialog.closeChoosePictrueDialog();
    }
    

    三、其他方法使用(如下只是部分方法)

    /**
     *设置三个按钮的字体颜色
     *@param color颜色值16进制
     */
    public ChoosePictrueDialog setBtnColor(String color);
    
    /**
     *设置三个按钮的字体大小
     *@param size字体大小值
     */
    public ChoosePictrueDialog setBtnSize(float size);
    
    /**
     *修改本地按钮文本颜色
     *@param color文本颜色
     */
    public ChoosePictrueDialog setLocalBtnColor(String color);
    
    /**
     *修改拍照按钮文本颜色
     *@param color文本颜色
     */
    public ChoosePictrueDialog setPhotoBtnColor(String color);
    
    /**
     *修改取消按钮文本颜色
     *@param color文本颜色
     */
    public ChoosePictrueDialog setCancelBtnColor(String color);
    
    /**
     *修改本地按钮文本字体大小
     *@param size字体大小
     */
    public ChoosePictrueDialog setLocalBtnSize(float size)
    
    /**
     *修改拍照按钮文本字体大小
     *@param size字体大小
     */
    public ChoosePictrueDialog setPhotoBtnSize(float size)
    
    /**
     *修改取消按钮文本字体大小
     *@param size字体大小
     */
    public ChoosePictrueDialog setCancelBtnSize(float size)
    
    /**
     *修改本地按钮文本
     *@param text文本信息
     */
    public ChoosePictrueDialog setLocalBtnText(String text)
    
    /**
     *修改拍照按钮文本
     *@param text文本信息
     */
    public ChoosePictrueDialog setPhotoBtnText(String text)
    
    /**
     *修改取消按钮文本
     *@param text文本信息
     */
    public ChoosePictrueDialog setCancelBtnText(String text)
    
    /**
     *按返回键是否取消
     *@param cancelable true取消false不取消  默认true
     */
    public ChoosePictrueDialog setCancelable(boolean cancelable)
    
    /**
     *点击Dialog外围是否取消
     *@param cancelable true取消false不取消  默认false
     */
    public ChoosePictrueDialog setCanceledOnTouchOutside(boolean cancelable)
    
    /**
     *设置取消事件
     *@param onCancelListener取消事件
     */
    public ChoosePictrueDialog setOnCancelListener(DialogInterface.OnCancelListener  onCancelListener)
    
    /**
     *设置Dialog显示位置
     *@param choosePictrueDialogGravity左上右下中
     */
    public ChoosePictrueDialog setChoosePictrueDialogGravity(ChoosePictrueDialogGravity  choosePictrueDialogGravity)
    
    /**
     *设置背景层透明度
     *@param dimAmount0~1
     */
    public ChoosePictrueDialog setDimAmount(float dimAmount)
    
    /**
     *设置Window动画
     *@param style R文件
     */
    public ChoosePictrueDialog setWindowAnimations(int style)
    
    /**
     *设置Dialog宽度
     *@param proportion和屏幕的宽度比(10代表10%) 0~100
     */
    public ChoosePictrueDialog setChoosePictrueDialogWidth(int proportion)
    
    /**
     *设置Dialog高度
     *@param proportion和屏幕的高度比(10代表10%) 0~100
     */
    public ChoosePictrueDialog setChoosePictrueDialogHeight(int proportion);
    
    /**
     *展示Dialog
     */
    public void showChoosePictrueDialog();
    
    /**
     *关闭Dialog
     */
    public void closeChoosePictrueDialog();
    
    // 本地相册按钮点击事件
    public void setOnLocalListener(OnLocalListener onLocalListener);
    
    // 拍照按钮点击事件
    public void setOnPhotoListener(OnPhotoListener onPhotoListener);
    
    // 取消按钮点击事件
    public void setOnCancelListener(OnCancelListener onCancelListener);
    

    阅读原文


    微信公众号:书客创作

    相关文章

      网友评论

        本文标题:【Android】图片选择(拍照+本地相册)Dialog封装,使

        本文链接:https://www.haomeiwen.com/subject/wwuiyxtx.html