android ViewPager 图片浏览和保存图片

在build.gradle在添加依赖

 

compile 'com.alibaba:fastjson:1.1.54.android'
compile 'org.ligboy.retrofit2:converter-fastjson-android:2.1.0'compile 'com.bm.photoview:library:1.4.1'
compile 'xiaofei.library:android-data-storage:1.3.0'

 

 

 

在layout下创建activity_photo_browser.xml

 

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/black"><android.support.v4.view.ViewPagerandroid:id="@+id/pager"android:layout_width="match_parent"android:layout_height="match_parent" /><ImageViewandroid:id="@+id/crossIv"android:layout_width="24dp"android:layout_height="24dp"android:layout_marginLeft="@dimen/activity_horizontal_margin"android:layout_marginTop="@dimen/activity_horizontal_margin"android:visibility="gone"android:src="@drawable/rp_closed_icon" /><TextViewandroid:id="@+id/photoOrderTv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|left"android:layout_margin="@dimen/activity_horizontal_margin"android:padding="10dp"android:textSize="14sp"android:textColor="@color/white" /><TextViewandroid:id="@+id/downloadOriginal"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|center"android:visibility="gone"android:layout_margin="@dimen/activity_horizontal_margin"android:padding="10dp"android:textSize="10sp"android:text="下载原图"android:textColor="@color/white"/><TextViewandroid:id="@+id/saveTv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|right"android:layout_margin="@dimen/activity_horizontal_margin"android:padding="10dp"android:textSize="14sp"android:visibility="visible"android:text="保存"android:textColor="@color/white" /><ImageViewandroid:layout_width="32dp"android:layout_height="32dp"android:src="@drawable/loading"android:layout_gravity="center"android:visibility="gone"android:id="@+id/centerIv"/></FrameLayout>

 

 

 

创建浏览图片的activity

 

