圖片縮放庫--PhotoView的基本使用
阿新 • • 發佈:2019-02-20
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:
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) {
}
});
}
}
執行效果: