一、今天,来介绍一个开源框架PhotoView,使用十分方便快捷,此框架可以实现以下这些功能:
(1)、android图片的浏览功能。
(2)、图片放大缩小功能,可以使用PhotoView双击放大,双指放大缩放ImageView的功能,使用多点触控和双击。
(3)、滚动,以平滑滚动甩。

二、此框架的地址:
(1)、PhotoView框架的github地址:
https://github.com/chrisbanes/PhotoView
现在谷歌已经不支持Eclipse开发Android应用了,并且早就不更新了,所以建议大家使用Android Studio工具开发,而现在github里的开源框架都是为Android Studio的,如果大家用过Android Studio,学过gradle的知识,应该会用,我还没装Android Studio工具,大家见谅,因为某些原因,况且现在这台机子太卡,配置低,估计也跑不起Android Studio。
(2)、这里我附上PhotoView的相关jar包的下载地址:
http://download.csdn.net/download/u012561176/9306517
下载后解压有两个jar包,如下图所示:

三、接下来用一个例子来介绍PhotoView的使用:
(1)、首先,新建一个Android项目,项目名为PhotoViewTest,新建完毕后将上述下载好的jar包复制进android项目底下的libs目录下,如下图所示:

(2)、接着新建一个类,类名为PhotoView,继承于ImageView类,实现IPhotoView接口,如下所示:

代码如下:

