Android中第三方控件PhotoView的基本使用

PhotoView的简介:
这是一个图片查看库,实现图片浏览功能,支持pinch(捏合)手势或者点击放大缩小。支持在ViewPager中翻页浏览图片。

PhotoView 是一款扩展自Android ImageView ,支持通过单点/多点触摸来进行图片缩放的智能控件。功能实用和强大。

PhotoView的功能:
图片浏览查看
双指缩放
单点触摸缩放
图片缩放模式设置

基本用法:
导入jar包,布局XML里设置PhotoView
将ImageView传入PhotoViewAttacher
代码演示:
使用 PhotoView进行网络图片和本地图片的加载,缩放和点击事件处理

布局文件中:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <span style="background-color: rgb(255, 255, 255);"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     tools:context=".MainActivity"  
  6.     android:orientation="vertical"  
  7.      >  
  8.   
  9.       <uk.co.senab.photoview.PhotoView  
  10.         android:id="@+id/iv_photo1"  
  11.         android:layout_width="match_parent"  
  12.         android:layout_height="wrap_content"        
  13.          
  14.          />  
  15.         <uk.co.senab.photoview.PhotoView  
  16.         android:id="@+id/iv_photo2"  
  17.         android:layout_width="match_parent"  
  18.         android:layout_height="wrap_content"        
  19.        
  20.          />  
  21.   
  22. </LinearLayout></span>  

MainActivity中:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.     private PhotoView iv_photo1;  
  3.     private PhotoView iv_photo2;  
  4.   
  5.   
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_main);  
  10.         iv_photo1 = (PhotoView) findViewById(R.id.iv_photo1);  
  11.         iv_photo2 = (PhotoView) findViewById(R.id.iv_photo2);  
  12. //      localImage();  
  13.         netImage();  
  14.           
  15.     }  
  16.   
  17. /**  
  18.  * 加载本地图片   
  19.  *  
  20.  */  
  21.     private void localImage() {  
  22. //       加载本地图片,缩放处理  
  23.          try {  
  24. //       图片在asset目录中       
  25.          InputStream is = getAssets().open("photo2.jpg");  
  26.          Bitmap bm = BitmapFactory.decodeStream(is);  
  27.          iv_photo1.setImageBitmap(bm);  
  28.          } catch (IOException e) {  
  29.          e.printStackTrace();  
  30.          }  
  31.           
  32.     }  
  33.     /** 
  34.      * 加载网络图片 
  35.      */  
  36.     private void netImage() {  
  37.         ImageLoader loader = ImageLoader.getInstance();  
  38.         loader.displayImage("https://www.baidu.com/img/bdlogo.png", iv_photo2);  
  39.         iv_photo2.setOnPhotoTapListener(new OnPhotoTapListener() {  
  40.               
  41.             @Override  
  42.             public void onPhotoTap(View arg0, float arg1, float arg2) {  
  43.                 Toast.makeText(MainActivity.this"图片被点击了"10).show();  
  44.             }  
  45.         });  
  46.           
  47.     }  
  48.       
  49.   
  50.       
  51. }  
BaseApplication中:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 加载网络图片时,需要对ImageLoader进行全局配置 
  3.  * 
  4.  */  
  5.   
  6. public class BaseApplication extends Application {  
  7.   
  8.     @Override  
  9.     public void onCreate() {  
  10.         super.onCreate();  
  11.         initImagloader(getApplicationContext());  
  12.     }  
  13.   
  14.     private void initImagloader(Context context) {  
  15.         File cacheDir = StorageUtils.getOwnCacheDirectory(context,  
  16.                 "photoview/Cache");// 获取到缓存的目录地址  
  17.         // 创建配置ImageLoader(所有的选项都是可选的,只使用那些你真的想定制),这个可以设定在APPLACATION里面,设置为全局的配置参数  
  18.         ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(  
  19.                 context)  
  20.                 // 线程池内加载的数量  
  21.                 .threadPoolSize(3).threadPriority(Thread.NORM_PRIORITY - 2)  
  22.                 .memoryCache(new WeakMemoryCache())  
  23.                 .denyCacheImageMultipleSizesInMemory()  
  24.                 .discCacheFileNameGenerator(new Md5FileNameGenerator())  
  25.                 // 将保存的时候的URI名称用MD5 加密  
  26.                 .tasksProcessingOrder(QueueProcessingType.LIFO)  
  27.                 .discCache(new UnlimitedDiscCache(cacheDir))// 自定义缓存路径  
  28.                 // .defaultDisplayImageOptions(DisplayImageOptions.createSimple())  
  29.                 .writeDebugLogs() // Remove for release app  
  30.                 .build();  
  31.         // Initialize ImageLoader with configuration.  
  32.         ImageLoader.getInstance().init(config);// 全局初始化此配置  
  33.     }  
  34. }  
