ImageSeclect和Glide实现从图库选择或者拍照设置头像


</pre><span style="font-size:18px;">               最近业务需求,需要实现一个图片选择器,要用来更改用户的头像,网上的也挺多,但是刚看到一个第三方库ImageSeclect,变来实现一下这个功能,感觉挺好用的,简单方便,可以实现从图库选择或者拍照设置头像,在加载图片的时候本来想用picasso,但是没实现,就用了Glide,感觉也蛮好用的,看效果:</span><p></p><p><span style="font-size:18px;"></span></p><p><span style="font-size:18px;">下面是使用的第三方库     </span></p><pre name="code" class="java"><pre name="code" class="java"> compile 'com.yancy.imageselector:imageselector:1.3.3'
    compile 'com.github.bumptech.glide:glide:3.7.0
 
           实现原理很简单,找到需要更改图片的控件,可以是ImageView或者ImageButton或者其他的,看需求,给其设置一个单击事件既可以进行图片的选择操作,同时可以处理图片,当然多选也是可能的,这部分比肩简单,然后就可以具体的业务代码了。 

            下面是具体的操作了:

            看源代码得知需要先定义一个ImageLoader,先定义,如下

new ImageLoader() {//ImageLoader定义imageseclet的每一项的缩略图的加载 
       @Override 
          public void displayImage(Context context, String path, ImageView imageView) {//此处暂时若使用picasso会出现无缩略图的状况,没解决
             Glide.with(context)
                .load(path) 
                .crop(1, 2, 500, 500)
                .into(imageView);


        看来得现有一个imageLoader,用于在ImageSeclect的图片所有图片展示页面加载每一张图片,代码如下
</pre><span style="font-size:18px;"></span><pre name="code" class="java">ImageConfig imageConfig = new ImageConfig.Builder(imageLoade) //ImageLoader定义imageseclet的每一项的缩略图的加载
                .crop(1, 1, 500, 500)// (截图默认配置:关闭    比例 1:1 长宽比   输出分辨率  500*500)
                .singleSelect()  // 开启单选   (默认为多选)
                .filePath("/ImageSelector/Pictures") // 拍照后存放的图片路径(默认 /temp/picture) (会自动创建)
                .showCamera() // 开启拍照功能 (默认关闭)
                .requestCode(REQUEST_CODE)
                .build();



      此处不想新建一个类,所以使用内部类了。
ImageSelector.open(MainActivity.this, imageConfig);   // 开启图片选择器
      此时已完成对ImageSeclect的初始话,可以使用了,但是生气这时候无法得到处理后图片的路径,看源代码得知
Intent intent = new Intent(fragment.getActivity(), ImageSelectorActivity.class);
     其实ImageSeclect内部是封装好的一个Activity,那么我们就可以通过重写OnActivityResult方法得到intent的数据了,代码如下(
先定义一个常量final int REQUEST_CODE = 1000;表示ImageSeclect的结果码

)

<pre name="code" class="java">@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {//得到选择的裁剪过的图片的路径
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK && data != null) {//此处暂时为有优化
            List<String> pathList = data.getStringArrayListExtra(ImageSelectorActivity.EXTRA_RESULT);
            for (String path : pathList) {
                Glide.with(MainActivity.this).load(path).into(logo);//将图片加载到需要更换的控件上,此时就完成了更换头像等
                System.out.println(path);
            }
        }

 

<pre name="code" class="java">

 
 
 
     好的,到此就算是更换完毕了,如果需要设置为圆形的话,可以重写通过对Glide的Transform属性进行配置,与Picasso类似,上Demo(已实现圆形),记得存储读写和相机权限啊传送门 

OK,完事!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个 Android Kotlin 用户点击更换头像的示例代码,其中包括拍照和相册选择功能: Step 1:在 build.gradle 文件中添加以下依赖项: ```kotlin implementation 'com.github.bumptech.glide:glide:4.12.0' implementation 'com.github.bumptech.glide:glide-kotlin:1.0.0' implementation 'com.github.yalantis:ucrop:2.2.3-native' ``` Step 2:在 layout 文件中添加一个 ImageView 用于显示头像: ```xml <ImageView android:id="@+id/image_view_profile" android:layout_width="150dp" android:layout_height="150dp" android:layout_gravity="center_horizontal" android:layout_marginTop="16dp" android:src="@drawable/ic_profile_placeholder" /> ``` Step 3:在 Activity 或 Fragment 中添加以下代码: ```kotlin private lateinit var imageViewProfile: ImageView private val REQUEST_IMAGE_CAPTURE = 1 private val REQUEST_IMAGE_PICK = 2 private var currentPhotoPath: String? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) imageViewProfile = findViewById(R.id.image_view_profile) imageViewProfile.setOnClickListener { showImagePickerDialog() } } private fun showImagePickerDialog() { val options = arrayOf<CharSequence>("拍照", "从相册选择", "取消") val builder = AlertDialog.Builder(this) builder.setTitle("选择图片") builder.setItems(options) { dialog, item -> when { options[item] == "拍照" -> { dispatchTakePictureIntent() } options[item] == "从相册选择" -> { dispatchPickImageIntent() } options[item] == "取消" -> { dialog.dismiss() } } } builder.show() } private fun dispatchTakePictureIntent() { Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent -> // Ensure that there's a camera activity to handle the intent takePictureIntent.resolveActivity(packageManager)?.also { // Create the File where the photo should go val photoFile: File? = try { createImageFile() } catch (ex: IOException) { // Error occurred while creating the File null } // Continue only if the File was successfully created photoFile?.also { val photoURI: Uri = FileProvider.getUriForFile( this, "${BuildConfig.APPLICATION_ID}.fileprovider", it ) takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI) startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) } } } } private fun createImageFile(): File? { // Create an image file name val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES) return File.createTempFile( "JPEG_${timeStamp}_", /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ).apply { // Save a file: path for use with ACTION_VIEW intents currentPhotoPath = absolutePath } } private fun dispatchPickImageIntent() { // Intent to pick image from gallery val pickPhoto = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) startActivityForResult(pickPhoto, REQUEST_IMAGE_PICK) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (resultCode == Activity.RESULT_OK) { when (requestCode) { REQUEST_IMAGE_CAPTURE -> { currentPhotoPath?.let { cropImage(Uri.fromFile(File(it))) } } REQUEST_IMAGE_PICK -> { data?.data?.let { cropImage(it) } } UCrop.REQUEST_CROP -> { val resultUri = UCrop.getOutput(data!!) resultUri?.let { Glide.with(this) .load(it) .into(imageViewProfile) } } } } } private fun cropImage(sourceUri: Uri) { val destinationUri: Uri = Uri.fromFile(File(cacheDir, "${UUID.randomUUID()}.jpeg")) val options = UCrop.Options() options.setCompressionQuality(80) UCrop.of(sourceUri, destinationUri) .withAspectRatio(1f, 1f) .withOptions(options) .start(this) } ``` 以上代码实现了以下功能: - 用户点击 ImageView 后弹出一个 AlertDialog,用户可以选择拍照、从相册选择或取消操作。 - 如果用户选择拍照,则启动相机应用,拍摄照片后返回结果。 - 如果用户选择从相册选择,则启动相册应用,用户选择一张照片后返回结果。 - 将返回的照片进行裁剪,并将结果显示在 ImageView 中。 这是一个基本的示例代码。根据您的需求,您可能需要进行一些修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值