/*** ProjectName: zhenhua* Author: lgq* Date: 2017/12/19 0019 15:29*/
public class PhotoBrowserActivity extends Activity implements View.OnClickListener {private ImageView crossIv;private ViewPager mPager;private ImageView centerIv;private TextView photoOrderTv;private TextView downloadOriginalTv;private TextView saveTv;private String curImageUrl = "";private String[] imageUrls = new String[]{};private int curPosition = -1;private int[] initialedPositions = null;private ObjectAnimator objectAnimator;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_photo_browser);String urls = getIntent().getStringExtra("imageUrls");JSONArray urlsJsonArray = JSONArray.parseArray(urls);imageUrls = urlsJsonArray.toArray(new String[urlsJsonArray.size()]);for (int i = 0; i < imageUrls.length; i++) {imageUrls[i] = getOriginalUrl(imageUrls[i]);}curImageUrl = getIntent().getStringExtra("curImageUrl");initialedPositions = new int[imageUrls.length];initInitialedPositions();photoOrderTv = (TextView) findViewById(R.id.photoOrderTv);downloadOriginalTv = (TextView) findViewById(R.id.downloadOriginal);downloadOriginalTv.setOnClickListener(this);saveTv = (TextView) findViewById(R.id.saveTv);saveTv.setOnClickListener(this);centerIv = (ImageView) findViewById(R.id.centerIv);crossIv = (ImageView) findViewById(R.id.crossIv);crossIv.setOnClickListener(this);mPager = (ViewPager) findViewById(R.id.pager);mPager.setPageMargin((int) (getResources().getDisplayMetrics().density * 15));mPager.setAdapter(new PagerAdapter() {@Overridepublic int getCount() {return imageUrls.length;}@Overridepublic boolean isViewFromObject(View view, Object object) {return view == object;}@Overridepublic Object instantiateItem(ViewGroup container, final int position) {if (imageUrls[position] != null && !"".equals(imageUrls[position])) {final PhotoView view = new PhotoView(PhotoBrowserActivity.this);view.enable();view.setScaleType(ImageView.ScaleType.FIT_CENTER);Glide.with(PhotoBrowserActivity.this).load(imageUrls[position]).override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).fitCenter().crossFade().listener(new RequestListener<String, GlideDrawable>() {@Overridepublic boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {if (position == curPosition) {hideLoadingAnimation();}showErrorLoading();return false;}@Overridepublic boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {occupyOnePosition(position);if (position == curPosition) {hideLoadingAnimation();}return false;}}).into(view);view.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();}});view.setTag(position);container.addView(view);return view;}return null;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {releaseOnePosition(position);container.removeView((View) object);}});curPosition = returnClickedPosition() == -1 ? 0 : returnClickedPosition();mPager.setCurrentItem(curPosition);
//        mPager.setTag(curPosition);if (initialedPositions[curPosition] != curPosition) {//如果当前页面未加载完毕,则显示加载动画,反之相反;showLoadingAnimation();}photoOrderTv.setText((curPosition + 1) + "/" + imageUrls.length);//设置页面的编号mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {if (initialedPositions[position] != position) {//如果当前页面未加载完毕,则显示加载动画,反之相反;showLoadingAnimation();} else {hideLoadingAnimation();}curPosition = position;curImageUrl = imageUrls[position];photoOrderTv.setText((position + 1) + "/" + imageUrls.length);//设置页面的编号}@Overridepublic void onPageScrollStateChanged(int state) {}});}private int returnClickedPosition() {if (imageUrls == null || curImageUrl == null) {return -1;}for (int i = 0; i < imageUrls.length; i++) {if (getOriginalUrl(curImageUrl).equals(imageUrls[i])) {return i;}}return -1;}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.crossIv:finish();break;case R.id.saveTv:
//                savePhotoToLocal();saveOriginalPhotoToLocal(getOriginalUrl(curImageUrl));break;case R.id.downloadOriginal:saveOriginalPhotoToLocal(getOriginalUrl(curImageUrl));break;default:break;}}private void showLoadingAnimation() {centerIv.setVisibility(View.VISIBLE);centerIv.setImageResource(R.drawable.loading);if (objectAnimator == null) {objectAnimator = ObjectAnimator.ofFloat(centerIv, "rotation", 0f, 360f);objectAnimator.setDuration(2000);objectAnimator.setRepeatCount(ValueAnimator.INFINITE);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {objectAnimator.setAutoCancel(true);}}objectAnimator.start();}private void hideLoadingAnimation() {releaseResource();centerIv.setVisibility(View.GONE);}private void showErrorLoading() {releaseResource();centerIv.setRotation(0f);centerIv.setVisibility(View.GONE);centerIv.setImageResource(R.drawable.list_img);}private void releaseResource() {if (objectAnimator != null) {objectAnimator.cancel();}if (centerIv.getAnimation() != null) {centerIv.getAnimation().cancel();}}private void occupyOnePosition(int position) {initialedPositions[position] = position;}private void releaseOnePosition(int position) {initialedPositions[position] = -1;}private void initInitialedPositions() {for (int i = 0; i < initialedPositions.length; i++) {initialedPositions[i] = -1;}}private String getOriginalUrl(String url) {//http://images.yxtribe.com/upload/images/ep123456/20171101184127659.jpg-style_webp_375x225return url.contains("yxtribe") ? url.split("-style")[0] : url;}private void saveOriginalPhotoToLocal(final String url) {new Thread(new Runnable() {@Overridepublic void run() {Bitmap bitmap = null;try {
//            file = Glide.with(context)
//                    .load(url)
//                    .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
//                    .get();bitmap = Glide.with(PhotoBrowserActivity.this).load(url).asBitmap().into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).get();if (bitmap != null){// 在这里执行图片保存方法Utils.savePhoto(PhotoBrowserActivity.this, bitmap, new Utils.SaveResultCallback() {@Overridepublic void onSavedSuccess() {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(PhotoBrowserActivity.this, "已保存至相册", Toast.LENGTH_SHORT).show();}});}@Overridepublic void onSavedFailed() {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(PhotoBrowserActivity.this, "保存失败", Toast.LENGTH_SHORT).show();}});}});}} catch (Exception e) {e.printStackTrace();}}}).start();}private void savePhotoToLocal() {try {//            ViewGroup containerTemp = (ViewGroup) mPager.findViewWithTag(mPager.getCurrentItem());
//            if (containerTemp == null) {
//                return;
//            }
//            PhotoView photoViewTemp = (PhotoView) mPager.getChildAt(curPosition);
//            ViewGroup containerTemp = (ViewGroup) mPager.findViewWithTag(mPager.getCurrentItem());
//            if (containerTemp == null) {
//                return;
//            }PhotoView  photoViewTemp = (PhotoView) mPager.findViewWithTag(mPager.getCurrentItem());if (photoViewTemp != null) {GlideBitmapDrawable glideBitmapDrawable = (GlideBitmapDrawable) photoViewTemp.getDrawable();if (glideBitmapDrawable == null) {return;}Bitmap bitmap = glideBitmapDrawable.getBitmap();if (bitmap == null) {return;}Utils.savePhoto(this, bitmap, new Utils.SaveResultCallback() {@Overridepublic void onSavedSuccess() {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(PhotoBrowserActivity.this, "已保存至相册", Toast.LENGTH_SHORT).show();}});}@Overridepublic void onSavedFailed() {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(PhotoBrowserActivity.this, "保存失败", Toast.LENGTH_SHORT).show();}});}});}} catch (Exception e) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(PhotoBrowserActivity.this, "保存失败", Toast.LENGTH_SHORT).show();}});}}@Overrideprotected void onDestroy() {releaseResource();if (mPager != null) {mPager.removeAllViews();mPager = null;}super.onDestroy();}
}

 

 

 

