完善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。