Android 图片预览器加载微博长图,大图
来源:互联网 发布:java web投票系统 编辑:程序博客网 时间:2024/05/22 11:18
通常图片预览的做法是ViewPager+PhotoView,但是遇到很长的图(比如微博长图),在设置
android:scaleType="centerCrop"这个属性的前提下
用ImageLoader 加载会比较模糊(应该是压缩的比较厉害),不设置这个属性,长图不能放大。用Glide加载,虽然就能清楚加载,但是不能滑动。那怎么办呢?
好在GitHub上又大神给我提供了subsampling-scale-image-view,上面介绍了基本用法,这个View能很好的加载长图的问题,在配合Glide的使用,完美的展现一个高效的图片预览,首先添加依赖:
compile 'com.github.bumptech.glide:glide:3.6.1'
compile 'com.davemorrissey.labs:subsampling-scale-image-view:3.5.0'创建一个包含此View的布局:
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:background="#ff000000"> <uk.co.senab.photoview.PhotoView android:id="@+id/zoom_image_view" android:layout_width="match_parent" android:scaleType="centerCrop" android:visibility="gone" android:layout_height="match_parent" /> <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView android:id="@+id/imageView" android:layout_width="match_parent" app:quickScaleEnabled="true" android:layout_height="match_parent"/> <ProgressBar android:id="@+id/loading" android:layout_width="30dp" android:layout_height="30dp" android:visibility="gone" android:layout_gravity="center" /></FrameLayout>
核心代码:
View view = inflater.inflate(R.layout.content_picture_preview,container,false); //View view = inflater.inflate(R.layout.content_picture_preview, container, false); //final PhotoView photoView = (PhotoView) view.findViewById(R.id.zoom_image_view) ; // photoView.setScaleType(ImageView.ScaleType.CENTER_CROP); //final ProgressBar spinner = (ProgressBar) view.findViewById(R.id.loading); //photoView.setBackgroundColor(0xff000000); String imagePath = mPaths.get(position); final SubsamplingScaleImageView imageView = (SubsamplingScaleImageView)view.findViewById(R.id.imageView); //手势回调 gestureDetector = new GestureDetector(PicturePreviewActivity.this, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapConfirmed(MotionEvent e) { if (imageView.isReady()) { PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY()); Toast.makeText(getApplicationContext(), "单击: " + ((int) sCoord.x) + ", " + ((int) sCoord.y), Toast.LENGTH_SHORT).show(); } else { // Toast.makeText(getApplicationContext(), fail_tips, Toast.LENGTH_SHORT).show(); } return false; } @Override public void onLongPress(MotionEvent e) { if (imageView.isReady()) { PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY()); Toast.makeText(getApplicationContext(), "长按: " + ((int) sCoord.x) + ", " + ((int) sCoord.y), Toast.LENGTH_SHORT).show(); } else { //Toast.makeText(getApplicationContext(), fail_tips, Toast.LENGTH_SHORT).show(); } } @Override public boolean onDoubleTap(MotionEvent e) { if (imageView.isReady()) { PointF sCoord = imageView.viewToSourceCoord(e.getX(), e.getY()); Toast.makeText(getApplicationContext(), "双击: " + ((int) sCoord.x) + ", " + ((int) sCoord.y), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "", Toast.LENGTH_SHORT).show(); } return false; } }); imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { return gestureDetector.onTouchEvent(motionEvent); } }); final int pos = position; // imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM); imageView.setMaxScale(15); imageView.setZoomEnabled(true); // spinner.setVisibility(View.GONE); imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM); Glide.with(mContext) .load(imagePath).downloadOnly(new SimpleTarget<File>() { @Override public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) { // 将保存的图片地址给SubsamplingScaleImageView,这里注意设置ImageViewState设置初始显示比例 ImageSource imageSource = ImageSource.uri(Uri.fromFile(resource)); int sWidth = BitmapFactory.decodeFile(resource.getAbsolutePath()).getWidth(); int sHeight = BitmapFactory.decodeFile(resource.getAbsolutePath()).getHeight(); WindowManager wm = (WindowManager) mContext .getSystemService(Context.WINDOW_SERVICE); int width = wm.getDefaultDisplay().getWidth(); int height = wm.getDefaultDisplay().getHeight(); float scale = SystemUtil.displaySize.x / (float) sWidth; //float centerX = SystemUtil.displaySize.x / 2; // imageView.setImage(ImageSource.uri(Uri.fromFile(resource)), new ImageViewState(2.0F, new PointF(0, 0), 0)); //imageView.setImage(ImageSource.uri(Uri.fromFile(resource)), new ImageViewState(2.0F, new PointF(0, 0), 0)); if (sHeight >= height && sHeight / sWidth >=3) { imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP); imageView.setImage(ImageSource.uri(Uri.fromFile(resource)), new ImageViewState(2.0F, new PointF(0, 0), 0)); }else { imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CUSTOM); imageView.setImage(ImageSource.uri(Uri.fromFile(resource))); imageView.setDoubleTapZoomStyle(ZOOM_FOCUS_CENTER_IMMEDIATE); } }});
Glide加载图片判断图片的宽高比例,来做相应的逻辑处理。通过
GestureDetector来控制单击,双击,长按的逻辑控制。这样就能完美加载长图了,赶紧加入到的项目中吧!
0 0
- Android 图片预览器加载微博长图,大图
- Android 大图预览、高效大图加载
- android图片:高效加载大图
- Android缩放图片加载大图片
- android图片_加载大图片
- Android有效加载图片 之 有效加载大图片
- Android低端设备加载大图片、优化设备加载图片
- android 加载大图片时计算图片的缩放比例
- Android 网络加载图片点击大图后 浏览 可 缩放
- Android中加载大图片OOM(图片缩放)
- Android中高效的显示图片 - 加载大图
- Android中高效的显示图片 - 加载大图
- Android中加载高清大图及图片压缩方式
- android 超强大的图片选择器,支持超大图加载
- jQuery实现图片预览大图效果
- 图片预览可以点击查看大图
- Android大图加载方法
- android 高效加载大图
- NUC970平台触摸屏驱动移植
- extern的用法
- Git克隆提交出现“ssh: connect to host github.com port 22: Operation timed out fatal”问题
- bzoj3172: [Tjoi2013]单词
- Fcm算法初步学习探索
- Android 图片预览器加载微博长图,大图
- MySQL常用的命令大全
- ios extern,static,const关键字
- 抽象类和接口:abstract
- js中的阿拉伯数字转中文大写
- iPhone屏幕尺寸、分辨率及适配
- Android自定义照相机 预览拍照 切换前后置摄像头
- centos安装czmq
- linux设备驱动归纳总结(三):3面向对象思想和lseek