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,如需转载请自行联系原作者

相关文章
|
Java
java: 错误: 无效的源发行版:15
java: 错误: 无效的源发行版:15
871 0
java: 错误: 无效的源发行版:15
|
弹性计算 测试技术
阿里云服务器网络收发包PPS是什么意思?5万PPS/10万/20万/80万/100万PPS
阿里云服务器网络收发包PPS是衡量云服务器网络质量的一项重要指标,单位是PPS,PPS是指Packets Per Second,每秒发包数量
7925 0
阿里云服务器网络收发包PPS是什么意思?5万PPS/10万/20万/80万/100万PPS
|
存储 缓存 监控
怎么更好地设计一个优秀的SaaS系统
设计一个优秀的SaaS系统,需要从架构、性能、安全性、租户隔离、扩展性等多方面进行深思熟虑。根据业务需求选择合适的多租户架构,保证数据隔离的同时提高系统性能。
903 1
|
数据采集 监控 大数据
大数据时代的数据质量与数据治理策略
在大数据时代,高质量数据对驱动企业决策和创新至关重要。然而,数据量的爆炸式增长带来了数据质量挑战,如准确性、完整性和时效性问题。本文探讨了数据质量的定义、重要性及评估方法,并提出数据治理策略,包括建立治理体系、数据质量管理流程和生命周期管理。通过使用Apache Nifi等工具进行数据质量监控和问题修复,结合元数据管理和数据集成工具,企业可以提升数据质量,释放数据价值。数据治理需要全员参与和持续优化,以应对数据质量挑战并推动企业发展。
3131 3
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
884 37
|
缓存 NoSQL 关系型数据库
MySQL与Redis缓存一致性的实现与挑战
在现代软件开发中,MySQL作为关系型数据库管理系统,广泛应用于数据存储;而Redis则以其高性能的内存数据结构存储特性,常被用作缓存层来提升数据访问速度。然而,当MySQL与Redis结合使用时,确保两者之间的数据一致性成为了一个重要且复杂的挑战。本文将从技术角度分享MySQL与Redis缓存一致性的实现方法及其面临的挑战。
385 2
|
消息中间件 NoSQL 算法
Redis延时队列,这次彻底给你整明白了!
Redis延时队列,这次彻底给你整明白了!
461 0
|
人工智能 自然语言处理 Java
SemanticKernel:添加插件
SemanticKernel:添加插件
231 0
SemanticKernel:添加插件
|
API Apache C#
推荐2款开源、美观的WinForm UI控件库
推荐2款开源、美观的WinForm UI控件库
1030 1
|
Java API 开发工具
解决 Android 依赖冲突
解决 Android 依赖冲突
598 0