主清单配置文件中:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="android.permission.INTERNET"/>  
  2.    <application  
  3.        android:name="com.zhhandroid.BaseApplication"  
  4.        android:allowBackup="true"  
  5.        android:icon="@drawable/ic_launcher"  
  6.        android:label="@string/app_name"  
  7.        android:theme="@style/AppTheme" >  
  8.        <activity  
  9.            android:name=".MainActivity"  
  10.            android:label="@string/app_name" >  
  11.            <intent-filter>  
  12.                <action android:name="android.intent.action.MAIN" />  
  13.   
  14.                <category android:name="android.intent.category.LAUNCHER" />  
  15.            </intent-filter>  
  16.        </activity>  
  17.    </application>  

效果:


需要导入的jar包:

photoview-library-1.2.2.jar

universal-image-loader-1.9.2_sources.jar

效果展示:


jar包及源码下载:

http://download.csdn.net/detail/zhaihaohao1/9432820

PhotoView PhotoView aims to help produce an easily usable implementation of a zooming Android ImageView. Branch Develop: Build Status Branch Master: Build Status PhotoView Features Out of the box zooming, using multi-touch and double-tap. Scrolling, with smooth scrolling fling. Works perfectly when used in a scrolling parent (such as ViewPager). Allows the application to be notified when the displayed Matrix has changed. Useful for when you need to update your UI based on the current zoom/scroll position. Allows the application to be notified when the user taps on the Photo. Sample Application The sample application (the source is in the repository) has been published onto Google Play for easy access: Get it on Google Play Gradle Dependency Add this in your root build.gradle file (not your module build.gradle file): allprojects { repositories { ... maven { url "https://jitpack.io" } } } Then, add the library to your project build.gradle dependencies { compile 'com.github.chrisbanes:PhotoView:1.2.6' } Sample Usage There is a sample provided which shows how to use the library in a more advanced way, but for completeness here is all that is required to get PhotoView working: ImageView mImageView; PhotoViewAttacher mAttacher; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Any implementation of ImageView can be used! mImageView = (ImageView) findViewById(R.id.iv_photo); // Set the Drawable displayed Drawable bitmap = getResources().getDrawable(R.drawable.wallpaper); mImageView.setImageDrawable(bitmap); // Attach a PhotoViewAttacher, which takes care of all of the zooming functionality. // (not needed unless you are going to change the drawable later) mAttacher = new PhotoViewAttacher(mImageView); } // If you later call mImageView.setImageDrawable/setImageBitmap/setImageResource/etc then you just need to call mAttacher.update(); Issues With ViewGroups There are some ViewGroups (ones that utilize onInterceptTouchEvent) that throw exceptions when a PhotoView is placed within them, most notably ViewPager and DrawerLayout. This is a framework issue that has not been resolved. In order to prevent this exception (which typically occurs when you zoom out), take a look at HackyDrawerLayout and you can see the solution is to simply catch the exception. Any ViewGroup which uses onInterceptTouchEvent will also need to be extended and exceptions caught. Use the HackyDrawerLayout as a template of how to do so. The basic implementation is: public class HackyProblematicViewGroup extends ProblematicViewGroup { public HackyProblematicViewGroup(Context context) { super(context); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { try { return super.onInterceptTouchEvent(ev); } catch (IllegalArgumentException e) { //uncomment if you really want to see these errors //e.printStackTrace(); return false; } } } Usage with Fresco Due to the complex nature of Fresco, this library does not currently support Fresco. See this project as an alternative solution. Subsampling Support This library aims to keep the zooming implementation simple. If you are looking for an implementation that supports subsampling, check out this project Pull Requests / Contribution Development happens in develop branch of this repository, and Pull Requests should be filled against that branch. Any Pull Request against master will be rejected License Copyright 2011, 2012 Chris Banes Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值