03.08 使用Fresco實現大圖瀏覽(支持手勢放大、拖拽)

一、Fresco簡介

Fresco是facebook出品的一款圖片加載框架,使用了Fresco之後,不需要再考慮圖片的加載和內存佔用的問題,堪稱圖片加載的神器。Fresco將圖片存儲到一個特殊的區域,避免了OOM。

Fresco:https://github.com/facebook/fresco

二、使用Fresco實現大圖瀏覽

先上效果圖:

使用Fresco實現大圖瀏覽(支持手勢放大、拖拽)

1、需求

  • 點擊圖片出現大圖瀏覽的界面
  • 背景要全黑
  • 沒有狀態欄
  • 支持手勢放大及拖拽
  • 點擊關閉大圖瀏覽

2、功能實現

(1)、引入Fresco和PhotoDraweeView

要實現手勢放大和拖拽,還需要引入PhotoDraweeView

PhotoDraweeView:https://github.com/ongakuer/PhotoDraweeView

在項目中添加依賴

<code>compile 'com.facebook.fresco:fresco:1.2.0'
compile 'me.relex:photodraweeview:1.1.2'/<code>

(2)、初始化Fresco

創建MyApp,繼承自Application,在onCreate()方法中初始化Fresco

<code>public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
}
}/<code>

在清單文件中指定Application類,

<code><application>    android:name=".MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity>
<intent-filter>
<action>
<category>
/<intent-filter>
/<activity>
/<application>/<code>

(3)、添加SimpleDraweeView控件

在主頁面添加SimpleDraweeView控件,設置下載鏈接,然後設置點擊事件,跳轉到圖片瀏覽頁面

添加SimpleDraweeView控件

<code><com.facebook.drawee.view.simpledraweeview>    android:id="@+id/sd_view"
android:clickable="true"
android:layout_centerInParent="true"
android:layout_width="match_parent"
android:layout_height="match_parent"/>/<com.facebook.drawee.view.simpledraweeview>/<code>

設置下載鏈接並設置點擊事件

<code>public class MainActivity extends AppCompatActivity {
private SimpleDraweeView mImageView;
private String IMG_URL = "https://juemuren4449.com/uploads/mouse.jpg";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initView();
initData();
initEvent();
}


private void initView() {
mImageView = (SimpleDraweeView) findViewById(R.id.sd_view);
}

private void initData() {
mImageView.setImageURI(IMG_URL);
}

private void initEvent() {
mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, ImageViewActivity.class);
intent.putExtra("img_url", IMG_URL);
startActivity(intent);
}
});
}
}/<code>

(4)、添加PhotoDraweeView控件

在大圖瀏覽佈局中添加PhotoDraweeView控件

<code><me.relex.photodraweeview.photodraweeview>    android:id="@+id/photoView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>/<me.relex.photodraweeview.photodraweeview>/<code>

將PipelineDraweeController設置給PhotoDraweeView,並設置點擊關閉

<code>public class ImageViewActivity extends Activity {
private PhotoDraweeView mPhotoDraweeView;
private String img_url;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_view);

initView();
initData();
initEvent();
}

private void initView() {
mPhotoDraweeView = (PhotoDraweeView) findViewById(R.id.photoView);

}

private void initData() {
img_url = getIntent().getStringExtra("img_url");
if (!TextUtils.isEmpty(img_url)) {
PipelineDraweeControllerBuilder controller = Fresco.newDraweeControllerBuilder();
controller.setUri(img_url);//設置圖片url
controller.setOldController(mPhotoDraweeView.getController());
controller.setControllerListener(new BaseControllerListener<imageinfo>() {
@Override
public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {
super.onFinalImageSet(id, imageInfo, animatable);
if (imageInfo == null || mPhotoDraweeView == null) {
return;
}
mPhotoDraweeView.update(imageInfo.getWidth(), imageInfo.getHeight());
}
});
mPhotoDraweeView.setController(controller.build());
} else {
Toast.makeText(this, "圖片獲取失敗", Toast.LENGTH_SHORT).show();
}
}

private void initEvent() {
//添加點擊事件
mPhotoDraweeView.setOnPhotoTapListener(new OnPhotoTapListener() {
@Override
public void onPhotoTap(View view, float x, float y) {
finish();
}
});
}
}/<imageinfo>/<code>

(5)、設置大圖瀏覽Activity的主題

在清單文件中設置ImageViewActivity的主題為全屏

<code><activity>    android:name=".ImageViewActivity"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
/<activity>/<code>

至此,我們就使用Fresco實現了大圖瀏覽的功能

注意:如果使用上面的方法,那麼ImageViewActivity要繼承自Activity,當然也可以通過其他方式實現全屏,例如自定義主題樣式。

代碼已上傳至Github:https://github.com/juemuren4449/FrescoBigpicBrowsing


分享到:


相關文章: