本文目录 ⌄
完善PhotoGallery,保存图片
根据欲加载的图片高度设置ImageView的高度:
imageView.getLayoutParams().height=getItem(position).getPhotoHeight();增加显示了一些新的数据。
图片保存
首先创建一个Drawable资源,为一个按压之后状态会发生改变的按钮。
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/ic_baseline_saved_24"/> <item android:drawable="@drawable/ic_baseline_save_24"/></selector>申请写存储器权限:
首先要先在manifests中声明权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>在点击保存按钮时动态申请权限
saveButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (Build.VERSION.SDK_INT<29&& ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){ Toast.makeText(getContext(),"onclick",Toast.LENGTH_LONG).show(); requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_WRITE); } }});API 29以上的不需要动态申请权限了。
保存图片:
private void savePhoto(){ PagerPhotoViewHolder holder=(PagerPhotoViewHolder) ((RecyclerView)viewPager2.getChildAt(0)).findViewHolderForAdapterPosition(viewPager2.getCurrentItem()); Bitmap bitmap=((BitmapDrawable)((ImageView)holder.itemView.findViewById(R.id.pagerPhoto)).getDrawable()).getBitmap(); Uri saveUri=requireContext().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,new ContentValues()); if (saveUri == null) { Toast.makeText(requireContext(),"存储失败",Toast.LENGTH_LONG).show(); return; }else { OutputStream outputStream = null; try { outputStream=requireContext().getContentResolver().openOutputStream(saveUri); bitmap.compress(Bitmap.CompressFormat.JPEG,90,outputStream); Toast.makeText(requireContext(),"存储成功",Toast.LENGTH_LONG).show(); } catch (FileNotFoundException e) { Toast.makeText(requireContext(),"存储失败",Toast.LENGTH_LONG).show(); e.printStackTrace(); }finally { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } //低版本// if (MediaStore.Images.Media.insertImage(requireContext().getContentResolver(),bitmap,"","")==null){// Toast.makeText(requireContext(),"存储失败",Toast.LENGTH_LONG).show();// }else {// Toast.makeText(requireContext(),"存储成功",Toast.LENGTH_LONG).show();// } }首先得获取保存图片的imageView,然后将其图片内容(drawable)转化为BItmap。注意这里有一个bug,当图片没加载出来时,点击保存按钮会将展位图保存,会报错:vectorDrawable can not cast to Bitmap。