GestureImageView图片浏览缩放开源项目的应用

简介:

好久没写博客了,最近有点小忙.......,不多罗嗦了.....

在Ynote的改进中涉及到一个图片放大的功能,原来自己开发的图片缩放移动功能没有那么好的用户体验,于是应用网上的开源项目GestureImage。

第一部分参考了http://www.cnblogs.com/joylee/p/Android-GestureImageView.html;

第二部分为第一部分使用时为避免MMO问题,同时缩放图片是图片质量不会太失真而所添加的内容。

如果某项目对图片质量要求很高请参考 《图片无限放大,不模糊,图片移动,仿微信图片放大 》,或许可以将这两篇文章结合起来写一个用户体验很高的图片相关功能

第一部分:

图片缩放插件GestureImageView——Android 常用插件推荐(一)

Android 开发过程中,交互效果是一个非常繁琐的过程,甚至比Web开发过程中JS特效更加复杂。通过多年的发展,常用的交互方式已经发展相当成熟,而且有很多非常好的插件。为了避免重复造轮子,一些常用的特效,我们可以直接拿来就用的,节省我们开发时间。留时间去开发更具有自身特色的东西。这里介绍一些常用的Android插件,而且都是些使用起来很简单的插件。

开篇第一个——GestureImageView

简介:单图浏览插件,支持图片多点缩放,支持图片拖动,开放单击和双击事件,点击事件与触摸事件不冲突(自己写过类似程序的都懂,触摸和点击容易冲突,处理起来有点复杂)

主页:https://github.com/jasonpolites/gesture-imageview

使用方法:

1、Github下载代码

23161906-224a814920054088b4dd3e3096d0272

  example为示例,教你如何使用,实际使用过程中没有任何关系。

  main为插件源码,需要放入自己的项目中。

2、基础配置

  main项目可以生成jar包引用或者作为另外一个项目引用,但个人更喜欢直接引用代码,方便后续修改,也便于规范命名。

  所以,大家可以直接将Main文件中的src的内容放入自己的项目中。

23162504-d1303c67cb394945bd3b954856be361

  因为没有涉及的Layout,所以是不会报错的。

3、使用

  新建一个Layout页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<? xml  version = "1.0"  encoding = "utf-8" ?>
< LinearLayout
     xmlns:android = "http://schemas.android.com/apk/res/android"
     xmlns:gesture-image = "http://schemas.polites.com/android"
     android:layout_width = "fill_parent"
     android:layout_height = "fill_parent"  android:gravity = "center"  >
     < com.polites.android.GestureImageView
         android:id = "@+id/dmImageView"
         android:layout_width = "fill_parent"
         android:layout_height = "wrap_content"
         gesture-image:min-scale = "0.1"
         gesture-image:max-scale = "10.0"
         gesture-image:strict = "false"   />
</ LinearLayout >


注意:LinearLayout中的 xmlns:gesture-image="http://schemas.polites.com/android" ,不添加会报错的。粗心大意很难发现。

1
2
3
gesture-image:min-scale 缩放最小值
gesture-image:max-scale 缩放最大值
gesture-image:strict  是否精确

使用方式和 ImageView 的使用方式是一样的,可以自己尝试其他属性。


GestureImageView使用和配置是非常简单的。入手非常容易,作为这个博主的推荐的第一个插件。下篇为大家推荐一个瀑布流插件。



第二部分:

在使用BitmapFactory.decodeFile(path)时遇到像素大的会产生内存溢出mmo问题

android系统中有这么一个变量BitmapFactory.Options可以安某比例获取到合适的图片。于是上网搜索牛人的帖子组合成下面的代码解决oom问题,同时图片质量又不会太差。

