1. 程式人生 > >圖片縮放庫--PhotoView的基本使用

圖片縮放庫--PhotoView的基本使用

PhotoView 的簡介:

  這是一個圖片檢視庫,實現圖片瀏覽功能,支援pinch(捏合)手勢或者點選放大縮小。支援在View Pager中翻頁瀏覽圖片。 
  PhotoView 是一款擴充套件自AndroidImageView,支援通過單點/多點觸控來進行圖片縮放的智慧控制元件。功能實用和強大。

PhotoView 的功能:

· 圖片瀏覽檢視 
· 雙指縮放 
· 單點觸控縮放 
· 圖片縮放模式設定

根據一個PhotoViewDemo來說明一下:

新增PhotoView庫和ImageLoader庫的gradle依賴:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    compile 'com.github.chrisbanes.photoview:library:1.2.4'
    compile 'com.zftlive.android.library:feature-android-imageloader:1.0.0'
}

新增網路許可權:

    <uses-permission android:name="android.permission.INTERNET"/>

建立assets資料夾,新增圖片xin.png:


建立BaseApplication類繼承自Application,用於ImageLoader庫的配置:
package com.example.dpl.photoviewdemo;

import android.app.Application;
import android.graphics.Bitmap;
import android.os.Environment;

import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;

import java.io.File;

/**
 * Created by dpl on 2017/10/5 0005.
 */

public class BaseApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ImageLoaderConfiguration config;
        config = new ImageLoaderConfiguration.Builder(this)// 開始構建 ,圖片載入配置
                .threadPriority(Thread.NORM_PRIORITY - 2)// 設定執行緒優先順序
                .threadPoolSize(3)// 執行緒池內載入的數量 ;減少配置之中執行緒池的大小,(.threadPoolSize).推薦1-5;
                .denyCacheImageMultipleSizesInMemory()// 設定載入的圖片有多樣的
                .tasksProcessingOrder(QueueProcessingType.LIFO)// 圖片載入任務順序
                .memoryCache(new WeakMemoryCache())//使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();
                .memoryCacheExtraOptions(480, 800) // 即儲存的每個快取檔案的最大長寬
                .memoryCacheSizePercentage(60)// 圖片記憶體佔應用的60%;
                .diskCacheFileNameGenerator(new HashCodeFileNameGenerator())//使用HASHCODE對UIL進行加密命名
                .diskCacheFileNameGenerator(new Md5FileNameGenerator())// 將儲存的時候的URI名稱用MD5 加密
                .diskCacheSize(50 * 1024 * 1024) // 快取設定大小為50 Mb
                .diskCache(new UnlimitedDiskCache(new File(Environment.getExternalStorageDirectory() + "myApp/imgCache")))// 自定義快取路徑
                .diskCacheFileCount(100) // 快取的檔案數量
                .denyCacheImageMultipleSizesInMemory()// 自動縮放
                .imageDownloader(new BaseImageDownloader(this, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超時時間
                .memoryCacheExtraOptions(480, 800)//設定快取圖片時候的寬高最大值,預設為螢幕寬高;儲存的每個快取檔案的最大長寬
                .defaultDisplayImageOptions(getDisplayOptions())// 如果需要開啟快取機制,需要自己builde一個option,可以是DisplayImageOptions.createSimple()
                .writeDebugLogs() // Remove for release app
                .build();
        ImageLoader.getInstance().init(config);
    }
    private DisplayImageOptions getDisplayOptions(){
        DisplayImageOptions options= new DisplayImageOptions.Builder()// 開始構建, 顯示的圖片的各種格式
                .resetViewBeforeLoading(true)// 設定圖片在下載前是否重置,復位
                .cacheInMemory(true)// 開啟記憶體快取
                .cacheOnDisk(true) // 開啟硬碟快取
                .displayer(new RoundedBitmapDisplayer(20))// 是否設定為圓角,弧度為多少;避免使用RoundedBitmapDisplayer.他會建立新的ARGB_8888格式的Bitmap物件;
                .displayer(new FadeInBitmapDisplayer(100))// 是否圖片載入好後漸入的動畫時間
                .displayer(new SimpleBitmapDisplayer())// 正常顯示一張圖片 
                .bitmapConfig(Bitmap.Config.RGB_565)// 設定圖片的解碼型別;使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;
                .considerExifParams(true)// 是否考慮JPEG影象EXIF引數(旋轉,翻轉)
                .imageScaleType(ImageScaleType.EXACTLY)// 縮放級別
                .imageScaleType(ImageScaleType.IN_SAMPLE_INT)//這兩種配置縮放都推薦
                .build();// 構建完成(引數可以不用設定全,根據需要來配置)}
        return options;
    }
}


佈局activity_main的設定:
<?xml version="1.0" encoding="utf-8"?>
<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"
    android:orientation="vertical"
    tools:context="com.example.dpl.photoviewdemo.MainActivity">
    <uk.co.senab.photoview.PhotoView
        android:id="@+id/iv_photo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <uk.co.senab.photoview.PhotoView
        android:id="@+id/iv_photo1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

MainActivity類的程式碼如下:
package com.example.dpl.photoviewdemo;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

import java.io.IOException;
import java.io.InputStream;

import uk.co.senab.photoview.PhotoView;
import uk.co.senab.photoview.PhotoViewAttacher;

/*
載入網路圖片和本地圖片
PhotoView進行縮放處理
 */
public class MainActivity extends AppCompatActivity {
    private PhotoView iv_photo,iv_photo1;
    private PhotoViewAttacher attacher;
    private ImageLoader loader;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_photo= (PhotoView) findViewById(R.id.iv_photo);
        iv_photo1= (PhotoView) findViewById(R.id.iv_photo1);
        attacher=new PhotoViewAttacher(iv_photo);//PhotoViewAttacher測量了圖片寬高,進行縮放
        //載入本地圖片,縮放處理
        try {
            InputStream is=getAssets().open("xin.png");
            Bitmap bm= BitmapFactory.decodeStream(is);
            //BitmapFactory.decodeStream()從資源files, streams, and byte-arrays中解碼生成Bitmap物件。
            iv_photo.setImageBitmap(bm);
        } catch (IOException e) {
            e.printStackTrace();
        }


        //載入網路圖片
        loader=ImageLoader.getInstance();
        loader.init(ImageLoaderConfiguration.createDefault(MainActivity.this));//loader初始化
        loader.displayImage("https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=167154" +
                "952,3594779114&fm=200&gp=0.jpg",iv_photo1);//展示圖片
        iv_photo1.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {//圖片監聽
            @Override
            public void onPhotoTap(View view, float x, float y) {

            }
        });
    }
}

執行效果: