Android图片浏览模式以及图片保存的实现
2018-01-18 16:21
393 查看
在访问微信朋友圈的时候,点击里面的图片可以进行多图浏览,手势缩放,以及图片保存的功能,正好项目里也有这样一个需求,并且顺利完成了,现在拿出来和大家分享一下。
图片浏览模式的实现大体流程如下:
第一步:弹出popupWindow
第二步:popupWindow中创建保存按钮和viewpager对象
第三步:为viewpager添加视图
第四步:图片支持缩放
第五步:获取图片并保存
第一步:
首先在点击图片时会弹出popupWindow,当然要得到图片位置和图片列表数据,这个图片列表数据里的对象可以是bitmap,图片地址,byte字节等;
popupWindow的contentView布局文件代码如下:
以上是创建popupWindow的步骤,基本操作啦~,这些想必大家都会,并且还可以把代码写的更简洁。
第二步:
创建完popupWindow之后,要对viewpager进行视图填充,在完成这一步时,因为只是简单的图片视图,所以就没有重新写新的布局文件,具体代码如下:
在viewpager中添加view对象或者是fragment,但是添加fragment会报错,在这里提一下,popupWindow中不能添加fragment对象,网上的解决方法是将popupWindow换成DialogFragment,大家可以根据兴趣自行研究。
第三步:
为viewpager天剑视图,代码如下:
上面的代码中为图片添加父布局,是为了让图片自适应宽高,然后为图片设置规则,为居中显示,当然还可以设置其他属性,如果没有这一层父布局嵌套,那么图片会充满屏幕;
第四步:
图片缩放功能的实现,可以使用上面用到的PhotoView,GitHub地址点这里,这是一个安全的开源控件,我使用的版本是2.1.3,已经有一万二的star了,使用起来也很简单。
第五步:
保存图片:
我们所做的项目中加载图片一般会用到图片加载框架,Glide或者Picasso,后台返回给我们的图片数据一般是一个图片地址,使用glide加载完成后可以通过如下方法获取到图片对象:
resource即是bitmap对象,但是获取到图片后要讲其保存起来,然后再在保存的时候取出来,这样就显得很繁琐,所以使用另外一种更加简单的方法来保存图片,不需要保存对象,也不需要去重新取值。
通过图片本身来进行保存,在获取对象之前要打开:
在完成之后关闭:
到这里,图片浏览模式和图片保存就完成了,如果有疑问,请给我留言,如果那里写的有问题,也请给我留言。
图片浏览模式的实现大体流程如下:
第一步:弹出popupWindow
第二步:popupWindow中创建保存按钮和viewpager对象
第三步:为viewpager添加视图
第四步:图片支持缩放
第五步:获取图片并保存
第一步:
首先在点击图片时会弹出popupWindow,当然要得到图片位置和图片列表数据,这个图片列表数据里的对象可以是bitmap,图片地址,byte字节等;
PopupWindow popupWindow; /**记录viewpager滑动到的位置*/ private int currentPosition; protected List<RelativeLayout> imageList = new ArrayList<>(); /** * 弹出展示图片框 */ private void showImagePopup(List<String> list, int position) { currentPosition = position; imageList.clear(); /** * popupWindow对象充满屏幕 */ popupWindow = new PopupWindow(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); /**手机版本较低时popupWindow会充满整个屏幕,包括状态栏*/ if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT){ popupWindow.setHeight(DipUtils.getScreenHeight(this) - StatusBarCompat.getStatusBarHeight(this)); } View contentView = LayoutInflater.from(this).inflate(R.layout.popup_window_big_image, null); TextView save = (TextView) contentView.findViewById(R.id.tv_save); final ViewPager viewPager = (ViewPager) contentView.findViewById(R.id.popup_vp); /**为viewpager创建适配*/ setViewPagerAdapter(viewPager, list); /**position为当前正在被点击的图片的位置,展示正被点击的图片*/ viewPager.setCurrentItem(position); viewPager.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (popupWindow != null && popupWindow.isShowing()) { popupWindow.dismiss(); } } }); save.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showProgressDialog("正在保存..."); saveImage(); } }); /**如果想要点击back键时弹框消失,这两个属性必须使用并同时使用*/ popupWindow.setBackgroundDrawable(new ColorDrawable()); popupWindow.setFocusable(true); popupWindow.setContentView(contentView); popupWindow.setOutsideTouchable(true); popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { } }); /**设置入场出场动画,可以不设置*/ popupWindow.setAnimationStyle(R.style.PopupImageScale); /**popupWindow底部展示,参数一可以传入当前界面初始化了的任意的一个view对象*/ popupWindow.showAtLocation(mToolBar, Gravity.BOTTOM, 0, 0); }
popupWindow的contentView布局文件代码如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/text_color" android:orientation="vertical"> <TextView android:id="@+id/tv_save" android:layout_width="wrap_content" android:layout_height="45dp" android:layout_alignParentRight="true" android:paddingLeft="16dp" android:paddingRight="26dp" android:text="保存" android:gravity="center" android:textSize="16sp" android:textColor="@color/white"/> <android.support.v4.view.ViewPager android:id="@+id/popup_vp" android:layout_below="@id/tv_save" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
以上是创建popupWindow的步骤,基本操作啦~,这些想必大家都会,并且还可以把代码写的更简洁。
第二步:
创建完popupWindow之后,要对viewpager进行视图填充,在完成这一步时,因为只是简单的图片视图,所以就没有重新写新的布局文件,具体代码如下:
/** * 设置点击放大图片适配器 */ private void setViewPagerAdapter(ViewPager viewPager, List<String> list) { for (int i = 0; i < list.size(); i++) { imageList.add(getView(list.get(i))); } viewPager.setAdapter(new PagerAdapter() { @Override public int getCount() { return imageList.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; b35c } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(imageList.get(position)); return imageList.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(imageList.get(position)); } }); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { currentPosition = position; } @Override public void onPageScrollStateChanged(int state) { } }); }
在viewpager中添加view对象或者是fragment,但是添加fragment会报错,在这里提一下,popupWindow中不能添加fragment对象,网上的解决方法是将popupWindow换成DialogFragment,大家可以根据兴趣自行研究。
第三步:
为viewpager天剑视图,代码如下:
/** * 获取图片及图片布局 */ private RelativeLayout getView(String s) { /**由于图片要居中显示,所以选择父布局为相对布局,为什么要为图片外面嵌套一层父布局,下面会进行讲解*/ final RelativeLayout view = new RelativeLayout(this); ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams (ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); view.setLayoutParams(layoutParams); /**PhotoView是ImageView的子类*/ PhotoView imageView = new PhotoView(this); RelativeLayout.LayoutParams layoutParams1 = new RelativeLayout.LayoutParams (ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); /**设置布局规则*/ layoutParams1.addRule(RelativeLayout.CENTER_IN_PARENT); imageView.setLayoutParams(layoutParams1); view.addView(imageView); Glide.with(this).load(s).into(imageView); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (popupWindow != null && popupWindow.isShowing()) popupWindow.dismiss(); } }); return view; }
上面的代码中为图片添加父布局,是为了让图片自适应宽高,然后为图片设置规则,为居中显示,当然还可以设置其他属性,如果没有这一层父布局嵌套,那么图片会充满屏幕;
第四步:
图片缩放功能的实现,可以使用上面用到的PhotoView,GitHub地址点这里,这是一个安全的开源控件,我使用的版本是2.1.3,已经有一万二的star了,使用起来也很简单。
第五步:
保存图片:
我们所做的项目中加载图片一般会用到图片加载框架,Glide或者Picasso,后台返回给我们的图片数据一般是一个图片地址,使用glide加载完成后可以通过如下方法获取到图片对象:
Glide.with(this).load(s).asBitmap().into(new ImageViewTarget<Bitmap>(imageView) { @Override protected void setResource(Bitmap resource) { } });
resource即是bitmap对象,但是获取到图片后要讲其保存起来,然后再在保存的时候取出来,这样就显得很繁琐,所以使用另外一种更加简单的方法来保存图片,不需要保存对象,也不需要去重新取值。
/** * 保存图片到本地 */ private void saveImage() { if (imageList != null && imageList.size() != 0 && currentPosition < imageList.size()) { RelativeLayout view = imageList.get(currentPosition); ImageView iv = (ImageView) view.getChildAt(0); iv.setDrawingCacheEnabled(true); Bitmap bitmap = iv.getDrawingCache(); if (BitmapUtil.saveImageToGallery(this, bitmap)) { hideProgressDialog(); showToast("保存成功"); } else { hideProgressDialog(); showToast("保存失败"); } iv.setDrawingCacheEnabled(false); } else { hideProgressDialog(); } }
通过图片本身来进行保存,在获取对象之前要打开:
iv.setDrawingCacheEnabled(true);
在完成之后关闭:
iv.setDrawingCacheEnabled(false);
到这里,图片浏览模式和图片保存就完成了,如果有疑问,请给我留言,如果那里写的有问题,也请给我留言。
相关文章推荐
- Android实现点击WebView界面中图片滑动浏览与保存图片功能
- 【Android】一个浏览图片的Android库的实现,可以移动、缩放图片以及滑动切换
- android webView使用js/css实现夜间模式 长按识别图片以及二维码,网页可以上传图片
- Android实现拍照,以及从相册选择图片裁剪功能同时保存在本地
- android实现涂鸦,保存涂鸦后的图片,清屏
- Android实现下载图片并保存到SD卡中
- Android画图并保存图片的具体实现代码
- android实现动态相册浏览图片
- Win form 在pictureBox控件中实现选择图片然后以二进制方式保存到数据库。以及在pictureBox控件显示出来
- Android网络:开发浏览器(五)——功能完善之保存图片实现
- android开发之滑动效果实现图片浏览_ViewFilpper的使用
- android实现涂鸦,保存涂鸦后的图片,清屏
- Android Camera相机功能实现 拍照并保存图片
- android 实现保存图片到相册
- Android实现下载图片并保存到SD卡中
- 用android来实现图片的绘制以及旋转缩放案例分析
- Android实现下载图片并保存到SD卡中
- Android利用Matrix实现图片的放大,缩小以及移动控制
- Android实现图片预览浏览功能
- 用android来实现图片的绘制以及旋转缩放案例分析