├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml └── vcs.xml ├── PhotoView.iml ├── README.md ├── app ├── .gitignore ├── app.iml ├── build.gradle ├── libs │ └── universal-image-loader-1.9.4.jar ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── bm │ │ └── photoview │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── example │ │ └── bm │ │ └── photoview │ │ ├── ImageViewActivity.java │ │ ├── ImgActivity.java │ │ ├── ImgClick.java │ │ ├── MainActivity.java │ │ ├── PhotoBrowse.java │ │ └── ViewPagerActivity.java │ └── res │ ├── layout │ ├── activity_image_view.xml │ ├── activity_img.xml │ ├── activity_img_click.xml │ ├── activity_main.xml │ ├── activity_photo_browse.xml │ └── activity_view_pager.xml │ ├── mipmap-hdpi │ ├── aaa.png │ ├── bbb.jpg │ ├── ccc.png │ ├── ddd.png │ ├── ic_launcher.png │ └── image003.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── demo.apk ├── demo1.gif ├── demo2.gif ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── build.gradle ├── library.iml ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── bm │ │ └── library │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── bm │ └── library │ ├── Info.java │ ├── PhotoView.java │ └── RotateGestureDetector.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | /.idea/workspace.xml 4 | /.idea/libraries 5 | .DS_Store 6 | /build 7 | /captures -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | PhotoView -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | 25 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /PhotoView.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PhotoView 图片浏览缩放控件 2 | 3 | 一个流畅的photoview 4 | 5 | # 效果图 6 | ![PhotoView](./demo2.gif) ![PhotoView](./demo1.gif) 7 | 8 | # 注意 9 | 由于facebook的Fresco图片加载组件所加载出来的drawable图片并非真实的drawable,无法直接获取图片真实宽高,也无法直接响应ImageMatrix的变换, 10 | 且根据Fresco文档的介绍,在后续的版本中,DraweeView会直接继承自View,所有暂不考虑支持Fresco。 11 | 对于其他第三方图片加载库如Glide,ImageLoader,xUtils都是支持的 12 | 13 | # 使用 14 | 1.Gradle添加依赖 (推荐) 15 | ```gradle 16 | dependencies { 17 | compile 'com.bm.photoview:library:1.4.1' 18 | } 19 | ``` 20 | (或者也可以将项目下载下来,将Info.java和PhotoView.java两个文件拷贝到你的项目中,不推荐) 21 | 22 | 2.xml添加 23 | ```xml 24 | 30 | ``` 31 | 32 | 3.java代码 33 | ```java 34 | PhotoView photoView = (PhotoView) findViewById(R.id.img); 35 | // 启用图片缩放功能 36 | photoView.enable(); 37 | // 禁用图片缩放功能 (默认为禁用,会跟普通的ImageView一样,缩放功能需手动调用enable()启用) 38 | photoView.disenable(); 39 | // 获取图片信息 40 | Info info = photoView.getInfo(); 41 | // 从普通的ImageView中获取Info 42 | Info info = PhotoView.getImageViewInfo(ImageView); 43 | // 从一张图片信息变化到现在的图片,用于图片点击后放大浏览,具体使用可以参照demo的使用 44 | photoView.animaFrom(info); 45 | // 从现在的图片变化到所给定的图片信息,用于图片放大后点击缩小到原来的位置,具体使用可以参照demo的使用 46 | photoView.animaTo(info,new Runnable() { 47 | @Override 48 | public void run() { 49 | //动画完成监听 50 | } 51 | }); 52 | // 获取/设置 动画持续时间 53 | photoView.setAnimaDuring(int during); 54 | int d = photoView.getAnimaDuring(); 55 | // 获取/设置 最大缩放倍数 56 | photoView.setMaxScale(float maxScale); 57 | float maxScale = photoView.getMaxScale(); 58 | // 设置动画的插入器 59 | photoView.setInterpolator(Interpolator interpolator); 60 | ``` 61 | 62 | # 关于 63 | 64 | 若遇到使用上的问题,请先翻看Issues,大部分问题是已经有人提出过的。(如[#9](https://github.com/bm-x/PhotoView/issues/9),[#5](https://github.com/bm-x/PhotoView/issues/5)) 65 | 若没找到相关的问题,可以先在Issues中提出,这样以便其他人遇到同样问题时可快速找到答案。 66 | 若长时间未回复,可邮件给我bmme@vip.qq.com 67 | 68 | # 版本 69 | 70 | v1.4.0 71 | * 增加对普通ImageView的支持,可通过PhotoView的静态方法getImageViewInfo(ImageView)从一个普通的ImageView中获取Info,参照ImageViewActivity 72 | * 添加长按事件的监听,setOnLongClickListener() 73 | * 提高图片缩放到屏幕边缘的情况下滑动的流畅性 74 | * 新增get/setAnimaDuring() get/setMaxScale 获取设置动画的持续时间和图片最大缩放倍数 75 | * 通过setInterpolator可设置动画插入器 76 | 77 | v1.3.6 78 | * 增加图片的旋转功能 79 | * 版本号命名改变 80 | 81 | v2.0.7 82 | * 宽高属性可以设置为wrap_content,添加对adjustViewBounds属性的支持 83 | * 修复某些情况下会闪动 84 | * 增加对ScaleType.FIT_START,FIT_END对animaFrom的支持 85 | 86 | v2.0.0 87 | * 添加animaTo,animaFrom方法,支持图片点击放大缩小浏览功能 88 | * 添加enable()和disenable() 打开和关闭触摸缩放方法,默认打开 (当普通ImageView使用的时候建议关闭触摸缩放功能) 89 | * 支持所有ScaleType属性 90 | 91 | v1.0 92 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 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 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.3" 6 | 7 | defaultConfig { 8 | applicationId "com.example.bm.photoview" 9 | minSdkVersion 10 10 | targetSdkVersion 23 11 | versionCode 2 12 | versionName "2.0.2" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(include: ['*.jar'], dir: 'libs') 24 | compile 'com.android.support:appcompat-v7:23.1.0' 25 | compile 'com.github.bumptech.glide:glide:3.6.1' 26 | compile project(':library') 27 | } 28 | -------------------------------------------------------------------------------- /app/libs/universal-image-loader-1.9.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bm-x/PhotoView/5e20691bb7c37e4ca3f678574a16a53e5006aaa6/app/libs/universal-image-loader-1.9.4.jar -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/bm/photoview/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.example.bm.photoview; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 25 | 28 | 31 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/bm/photoview/ImageViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.bm.photoview; 2 | 3 | import android.app.Activity; 4 | import android.support.v4.view.animation.FastOutSlowInInterpolator; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.os.Bundle; 7 | import android.view.View; 8 | import android.view.Window; 9 | import android.view.animation.LinearInterpolator; 10 | import android.view.animation.OvershootInterpolator; 11 | import android.widget.ImageView; 12 | import android.widget.Scroller; 13 | 14 | import com.bm.library.Info; 15 | import com.bm.library.PhotoView; 16 | 17 | public class ImageViewActivity extends Activity { 18 | 19 | ImageView img; 20 | PhotoView photoView; 21 | 22 | Info mInfo; 23 | 24 | @Override 25 | protected void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | setContentView(R.layout.activity_image_view); 28 | 29 | img = (ImageView) findViewById(R.id.img); 30 | photoView = (PhotoView) findViewById(R.id.photoview); 31 | photoView.enable(); 32 | 33 | img.setOnClickListener(new View.OnClickListener() { 34 | @Override 35 | public void onClick(View v) { 36 | mInfo = PhotoView.getImageViewInfo(img); 37 | img.setVisibility(View.GONE); 38 | photoView.setVisibility(View.VISIBLE); 39 | photoView.animaFrom(mInfo); 40 | } 41 | }); 42 | 43 | photoView.setOnClickListener(new View.OnClickListener() { 44 | @Override 45 | public void onClick(View v) { 46 | photoView.animaTo(mInfo, new Runnable() { 47 | @Override 48 | public void run() { 49 | photoView.setVisibility(View.GONE); 50 | img.setVisibility(View.VISIBLE); 51 | } 52 | }); 53 | } 54 | }); 55 | } 56 | 57 | 58 | @Override 59 | public void onBackPressed() { 60 | if (photoView.getVisibility() == View.VISIBLE) { 61 | photoView.animaTo(mInfo, new Runnable() { 62 | @Override 63 | public void run() { 64 | photoView.setVisibility(View.GONE); 65 | img.setVisibility(View.VISIBLE); 66 | } 67 | }); 68 | } else { 69 | super.onBackPressed(); 70 | } 71 | } 72 | } -------------------------------------------------------------------------------- /app/src/main/java/com/example/bm/photoview/ImgActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.bm.photoview; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.widget.Toast; 7 | 8 | import com.bm.library.PhotoView; 9 | 10 | /** 11 | * Created by liuheng on 2015/6/21. 12 | */ 13 | public class ImgActivity extends Activity { 14 | 15 | String url = "https://ss0.baidu.com/94o3dSag_xI4khGko9WTAnF6hhy/super/whfpf%3D425%2C260%2C50/sign=30f49b810ff79052ef4a147e6acee3f8/5bafa40f4bfbfbedbb34deed7ef0f736afc31f36.jpg"; 16 | String gif = "http://imgsrc.baidu.com/baike/pic/item/7af40ad162d9f2d339d2a789abec8a136227cc91.jpg"; 17 | 18 | PhotoView mPhotoView; 19 | 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.activity_img); 24 | 25 | mPhotoView = (PhotoView) findViewById(R.id.img1); 26 | mPhotoView.enable(); 27 | 28 | mPhotoView.setOnLongClickListener(new View.OnLongClickListener() { 29 | @Override 30 | public boolean onLongClick(View v) { 31 | Toast.makeText(ImgActivity.this, "长按了", Toast.LENGTH_SHORT).show(); 32 | return false; 33 | } 34 | }); 35 | 36 | // 使用ImageLoader 37 | // ImaggeLoaderConfiguration configuration = ImageLoaderConfiguration 38 | // .createDefault(this); 39 | // ImageLoader.getInstance().init(configuration); 40 | // ImageLoader.etInstance().displayImage(url, (ImageView) findViewById(R.id.img1)); 41 | 42 | // 使用Glide加载的gif图片同样支持缩放功能 43 | // Glide.with(this) 44 | // .load(gif) 45 | // .crossFade() 46 | // .placeholder(R.mipmap.bbb) 47 | // .into(((PhotoView) findViewById(R.id.img1))); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/bm/photoview/ImgClick.java: -------------------------------------------------------------------------------- 1 | package com.example.bm.photoview; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.view.Window; 7 | import android.view.WindowManager; 8 | import android.widget.ImageView; 9 | import android.widget.RadioGroup; 10 | 11 | import com.bm.library.Info; 12 | import com.bm.library.PhotoView; 13 | 14 | /** 15 | * Created by liuheng on 2015/6/21. 16 | */ 17 | public class ImgClick extends Activity implements RadioGroup.OnCheckedChangeListener { 18 | 19 | Info mRectF; 20 | 21 | PhotoView mImg1; 22 | PhotoView mImg2; 23 | 24 | @Override 25 | protected void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 28 | setContentView(R.layout.activity_img_click); 29 | 30 | ((RadioGroup) findViewById(R.id.group)).setOnCheckedChangeListener(this); 31 | 32 | mImg1 = (PhotoView) findViewById(R.id.img1); 33 | mImg2 = (PhotoView) findViewById(R.id.img2); 34 | 35 | //设置不可以双指缩放移动放大等操作,跟普通的image一模一样,默认情况下就是disenable()状态 36 | mImg1.disenable(); 37 | mImg1.setOnClickListener(new View.OnClickListener() { 38 | @Override 39 | public void onClick(View v) { 40 | mImg1.setVisibility(View.GONE); 41 | mImg2.setVisibility(View.VISIBLE); 42 | 43 | //获取img1的信息 44 | mRectF = mImg1.getInfo(); 45 | //让img2从img1的位置变换到他本身的位置 46 | mImg2.animaFrom(mRectF); 47 | } 48 | }); 49 | 50 | // 需要启动缩放需要手动开启 51 | mImg2.enable(); 52 | mImg2.setOnClickListener(new View.OnClickListener() { 53 | @Override 54 | public void onClick(View v) { 55 | // 让img2从自身位置变换到原来img1图片的位置大小 56 | mImg2.animaTo(mRectF, new Runnable() { 57 | @Override 58 | public void run() { 59 | mImg2.setVisibility(View.GONE); 60 | mImg1.setVisibility(View.VISIBLE); 61 | } 62 | }); 63 | } 64 | }); 65 | } 66 | 67 | @Override 68 | public void onBackPressed() { 69 | if (mImg2.getVisibility() == View.VISIBLE) { 70 | mImg2.animaTo(mRectF, new Runnable() { 71 | @Override 72 | public void run() { 73 | mImg2.setVisibility(View.GONE); 74 | mImg1.setVisibility(View.VISIBLE); 75 | } 76 | }); 77 | } else { 78 | super.onBackPressed(); 79 | } 80 | } 81 | 82 | @Override 83 | public void onCheckedChanged(RadioGroup group, int checkedId) { 84 | 85 | switch (checkedId) { 86 | case R.id.center: 87 | mImg1.setScaleType(ImageView.ScaleType.CENTER); 88 | break; 89 | case R.id.center_crop: 90 | mImg1.setScaleType(ImageView.ScaleType.CENTER_CROP); 91 | break; 92 | case R.id.center_inside: 93 | mImg1.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 94 | break; 95 | case R.id.fit_center: 96 | mImg1.setScaleType(ImageView.ScaleType.FIT_CENTER); 97 | break; 98 | 99 | // 建议用了fit_Xy,fit_end,fit_start就不要使用缩放或者animaFrom或animaTo 100 | case R.id.fit_end: 101 | mImg1.setScaleType(ImageView.ScaleType.FIT_END); 102 | break; 103 | case R.id.fit_start: 104 | mImg1.setScaleType(ImageView.ScaleType.FIT_START); 105 | break; 106 | case R.id.fit_xy: 107 | mImg1.setScaleType(ImageView.ScaleType.FIT_XY); 108 | break; 109 | } 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/bm/photoview/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.bm.photoview; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.graphics.Matrix; 6 | import android.graphics.RectF; 7 | import android.os.Bundle; 8 | import android.util.Log; 9 | import android.view.View; 10 | 11 | /** 12 | * Created by liuheng on 2015/6/21. 13 | */ 14 | public class MainActivity extends Activity { 15 | 16 | @Override 17 | protected void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | setContentView(R.layout.activity_main); 20 | } 21 | 22 | public void img(View view) { 23 | startActivity(new Intent(this, ImgActivity.class)); 24 | } 25 | 26 | public void viewpager(View view) { 27 | startActivity(new Intent(this, ViewPagerActivity.class)); 28 | } 29 | 30 | public void imgclick(View view) { 31 | startActivity(new Intent(this, ImgClick.class)); 32 | } 33 | 34 | public void photobrowse(View view) { 35 | startActivity(new Intent(this, PhotoBrowse.class)); 36 | } 37 | 38 | public void imageview(View view) { 39 | startActivity(new Intent(this, ImageViewActivity.class)); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/bm/photoview/PhotoBrowse.java: -------------------------------------------------------------------------------- 1 | package com.example.bm.photoview; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.view.Window; 8 | import android.view.animation.AlphaAnimation; 9 | import android.view.animation.Animation; 10 | import android.widget.AbsListView; 11 | import android.widget.AdapterView; 12 | import android.widget.BaseAdapter; 13 | import android.widget.GridView; 14 | import android.widget.ImageView; 15 | 16 | import com.bm.library.Info; 17 | import com.bm.library.PhotoView; 18 | 19 | /** 20 | * Created by liuheng on 2015/8/19. 21 | */ 22 | public class PhotoBrowse extends Activity { 23 | 24 | int[] imgs = new int[]{R.mipmap.aaa, R.mipmap.bbb, R.mipmap.ccc, R.mipmap.ddd, R.mipmap.ic_launcher, R.mipmap.image003}; 25 | 26 | GridView gv; 27 | 28 | View mParent; 29 | View mBg; 30 | PhotoView mPhotoView; 31 | Info mInfo; 32 | 33 | AlphaAnimation in = new AlphaAnimation(0, 1); 34 | AlphaAnimation out = new AlphaAnimation(1, 0); 35 | 36 | @Override 37 | protected void onCreate(Bundle savedInstanceState) { 38 | super.onCreate(savedInstanceState); 39 | requestWindowFeature(Window.FEATURE_NO_TITLE); 40 | setContentView(R.layout.activity_photo_browse); 41 | 42 | in.setDuration(300); 43 | out.setDuration(300); 44 | out.setAnimationListener(new Animation.AnimationListener() { 45 | @Override 46 | public void onAnimationStart(Animation animation) { 47 | 48 | } 49 | 50 | @Override 51 | public void onAnimationEnd(Animation animation) { 52 | mBg.setVisibility(View.INVISIBLE); 53 | } 54 | 55 | @Override 56 | public void onAnimationRepeat(Animation animation) { 57 | 58 | } 59 | }); 60 | 61 | mParent = findViewById(R.id.parent); 62 | mBg = findViewById(R.id.bg); 63 | mPhotoView = (PhotoView) findViewById(R.id.img); 64 | mPhotoView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 65 | 66 | gv = (GridView) findViewById(R.id.gv); 67 | gv.setAdapter(new BaseAdapter() { 68 | @Override 69 | public int getCount() { 70 | return imgs.length; 71 | } 72 | 73 | @Override 74 | public Object getItem(int position) { 75 | return null; 76 | } 77 | 78 | @Override 79 | public long getItemId(int position) { 80 | return 0; 81 | } 82 | 83 | @Override 84 | public View getView(int position, View convertView, ViewGroup parent) { 85 | PhotoView p = new PhotoView(PhotoBrowse.this); 86 | p.setLayoutParams(new AbsListView.LayoutParams((int) (getResources().getDisplayMetrics().density * 100), (int) (getResources().getDisplayMetrics().density * 100))); 87 | p.setScaleType(ImageView.ScaleType.CENTER_CROP); 88 | p.setImageResource(imgs[position]); 89 | // 把PhotoView当普通的控件把触摸功能关掉 90 | p.disenable(); 91 | return p; 92 | } 93 | }); 94 | 95 | gv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 96 | @Override 97 | public void onItemClick(AdapterView parent, View view, int position, long id) { 98 | PhotoView p = (PhotoView) view; 99 | mInfo = p.getInfo(); 100 | 101 | mPhotoView.setImageResource(imgs[position]); 102 | mBg.startAnimation(in); 103 | mBg.setVisibility(View.VISIBLE); 104 | mParent.setVisibility(View.VISIBLE);; 105 | mPhotoView.animaFrom(mInfo); 106 | } 107 | }); 108 | 109 | mPhotoView.enable(); 110 | mPhotoView.setOnClickListener(new View.OnClickListener() { 111 | @Override 112 | public void onClick(View v) { 113 | mBg.startAnimation(out); 114 | mPhotoView.animaTo(mInfo, new Runnable() { 115 | @Override 116 | public void run() { 117 | mParent.setVisibility(View.GONE); 118 | } 119 | }); 120 | } 121 | }); 122 | } 123 | 124 | @Override 125 | public void onBackPressed() { 126 | if (mParent.getVisibility() == View.VISIBLE) { 127 | mBg.startAnimation(out); 128 | mPhotoView.animaTo(mInfo, new Runnable() { 129 | @Override 130 | public void run() { 131 | mParent.setVisibility(View.GONE); 132 | } 133 | }); 134 | } else { 135 | super.onBackPressed(); 136 | } 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/bm/photoview/ViewPagerActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.bm.photoview; 2 | 3 | import android.app.Activity; 4 | import android.support.v4.view.PagerAdapter; 5 | import android.support.v4.view.ViewPager; 6 | import android.os.Bundle; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.ImageView; 10 | 11 | import com.bm.library.PhotoView; 12 | 13 | /** 14 | * Created by liuheng on 2015/8/19. 15 | */ 16 | public class ViewPagerActivity extends Activity { 17 | 18 | private ViewPager mPager; 19 | 20 | private int[] imgsId = new int[]{R.mipmap.aaa, R.mipmap.bbb, R.mipmap.ccc, R.mipmap.ddd, R.mipmap.ic_launcher, R.mipmap.image003}; 21 | 22 | @Override 23 | protected void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | setContentView(R.layout.activity_view_pager); 26 | 27 | mPager = (ViewPager) findViewById(R.id.pager); 28 | mPager.setPageMargin((int) (getResources().getDisplayMetrics().density * 15)); 29 | mPager.setAdapter(new PagerAdapter() { 30 | @Override 31 | public int getCount() { 32 | return imgsId.length; 33 | } 34 | 35 | @Override 36 | public boolean isViewFromObject(View view, Object object) { 37 | return view == object; 38 | } 39 | 40 | @Override 41 | public Object instantiateItem(ViewGroup container, int position) { 42 | PhotoView view = new PhotoView(ViewPagerActivity.this); 43 | view.enable(); 44 | view.setScaleType(ImageView.ScaleType.FIT_CENTER); 45 | view.setImageResource(imgsId[position]); 46 | container.addView(view); 47 | return view; 48 | } 49 | 50 | @Override 51 | public void destroyItem(ViewGroup container, int position, Object object) { 52 | container.removeView((View) object); 53 | } 54 | }); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_image_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_img.xml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_img_click.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | 17 | 24 | 25 | 30 | 31 | 37 | 38 | 43 | 44 | 49 | 50 | 55 | 56 | 61 | 62 | 67 | 68 | 69 | 70 | 78 | 79 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 11 | 12 |