原理就是动态计算某图片Options的值,这样就能将图片质量与MMO兼顾


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public  Bitmap myScaleBitmap(String path){
     BitmapFactory.Options options =  new  BitmapFactory.Options();
     options.inJustDecodeBounds =  true ;
     BitmapFactory.decodeFile(path, options);
     if  (options.mCancel || options.outWidth == - 1  || options.outHeight == - 1 ) {
     return  null ;
     }
     options.inSampleSize = computeSampleSize(options,  600 , ( int ) ( 1  1024  1024 ));
     options.inJustDecodeBounds =  false ;
     options.inDither =  false ;
     options.inPreferredConfig = Bitmap.Config.ARGB_8888;
     Bitmap bitmap = BitmapFactory.decodeFile(path, options);
     return  bitmap;
}
public  static  int  computeSampleSize(BitmapFactory.Options options,
         int  minSideLength,  int  maxNumOfPixels) {
     int  initialSize = computeInitialSampleSize(options, minSideLength,
             maxNumOfPixels);
                                                                                                                                                                                                                                                                       
     int  roundedSize;
     if  (initialSize <=  8 ) {
         roundedSize =  1 ;
         while  (roundedSize < initialSize) {
             roundedSize <<=  1 ;
         }
     else  {
         roundedSize = (initialSize +  7 ) /  8  8 ;
     }
                                                                                                                                                                                                                                                                       
     return  roundedSize;
}
                                                                                                                                                                                                                                                                       
private  static  int  computeInitialSampleSize(BitmapFactory.Options options,
         int  minSideLength,  int  maxNumOfPixels) {
     double  w = options.outWidth;
     double  h = options.outHeight;
                                                                                                                                                                                                                                                                       
     int  lowerBound = (maxNumOfPixels == - 1 ) ?  1  :
             ( int ) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
     int  upperBound = (minSideLength == - 1 ) ?  128  :
             ( int ) Math.min(Math.floor(w / minSideLength),
             Math.floor(h / minSideLength));
                                                                                                                                                                                                                                                                       
     if  (upperBound < lowerBound) {
         // return the larger one when there is no overlapping zone.
         return  lowerBound;
     }
                                                                                                                                                                                                                                                                       
     if  ((maxNumOfPixels == - 1 ) &&
             (minSideLength == - 1 )) {
         return  1 ;
     else  if  (minSideLength == - 1 ) {
         return  lowerBound;
     else  {
         return  upperBound;
     }
}



本文转自lilin9105 51CTO博客,原文链接:http://blog.51cto.com/7071976/1316898,如需转载请自行联系原作者

相关文章
|
图形学
【游戏开发】unity透明特效的制作方法
Unity是一种强大的游戏开发引擎,它支持许多不同的特效和图形效果。其中一种常用的特效是透明特效,它可以使游戏中的材质变得半透明或完全透明。在本文中,我们将介绍如何使用Unity创建透明特效。
|
JSON Android开发 数据格式
原生app开发技巧——底部导航栏动画效果按钮制作方法之采用photoshop制作gif动画-过渡动画关键帧
原生app开发技巧——底部导航栏动画效果按钮制作方法之采用photoshop制作gif动画-过渡动画关键帧
原生app开发技巧——底部导航栏动画效果按钮制作方法之采用photoshop制作gif动画-过渡动画关键帧
|
移动开发 前端开发 JavaScript
移动端 H5图片裁剪插件,内置简单手势操作
移动端 H5图片裁剪插件,内置简单手势操作
移动端 H5图片裁剪插件,内置简单手势操作
|
计算机视觉 人工智能 算法
UWP 手绘视频创作工具技术分享系列 - 位图的绘制
原文:UWP 手绘视频创作工具技术分享系列 - 位图的绘制 前面我们针对 SVG 的解析和绘制做了介绍,SVG 是图片的一种形式,而另一种很重要的图片是:位图,包括 png、jpeg、bmp 等格式。位图的基本规则是,组成的基本元素是像素点,由宽度 * 高度个像素组成,每个像素存储了一个点的颜色和位置信息,颜色信息可以是 ARGB、RGBA、BGR 或 YUV 等组成。
1197 0
|
XML 数据格式 前端开发
UWP 手绘视频创作工具技术分享系列 - SVG 的解析和绘制
原文:UWP 手绘视频创作工具技术分享系列 - SVG 的解析和绘制 本篇作为技术分享系列的第一篇,详细讲一下 SVG 的解析和绘制,这部分功能的研究和最终实现由团队的 @黄超超 同学负责,感谢提供技术文档和支持。
1435 0
|
JSON 前端开发 数据格式
【UWP开源】图片编辑器,带贴图、滤镜、涂鸦等功能
原文:【UWP开源】图片编辑器,带贴图、滤镜、涂鸦等功能 目录 说明 功能 实现原理 使用方法 效果截图   说明 最近空余时间研究了一下Win2D,它能为我们在UWP中提供一种类似GDI那样的绘图方法。
1950 0
下一篇
无影云桌面