Utils类

 

public class Utils {public interface SaveResultCallback {void onSavedSuccess();void onSavedFailed();}public static File getSDPath() {File sdDir = null;boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); //判断sd卡是否存在if (sdCardExist) {sdDir = Environment.getExternalStorageDirectory();//获取跟目录}return sdDir;}public static void savePhoto(final Context context, final Bitmap bmp, final SaveResultCallback saveResultCallback) {final File sdDir = getSDPath();if (sdDir == null) {Toast.makeText(context,"设备自带的存储不可用",Toast.LENGTH_LONG).show();return;}new Thread(new Runnable() {@Overridepublic void run() {File appDir = new File(sdDir, "out_photo");if (!appDir.exists()) {appDir.mkdir();}SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置以当前时间格式为图片名称String fileName = df.format(new Date()) + ".png";File file = new File(appDir, fileName);try {FileOutputStream fos = new FileOutputStream(file);bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);fos.flush();fos.close();saveResultCallback.onSavedSuccess();} catch (FileNotFoundException e) {saveResultCallback.onSavedFailed();e.printStackTrace();} catch (IOException e) {saveResultCallback.onSavedFailed();e.printStackTrace();}//保存图片后发送广播通知更新数据库Uri uri = Uri.fromFile(file);context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));}}).start();}
}

 

 

 

启动图片浏览activity

 

                    Intent intent = new Intent();intent.putExtra("imageUrls", "[\"http://images.yxtribe.com/upload/images/business/20171017094330268.jpg-style_webp_750x350\",\"http://images.yxtribe.com/upload/images/business/330/20170812092209128.PNG-style_webp_375x225\",\"http://images.yxtribe.com/upload/images/business/330/20170812092227983.PNG-style_webp_375x225\",\"http://images.yxtribe.com/upload/images/business/330/20170812092239697.PNG-style_webp_375x225\",\"http://images.yxtribe.com/upload/images/business/330/20170812092244210.PNG-style_webp_375x225\",\"http://images.yxtribe.com/upload/images/business/330/20170812092246121.PNG-style_webp_375x225\",\"http://images.yxtribe.com/upload/images/business/330/20170812092249515.PNG-style_webp_375x225\"]");intent.putExtra("curImageUrl", "http://images.yxtribe.com/upload/images/business/20171017094330268.jpg-style_webp_750x350");
//                    Log.v("lgq","tophoto===== "+img+".....  "+ imageUrls);intent.setClass(OneActivity.this, PhotoBrowserActivity.class);startActivity(intent);
//imageUrls格式可变  同时app需要网络链接权限

改进版:https://blog.csdn.net/meixi_android/article/details/82801273

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mongodb mongoose 常用操作符号 整理

操作符描述$eq等于$or或关系$nor或关系取反$gt大于$gte大于等于$lt小于$lte小于等于$ne不等于$in在多个值范围内$nin不在多个值范围内$all匹配数组中多个值$regex正则&#xff0c;用于模糊查询$size匹配数组大小$maxDistance范围查询&#xff0c;距离&#xff08;基于LBS&#…

oracle 数据库新建实例导入数据

oracle 数据库中如何新建实例&#xff0c;然后导入数据 在工作经常需要建一个库&#xff0c;建个表空间&#xff0c;再新建用户&#xff0c;配置权限&#xff0c;导入数据。 第一步 用&#xff24;&#xff22;&#xff23;&#xff21;新建数据库&#xff0c;这个就下一步好&…

