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

相关文章
|
6月前
|
存储
CocosCreator3.8研究笔记(二十二)CocosCreator 动画系统-动画剪辑和动画组件介绍
CocosCreator3.8研究笔记(二十二)CocosCreator 动画系统-动画剪辑和动画组件介绍
111 0
|
4月前
|
机器学习/深度学习 算法 图形学
Unity小游戏——无限滚动的背景的改良
Unity小游戏——无限滚动的背景的改良
|
6月前
|
数据安全/隐私保护 iOS开发 MacOS
CocosCreator3.8研究笔记(二十四)CocosCreator 动画系统-动画编辑器实操-关键帧实现动态水印动画效果(2)
CocosCreator3.8研究笔记(二十四)CocosCreator 动画系统-动画编辑器实操-关键帧实现动态水印动画效果
|
6月前
|
数据安全/隐私保护
CocosCreator3.8研究笔记(二十四)CocosCreator 动画系统-动画编辑器实操-关键帧实现动态水印动画效果(1)
CocosCreator3.8研究笔记(二十四)CocosCreator 动画系统-动画编辑器实操-关键帧实现动态水印动画效果
|
前端开发 JavaScript
一起看跨年烟花(自定义背景+流行背景音乐+雪花)---- 系列
一起看跨年烟花(自定义背景+流行背景音乐+雪花)---- 系列
174 0
一起看跨年烟花(自定义背景+流行背景音乐+雪花)---- 系列
|
API 数据库 开发者
用HarmonyOS ArkUI调用三方库PhotoView实现图片的联播、缩放
本文演示如果用HarmonyOS的ArkUI来调用已经上架到三方库中心的社区库。体验HarmonyOS 3最新的API 9,欢迎大家一起参与构建这个万物互联的时代
147 0
|
存储 JSON 缓存
从零开发一款图片编辑器Mitu
我们知道,为了提高企业研发效能和对客户需求的快速响应,现在很多企业都在着手数字化转型,不仅仅是大厂(阿里,字节,腾讯,百度)在做低代码可视化这一块,很多中小企业也在做,拥有可视化低代码相关技术背景的程序员也越来受重视。
519 0
|
编解码
unity3dUGUI之UI粒子特效自适应缩放
using UnityEngine; using System.Collections; using System.Collections.Generic; public class UIParticleScale : MonoBehaviour...
1522 0
|
图形学
Unity UGUI Image 中文教程-UGUI全系列
Unity UGUI Image 中文详解-Chinar 助力快速掌握 Unity UGUI中 Image 组件的使用 为初学者节省宝贵的时间,避免采坑! Image 组件是 UGUI 中最常用的组件。
7497 0
|
Android开发 数据格式 XML
Android项目实战(三十六):给背景加上阴影效果
原文:Android项目实战(三十六):给背景加上阴影效果   圆角背景大家应该经常用: 一个drawable资源文件  里面控制corner圆角 和solid填充色     那么在此基础上 , 实现带阴影效果的圆角背景    代码如下  效果: 可以看到 右侧和下侧都有一个小范围的灰色阴影效果。
1667 0