package com.example.photoview;import uk.co.senab.photoview.IPhotoView;
import uk.co.senab.photoview.PhotoViewAttacher;
import uk.co.senab.photoview.PhotoViewAttacher.OnMatrixChangedListener;
import uk.co.senab.photoview.PhotoViewAttacher.OnPhotoTapListener;
import uk.co.senab.photoview.PhotoViewAttacher.OnViewTapListener;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.AttributeSet;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.View.OnLongClickListener;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;public class PhotoView extends ImageView implements IPhotoView {private final PhotoViewAttacher mAttacher;private ScaleType mPendingScaleType;public PhotoView(Context context) {this(context, null);}public PhotoView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);super.setScaleType(ScaleType.MATRIX);mAttacher = new PhotoViewAttacher(this);if (null != mPendingScaleType) {setScaleType(mPendingScaleType);mPendingScaleType = null;}}public PhotoView(Context context, AttributeSet attrs) {this(context, attrs, 0);}@Overridepublic boolean canZoom() {// TODO Auto-generated method stubreturn mAttacher.canZoom();}@Overridepublic Matrix getDisplayMatrix() {// TODO Auto-generated method stubreturn mAttacher.getDrawMatrix();}@Overridepublic RectF getDisplayRect() {// TODO Auto-generated method stubreturn mAttacher.getDisplayRect();}@Overridepublic IPhotoView getIPhotoViewImplementation() {// TODO Auto-generated method stubreturn mAttacher;}@Overridepublic float getMaxScale() {// TODO Auto-generated method stubreturn getMaximumScale();}@Overridepublic float getMaximumScale() {// TODO Auto-generated method stubreturn mAttacher.getMaximumScale();}@Overridepublic float getMediumScale() {// TODO Auto-generated method stubreturn mAttacher.getMediumScale();}@Overridepublic float getMidScale() {// TODO Auto-generated method stubreturn getMediumScale();}@Overridepublic float getMinScale() {// TODO Auto-generated method stubreturn getMinimumScale();}@Overridepublic float getMinimumScale() {// TODO Auto-generated method stubreturn mAttacher.getMinimumScale();}@Overridepublic OnPhotoTapListener getOnPhotoTapListener() {// TODO Auto-generated method stubreturn mAttacher.getOnPhotoTapListener();}@Overridepublic OnViewTapListener getOnViewTapListener() {// TODO Auto-generated method stubreturn mAttacher.getOnViewTapListener();}@Overridepublic float getScale() {// TODO Auto-generated method stubreturn mAttacher.getScale();}@Overridepublic Bitmap getVisibleRectangleBitmap() {// TODO Auto-generated method stubreturn mAttacher.getVisibleRectangleBitmap();}@Overridepublic void setAllowParentInterceptOnEdge(boolean allow) {// TODO Auto-generated method stubmAttacher.setAllowParentInterceptOnEdge(allow);}@Overridepublic boolean setDisplayMatrix(Matrix finalMatrix) {// TODO Auto-generated method stubreturn mAttacher.setDisplayMatrix(finalMatrix);}@Overridepublic void setMaxScale(float maxScale) {// TODO Auto-generated method stubmAttacher.setMaxScale(maxScale);}@Overridepublic void setMaximumScale(float maximumScale) {// TODO Auto-generated method stubmAttacher.setMaximumScale(maximumScale);}@Overridepublic void setMediumScale(float mediumScale) {// TODO Auto-generated method stubmAttacher.setMediumScale(mediumScale);}@Overridepublic void setMidScale(float midScale) {// TODO Auto-generated method stubmAttacher.setMidScale(midScale);}@Overridepublic void setMinScale(float minScale) {// TODO Auto-generated method stubmAttacher.setMinScale(minScale);}@Overridepublic void setMinimumScale(float minimumScale) {// TODO Auto-generated method stubmAttacher.setMinimumScale(minimumScale);}@Overridepublic void setImageResource(int resId) {// TODO Auto-generated method stubsuper.setImageResource(resId);if (null != mAttacher) {mAttacher.update();}}@Overridepublic void setImageURI(Uri uri) {// TODO Auto-generated method stubsuper.setImageURI(uri);if (null != mAttacher) {mAttacher.update();}}@Overridepublic void setImageDrawable(Drawable drawable) {// TODO Auto-generated method stubsuper.setImageDrawable(drawable);if(null !=mAttacher){mAttacher.update();}}@Overridepublic void setImageBitmap(Bitmap bm) {// TODO Auto-generated method stubsuper.setImageBitmap(bm);if(null !=mAttacher){mAttacher.update();}}@Overridepublic void setOnDoubleTapListener(OnDoubleTapListener newOnDoubleTapListener) {// TODO Auto-generated method stubmAttacher.setOnDoubleTapListener(newOnDoubleTapListener);}@Overridepublic void setOnMatrixChangeListener(OnMatrixChangedListener listener) {// TODO Auto-generated method stubmAttacher.setOnMatrixChangeListener(listener);}@Overridepublic void setOnPhotoTapListener(OnPhotoTapListener listener) {// TODO Auto-generated method stubmAttacher.setOnPhotoTapListener(listener);}@Overridepublic void setOnLongClickListener(OnLongClickListener listener) {// TODO Auto-generated method stubmAttacher.setOnLongClickListener(listener);}@Overridepublic void setOnViewTapListener(OnViewTapListener listener) {// TODO Auto-generated method stubmAttacher.setOnViewTapListener(listener);}@Overridepublic void setPhotoViewRotation(float rotationDegrees) {// TODO Auto-generated method stubmAttacher.setRotationTo(rotationDegrees);}@Overridepublic void setRotationBy(float rotationDegrees) {// TODO Auto-generated method stubmAttacher.setRotationBy(rotationDegrees);}@Overridepublic void setRotationTo(float rotationDegrees) {// TODO Auto-generated method stubmAttacher.setRotationTo(rotationDegrees);}@Overridepublic void setScale(float scale) {// TODO Auto-generated method stubmAttacher.setScale(scale);}@Overridepublic void setScale(float scale, boolean animate) {// TODO Auto-generated method stubmAttacher.setScale(scale, animate);}@Overridepublic void setScale(float scale, float focalX, float focalY,boolean animate) {// TODO Auto-generated method stubmAttacher.setScale(scale, focalX, focalY, animate);}@Overridepublic void setZoomTransitionDuration(int milliseconds) {// TODO Auto-generated method stubmAttacher.setZoomTransitionDuration(milliseconds);}@Overridepublic void setScaleType(ScaleType scaleType) {if (null != mAttacher) {mAttacher.setScaleType(scaleType);} else {mPendingScaleType = scaleType;}}@Overridepublic void setZoomable(boolean zoomable) {// TODO Auto-generated method stubmAttacher.setZoomable(zoomable);}@Overrideprotected void onDetachedFromWindow() {// TODO Auto-generated method stubmAttacher.cleanup();super.onDetachedFromWindow();}}

上述PhotoView类其实就是为一个自定义的视图类,继承于ImageView类,所以可以把需要放大的ImageView给替换为这个自定义的视图类PhotoView,即可以实现相应的功能了。
(3)、打开activity_main.xml文件,使用上述自定义的视图即可,代码如下:

<LinearLayout 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"><com.example.photoview.PhotoView android:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/img10"/></LinearLayout>

(4)、运行此项目,即可实现双击放大、双指放大缩放图片的功能了。

四、其中我们不能看PhotoView开源框架里的代码,而另一个jar包就可以看,我们可以把另一jar包复制进libs目录下,如下图所示:

(1)、然后我们可以打开如下图的目录底下,然后我们就可以打开里面的类,可查看源代码,需要的时候可以复制代码:

(2)、其中我上面附的PhotoView代码就是从PhotoView.class类下复制过去的,只需我们改下包名即可使用,挺方便的。

五、以上内容仅供大家学习参考,谢谢!

Android学习之PhotoView在Eclipse上的使用相关推荐

  1. android学习笔记---32_文件断点上传器,解决多用户并发,以及自定义协议,注意协议中的漏洞

    32_文件断点上传器 --------------------------- 1.当文件很大的时候就无法通过http协议进行上传了,因为get,post的安全原因,很多服 务器会   禁止这些协议,而 ...

  2. Android学习-使用WebView在app上显示网页

    通过Intent调用系统浏览器 Uri uri = Uri.parse(url);//url为你要链接的地址 Intent intent = new Intent(Intent.ACTION_VIEW ...

  3. android学习——popupWindow 在指定位置上的显示

    先看效果图,免得浪费大家时间,看是不是想要的效果 . 直接上代码 ,核心方法. private void showPopupWindow(View parent) { if (popupWindow  ...

  4. 在Eclipse上搭建Android开发环境

    声明:转摘请注明http://blog.csdn.net/longming_xu/article/details/28241045 前言:为什么要写这么一篇文章?网上介绍Android开发环境搭建的文 ...

  5. 在eclipse上开发Android应用程序

    Android中文文档:开发和调试(eclipse) 2009-12-18 22:13 在用eclipse IDE开发android应用程序之前,你首先要创建一个Android工程,并且建立一个启动配 ...

  6. Android学习系列(10)--App列表之拖拽ListView(上)

    研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨.       鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. ...

  7. 在Eclipse上搭建Android C开发环境

    1.需要准备的工具和软件 JDK eclipse indigo(我下载的是indigo的C/C++开发版) ADT12.0(当然下最新的ADT了,免得有太多的麻烦.) Android SDK Andr ...

  8. Android学习之网上商城(上)

    前言 又到了课设的时候,这次课设比较难受,因为两周时间中还有3门考试,在课设的时候还要复习,着实耗费了不少的精力,不过也收获多多,接下来总结一下本次课设中学到的东西 Android学习之网上商城(上) ...

  9. Pro Android学习笔记(一五五) 传感器(5) 磁场传感器和方位(上)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 文章转载 ...

最新文章

  1. 【java】快速复制数组方法arraycopy的使用
  2. 如何运用深度强化学习,让机器人运动更灵活智能?
  3. mysql 书签查找_my-bookmark
  4. 仙剑4按键取钱的东东。
  5. python linux 优化_Linux性能优化(一)
  6. 如何展示富文本_自助建站如何做出个性化效果?
  7. 《Oracle大型数据库在AIX UNIX上的实战详解》的集中答疑九 数据库字符集与国家语言...
  8. linux系统界面光标不见了---木有了
  9. bat文件名操作_Excel按文件名制作目录,你复制粘贴花一小时,同事只要十秒搞定...
  10. activiti7 和业务_华电集团电子商务平台非招标业务操作指南
  11. 3-cd 命令总结
  12. Python3 openpyxl库
  13. linux/windows双系统安装、启动顺序设置及重新设置
  14. Python3.5(十三)迭代器生成器
  15. 关于HAL.DLL文件丢失导致系统无法启动的问题
  16. MFC中系统提供的16种光标形状描述
  17. 商业的10个最佳Android应用程序模板
  18. 同样的神经网络引擎,苹果A11芯片比华为麒麟970牛在哪?
  19. 31、【栈和队列】判断链表是否为中心对称(C++版)
  20. 阅读笔记:XModal-ID: Through-Wall Person Identification from Candidate Video Footage Using WiFi

热门文章

  1. 说一个闭包在实际开发中的应用
  2. python-Generalization of Hops
  3. Excel 导入 Sql Server出错——“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”错误的解决...
  4. Kindeditor JS 取值。。。
  5. SPOJ 4487 Can you answer these queries VI
  6. .NET中的异步编程(一)-为什么需要异步
  7. qt 的mysql的库
  8. Nodejs Set和Map的使用
  9. R7-3 出租 (20 分)
  10. 7-102 单词首字母大写 (15 分)