android java判断字符串是否为空和是否是手机号和是否是数字,数字转中文

数字转中文 private String getD(int d) { // String[] str { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };String[] str {"零",…

UUID工具类及使用

1.工具类: package UUIdtest;import java.util.UUID;public class UUIDUtil {public static String getUUID() {return UUID.randomUUID().toString();}} 2.使用 package UUIdtest;import org.junit.Test;public class TestUUID {Testpublic void test3(){System.out.println(U…

常用的富文本编辑器推荐

1、tinymce 2、quill https://quilljs.com/

Oracle做ip连接限制

Oracle做ip连接限制 限制登录oracle的IP地址有两种方法 一、编辑$ORACLE_HOME/network/admin/sqlnet.ora&#xff0c;增加 tcp.validnode_checking yes #tcp.invited_nodes() #允许访问的IP列表&#xff0c;各IP之间用逗号分隔 tcp.excluded_nodes() #限制访问的IP列表&#x…

android view滑动到顶部并固定在顶部

创建自定义ScrollView /*** ProjectName: yuanxinclan_new* Author: lgq* Date: 2017/12/20 0020 10:07*/public class StickyScrollView extends ScrollView {/*** Tag for views that should stick and have constant drawing. e.g.* TextViews, ImageViews etc*/public stat…

Python3 字典

字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。 字典的每个键值(key>value)对用冒号(:)分割&#xff0c;每个对之间用逗号(,)分割&#xff0c;整个字典包括在花括号({})中 ,格式如下所示&#xff1a; d {key1 : value1, key2 : value2 }键必须是唯一的&#…

vue-cli 3.0 怎么配置 webpack.ProvidePlugin

const webpack require(webpack);module.exports {chainWebpack: config > {config.plugin(provide).use(webpack.ProvidePlugin, [{$: jquery,jquery: jquery,jQuery: jquery,window.jQuery: jquery}]);}, };

什么是ARP

ARP是地址转换协议&#xff08;Address Resolution Protocol&#xff09;的英文缩写&#xff0c;它是一个链路层协议&#xff0c;工作在OSI模型的第二层&#xff0c;在本层和硬件接口间进行联系&#xff0c;同时对上层&#xff08;网络层&#xff09;提供服务。 二层的以太…

工作112:vue路由跳转错误:Error: Redirected when going from “/login“ to “/home“ via a navigation guard.

vue路由跳转错误&#xff1a;Error: Redirected when going from "/login" to "/home" via a navigation guard. 嗯这是一个非智力性错误 token没获取到 路由守卫

quill一些插件的配置 注意事项

为了方便&#xff0c;是用了vue-quill-editor作为富文本编辑器&#xff0c;但是他和一些插件的安装有注意点&#xff1a; 1、在vue.config.js中修改配置 var webpack require(webpack);module.exports {configureWebpack: {plugins: [new webpack.ProvidePlugin({window.Qu…

PCRE的安装及使用

1、主页地址&#xff1a;http://www.pcre.org/下载pcre-7.8.tar.bz22、解压缩&#xff1a;tar xjpf pcre-7.8.tar.bz23、配置&#xff1a;cd pcre-7.8./configure --prefix/usr/local/pcre-7.8 --libdir/usr/local/lib/pcre --includedir/usr/local/include/pcreconfigure有许多…

android WebView通过js方法与原生交互

根据WebView里面的链接字符串跳转Activity activityBaseWebAddWebView.setWebViewClient(new WebViewClient() {Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {if (url.startsWith(Url.urlHost "/weixin/getJsp?urlwechatweb/business-m…

项目管理工具strber

1.Streber背景介绍&#xff1a; Streber是一个基于WEB的在线项目协调工具&#xff0c;它融合了wiki的思想和项目协作管理机制&#xff0c;成为了一个适用于小型团队的可以贯穿真个项目生命周期的项目协作和管理工具。 Streber的出现的历史并不长&#xff0c;作者为德国人&…

前端项目 开发者环境 和 正式环境 区别

1、在src目录下创建config文件夹。 2、创建三个文件 development.js export default {oss: development,apiUrl: http://0.0.0.0:8081 }production.js export default {oss: development,apiUrl: http://0.0.0.0:8081 }index.js import development from ./development im…