├── .gitignore ├── README.md ├── app ├── 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 ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── itheima │ │ └── library │ │ └── ApplicationTest.java │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── itheima │ └── library │ ├── Info.java │ ├── PhotoView.java │ └── RotateGestureDetector.java ├── local.properties └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | /PhotoView-master.iml 2 | /.idea 3 | /PhotoView.iml 4 | /build 5 | /app/app.iml 6 | /app/build 7 | /library/library.iml 8 | /library/build 9 | /.gradle 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # PhotoView 图片浏览缩放控件 3 | 4 | 和普通的ImageView一样的使用方法 5 | 6 | * 详细的使用方法在DEMO里面都演示啦,如果你觉得这个库还不错,请赏我一颗star吧~~~ 7 | 8 | * 欢迎关注微信公众号 9 | 10 | ![](http://upload-images.jianshu.io/upload_images/4037105-54ace4e4cb94c547.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 11 | 12 | 13 | 14 | 15 | 16 | # 效果图 17 | 18 | ![](http://upload-images.jianshu.io/upload_images/4037105-a677f501448fb1a6.gif?imageMogr2/auto-orient/strip) 19 | 20 | 21 | 22 | ### 1. 在你的 project 的 build.gradle 中加入 23 | ```gradle 24 | allprojects { 25 | repositories { 26 | 27 | maven { url 'https://jitpack.io' } 28 | } 29 | } 30 | ``` 31 | 32 | ### 2. Gradle添加依赖 (推荐) 33 | ```gradle 34 | dependencies { 35 | compile 'com.github.open-android:PhotoImageView:0.1.0' 36 | } 37 | ``` 38 | 39 | 40 | ### 3. xml添加 41 | ```xml 42 | 48 | ``` 49 | 50 | ### 4. java代码 51 | ```java 52 | PhotoView photoView = (PhotoView) findViewById(R.id.img); 53 | // 启用图片缩放功能 54 | photoView.enable(); 55 | // 禁用图片缩放功能 (默认为禁用,会跟普通的ImageView一样,缩放功能需手动调用enable()启用) 56 | photoView.disenable(); 57 | // 获取图片信息 58 | Info info = photoView.getInfo(); 59 | // 从普通的ImageView中获取Info 60 | Info info = PhotoView.getImageViewInfo(ImageView); 61 | ``` 62 | 63 | ### 高级用法 64 | 65 | ![](http://upload-images.jianshu.io/upload_images/4037105-6b3583a39181dcbd.gif?imageMogr2/auto-orient/strip) 66 | 67 | 68 | ### 复制如下内容到java代码中 69 | 70 | ```java 71 | public class PhotoBrowse extends Activity { 72 | 73 | int[] imgs = new int[]{R.mipmap.aaa, R.mipmap.bbb, R.mipmap.ccc, R.mipmap.ddd, R.mipmap.ic_launcher, R.mipmap.image003}; 74 | 75 | GridView gv; 76 | 77 | View mParent; 78 | View mBg; 79 | PhotoView mPhotoView; 80 | Info mInfo; 81 | 82 | AlphaAnimation in = new AlphaAnimation(0, 1); 83 | AlphaAnimation out = new AlphaAnimation(1, 0); 84 | 85 | @Override 86 | protected void onCreate(Bundle savedInstanceState) { 87 | super.onCreate(savedInstanceState); 88 | requestWindowFeature(Window.FEATURE_NO_TITLE); 89 | setContentView(R.layout.activity_photo_browse); 90 | 91 | in.setDuration(300); 92 | out.setDuration(300); 93 | out.setAnimationListener(new Animation.AnimationListener() { 94 | @Override 95 | public void onAnimationStart(Animation animation) { 96 | 97 | } 98 | 99 | @Override 100 | public void onAnimationEnd(Animation animation) { 101 | mBg.setVisibility(View.INVISIBLE); 102 | } 103 | 104 | @Override 105 | public void onAnimationRepeat(Animation animation) { 106 | 107 | } 108 | }); 109 | 110 | mParent = findViewById(R.id.parent); 111 | mBg = findViewById(R.id.bg); 112 | mPhotoView = (PhotoView) findViewById(R.id.img); 113 | mPhotoView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 114 | 115 | gv = (GridView) findViewById(R.id.gv); 116 | gv.setAdapter(new BaseAdapter() { 117 | @Override 118 | public int getCount() { 119 | return imgs.length; 120 | } 121 | 122 | @Override 123 | public Object getItem(int position) { 124 | return null; 125 | } 126 | 127 | @Override 128 | public long getItemId(int position) { 129 | return 0; 130 | } 131 | 132 | @Override 133 | public View getView(int position, View convertView, ViewGroup parent) { 134 | PhotoView p = new PhotoView(PhotoBrowse.this); 135 | p.setLayoutParams(new AbsListView.LayoutParams((int) (getResources().getDisplayMetrics().density * 100), (int) (getResources().getDisplayMetrics().density * 100))); 136 | p.setScaleType(ImageView.ScaleType.CENTER_CROP); 137 | p.setImageResource(imgs[position]); 138 | // 把PhotoView当普通的控件把触摸功能关掉 139 | p.disenable(); 140 | return p; 141 | } 142 | }); 143 | 144 | gv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 145 | @Override 146 | public void onItemClick(AdapterView parent, View view, int position, long id) { 147 | PhotoView p = (PhotoView) view; 148 | mInfo = p.getInfo(); 149 | 150 | mPhotoView.setImageResource(imgs[position]); 151 | mBg.startAnimation(in); 152 | mBg.setVisibility(View.VISIBLE); 153 | mParent.setVisibility(View.VISIBLE);; 154 | mPhotoView.animaFrom(mInfo); 155 | } 156 | }); 157 | 158 | mPhotoView.enable(); 159 | mPhotoView.setOnClickListener(new View.OnClickListener() { 160 | @Override 161 | public void onClick(View v) { 162 | mBg.startAnimation(out); 163 | mPhotoView.animaTo(mInfo, new Runnable() { 164 | @Override 165 | public void run() { 166 | mParent.setVisibility(View.GONE); 167 | } 168 | }); 169 | } 170 | }); 171 | } 172 | 173 | @Override 174 | public void onBackPressed() { 175 | if (mParent.getVisibility() == View.VISIBLE) { 176 | mBg.startAnimation(out); 177 | mPhotoView.animaTo(mInfo, new Runnable() { 178 | @Override 179 | public void run() { 180 | mParent.setVisibility(View.GONE); 181 | } 182 | }); 183 | } else { 184 | super.onBackPressed(); 185 | } 186 | } 187 | } 188 | ``` 189 | 190 | -------------------------------------------------------------------------------- /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/open-android/PhotoImageView/575558dc1aa8c21f5cb96dc16edfe041eb2defb5/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.os.Bundle; 5 | import android.view.View; 6 | import android.widget.ImageView; 7 | 8 | import com.itheima.library.Info; 9 | import com.itheima.library.PhotoView; 10 | 11 | public class ImageViewActivity extends Activity { 12 | 13 | ImageView img; 14 | PhotoView photoView; 15 | 16 | Info mInfo; 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.activity_image_view); 22 | 23 | img = (ImageView) findViewById(R.id.img); 24 | photoView = (PhotoView) findViewById(R.id.photoview); 25 | photoView.enable(); 26 | 27 | img.setOnClickListener(new View.OnClickListener() { 28 | @Override 29 | public void onClick(View v) { 30 | mInfo = PhotoView.getImageViewInfo(img); 31 | img.setVisibility(View.GONE); 32 | photoView.setVisibility(View.VISIBLE); 33 | photoView.animaFrom(mInfo); 34 | } 35 | }); 36 | 37 | photoView.setOnClickListener(new View.OnClickListener() { 38 | @Override 39 | public void onClick(View v) { 40 | photoView.animaTo(mInfo, new Runnable() { 41 | @Override 42 | public void run() { 43 | photoView.setVisibility(View.GONE); 44 | img.setVisibility(View.VISIBLE); 45 | } 46 | }); 47 | } 48 | }); 49 | } 50 | 51 | 52 | 53 | 54 | 55 | @Override 56 | public void onBackPressed() { 57 | if (photoView.getVisibility() == View.VISIBLE) { 58 | photoView.animaTo(mInfo, new Runnable() { 59 | @Override 60 | public void run() { 61 | photoView.setVisibility(View.GONE); 62 | img.setVisibility(View.VISIBLE); 63 | } 64 | }); 65 | } else { 66 | super.onBackPressed(); 67 | } 68 | } 69 | } -------------------------------------------------------------------------------- /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.itheima.library.PhotoView; 9 | 10 | 11 | public class ImgActivity extends Activity { 12 | 13 | String url = "https://ss0.baidu.com/94o3dSag_xI4khGko9WTAnF6hhy/super/whfpf%3D425%2C260%2C50/sign=30f49b810ff79052ef4a147e6acee3f8/5bafa40f4bfbfbedbb34deed7ef0f736afc31f36.jpg"; 14 | String gif = "http://imgsrc.baidu.com/baike/pic/item/7af40ad162d9f2d339d2a789abec8a136227cc91.jpg"; 15 | 16 | PhotoView mPhotoView; 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.activity_img); 22 | 23 | mPhotoView = (PhotoView) findViewById(R.id.img1); 24 | mPhotoView.enable(); 25 | 26 | mPhotoView.setOnLongClickListener(new View.OnLongClickListener() { 27 | @Override 28 | public boolean onLongClick(View v) { 29 | Toast.makeText(ImgActivity.this, "长按了", Toast.LENGTH_SHORT).show(); 30 | return false; 31 | } 32 | }); 33 | 34 | // 使用ImageLoader 35 | // ImaggeLoaderConfiguration configuration = ImageLoaderConfiguration 36 | // .createDefault(this); 37 | // ImageLoader.getInstance().init(configuration); 38 | // ImageLoader.etInstance().displayImage(url, (ImageView) findViewById(R.id.img1)); 39 | 40 | // 使用Glide加载的gif图片同样支持缩放功能 41 | // Glide.with(this) 42 | // .load(gif) 43 | // .crossFade() 44 | // .placeholder(R.mipmap.bbb) 45 | // .into(((PhotoView) findViewById(R.id.img1))); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /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.widget.ImageView; 7 | import android.widget.RadioGroup; 8 | 9 | import com.itheima.library.Info; 10 | import com.itheima.library.PhotoView; 11 | 12 | 13 | public class ImgClick extends Activity implements RadioGroup.OnCheckedChangeListener { 14 | 15 | Info mRectF; 16 | 17 | PhotoView mImg1; 18 | PhotoView mImg2; 19 | 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | // getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 24 | setContentView(R.layout.activity_img_click); 25 | 26 | ((RadioGroup) findViewById(R.id.group)).setOnCheckedChangeListener(this); 27 | 28 | mImg1 = (PhotoView) findViewById(R.id.img1); 29 | mImg2 = (PhotoView) findViewById(R.id.img2); 30 | 31 | //设置不可以双指缩放移动放大等操作,跟普通的image一模一样,默认情况下就是disenable()状态 32 | mImg1.disenable(); 33 | mImg1.setOnClickListener(new View.OnClickListener() { 34 | @Override 35 | public void onClick(View v) { 36 | mImg1.setVisibility(View.GONE); 37 | mImg2.setVisibility(View.VISIBLE); 38 | 39 | //获取img1的信息 40 | mRectF = mImg1.getInfo(); 41 | //让img2从img1的位置变换到他本身的位置 42 | mImg2.animaFrom(mRectF); 43 | } 44 | }); 45 | 46 | // 需要启动缩放需要手动开启 47 | mImg2.enable(); 48 | mImg2.setOnClickListener(new View.OnClickListener() { 49 | @Override 50 | public void onClick(View v) { 51 | // 让img2从自身位置变换到原来img1图片的位置大小 52 | mImg2.animaTo(mRectF, new Runnable() { 53 | @Override 54 | public void run() { 55 | mImg2.setVisibility(View.GONE); 56 | mImg1.setVisibility(View.VISIBLE); 57 | } 58 | }); 59 | } 60 | }); 61 | } 62 | 63 | @Override 64 | public void onBackPressed() { 65 | if (mImg2.getVisibility() == View.VISIBLE) { 66 | mImg2.animaTo(mRectF, new Runnable() { 67 | @Override 68 | public void run() { 69 | mImg2.setVisibility(View.GONE); 70 | mImg1.setVisibility(View.VISIBLE); 71 | } 72 | }); 73 | } else { 74 | super.onBackPressed(); 75 | } 76 | } 77 | 78 | @Override 79 | public void onCheckedChanged(RadioGroup group, int checkedId) { 80 | 81 | switch (checkedId) { 82 | case R.id.center: 83 | mImg1.setScaleType(ImageView.ScaleType.CENTER); 84 | break; 85 | case R.id.center_crop: 86 | mImg1.setScaleType(ImageView.ScaleType.CENTER_CROP); 87 | break; 88 | case R.id.center_inside: 89 | mImg1.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 90 | break; 91 | case R.id.fit_center: 92 | mImg1.setScaleType(ImageView.ScaleType.FIT_CENTER); 93 | break; 94 | 95 | // 建议用了fit_Xy,fit_end,fit_start就不要使用缩放或者animaFrom或animaTo 96 | case R.id.fit_end: 97 | mImg1.setScaleType(ImageView.ScaleType.FIT_END); 98 | break; 99 | case R.id.fit_start: 100 | mImg1.setScaleType(ImageView.ScaleType.FIT_START); 101 | break; 102 | case R.id.fit_xy: 103 | mImg1.setScaleType(ImageView.ScaleType.FIT_XY); 104 | break; 105 | } 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /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 | public class MainActivity extends Activity { 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.activity_main); 18 | 19 | 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.itheima.library.Info; 17 | import com.itheima.library.PhotoView; 18 | 19 | 20 | public class PhotoBrowse extends Activity { 21 | 22 | int[] imgs = new int[]{R.mipmap.aaa, R.mipmap.bbb, R.mipmap.ccc, R.mipmap.ddd, R.mipmap.ic_launcher, R.mipmap.image003}; 23 | 24 | GridView gv; 25 | 26 | View mParent; 27 | View mBg; 28 | PhotoView mPhotoView; 29 | Info mInfo; 30 | 31 | AlphaAnimation in = new AlphaAnimation(0, 1); 32 | AlphaAnimation out = new AlphaAnimation(1, 0); 33 | 34 | @Override 35 | protected void onCreate(Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | requestWindowFeature(Window.FEATURE_NO_TITLE); 38 | setContentView(R.layout.activity_photo_browse); 39 | 40 | in.setDuration(300); 41 | out.setDuration(300); 42 | out.setAnimationListener(new Animation.AnimationListener() { 43 | @Override 44 | public void onAnimationStart(Animation animation) { 45 | 46 | } 47 | 48 | @Override 49 | public void onAnimationEnd(Animation animation) { 50 | mBg.setVisibility(View.INVISIBLE); 51 | } 52 | 53 | @Override 54 | public void onAnimationRepeat(Animation animation) { 55 | 56 | } 57 | }); 58 | 59 | mParent = findViewById(R.id.parent); 60 | mBg = findViewById(R.id.bg); 61 | mPhotoView = (PhotoView) findViewById(R.id.img); 62 | mPhotoView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 63 | 64 | gv = (GridView) findViewById(R.id.gv); 65 | gv.setAdapter(new BaseAdapter() { 66 | @Override 67 | public int getCount() { 68 | return imgs.length; 69 | } 70 | 71 | @Override 72 | public Object getItem(int position) { 73 | return null; 74 | } 75 | 76 | @Override 77 | public long getItemId(int position) { 78 | return 0; 79 | } 80 | 81 | @Override 82 | public View getView(int position, View convertView, ViewGroup parent) { 83 | PhotoView p = new PhotoView(PhotoBrowse.this); 84 | p.setLayoutParams(new AbsListView.LayoutParams((int) (getResources().getDisplayMetrics().density * 100), (int) (getResources().getDisplayMetrics().density * 100))); 85 | p.setScaleType(ImageView.ScaleType.CENTER_CROP); 86 | p.setImageResource(imgs[position]); 87 | // 把PhotoView当普通的控件把触摸功能关掉 88 | p.disenable(); 89 | return p; 90 | } 91 | }); 92 | 93 | gv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 94 | @Override 95 | public void onItemClick(AdapterView parent, View view, int position, long id) { 96 | PhotoView p = (PhotoView) view; 97 | mInfo = p.getInfo(); 98 | 99 | mPhotoView.setImageResource(imgs[position]); 100 | mBg.startAnimation(in); 101 | mBg.setVisibility(View.VISIBLE); 102 | mParent.setVisibility(View.VISIBLE);; 103 | mPhotoView.animaFrom(mInfo); 104 | } 105 | }); 106 | 107 | mPhotoView.enable(); 108 | mPhotoView.setOnClickListener(new View.OnClickListener() { 109 | @Override 110 | public void onClick(View v) { 111 | mBg.startAnimation(out); 112 | mPhotoView.animaTo(mInfo, new Runnable() { 113 | @Override 114 | public void run() { 115 | mParent.setVisibility(View.GONE); 116 | } 117 | }); 118 | } 119 | }); 120 | } 121 | 122 | @Override 123 | public void onBackPressed() { 124 | if (mParent.getVisibility() == View.VISIBLE) { 125 | mBg.startAnimation(out); 126 | mPhotoView.animaTo(mInfo, new Runnable() { 127 | @Override 128 | public void run() { 129 | mParent.setVisibility(View.GONE); 130 | } 131 | }); 132 | } else { 133 | super.onBackPressed(); 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /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.itheima.library.PhotoView; 12 | 13 | 14 | public class ViewPagerActivity extends Activity { 15 | 16 | private ViewPager mPager; 17 | 18 | private int[] imgsId = new int[]{R.mipmap.aaa, R.mipmap.bbb, R.mipmap.ccc, R.mipmap.ddd, R.mipmap.ic_launcher, R.mipmap.image003}; 19 | 20 | @Override 21 | protected void onCreate(Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.activity_view_pager); 24 | 25 | mPager = (ViewPager) findViewById(R.id.pager); 26 | mPager.setPageMargin((int) (getResources().getDisplayMetrics().density * 15)); 27 | mPager.setAdapter(new PagerAdapter() { 28 | @Override 29 | public int getCount() { 30 | return imgsId.length; 31 | } 32 | 33 | @Override 34 | public boolean isViewFromObject(View view, Object object) { 35 | return view == object; 36 | } 37 | 38 | @Override 39 | public Object instantiateItem(ViewGroup container, int position) { 40 | PhotoView view = new PhotoView(ViewPagerActivity.this); 41 | view.enable(); 42 | view.setScaleType(ImageView.ScaleType.FIT_CENTER); 43 | view.setImageResource(imgsId[position]); 44 | container.addView(view); 45 | return view; 46 | } 47 | 48 | @Override 49 | public void destroyItem(ViewGroup container, int position, Object object) { 50 | container.removeView((View) object); 51 | } 52 | }); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /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 |