摘要:在此也回顧一下,做個分享今天的內容是關于大圖瀏覽的實現,可能各種實現方法都很多,但我這里要說的是基于來實現。傳送門大圖瀏覽添加依賴既然是基于在實現之前自然要導入的相關依賴包。對于大圖瀏覽需要支持縮放拖拽雙擊放大。
上個星期是個忙碌的一周,全周都在趕進度,可能是過年過的太舒暢了吧?,F在終于有空來坐下來,安安靜靜的思考下這忙碌后的收獲。在此也回顧一下,做個分享!
今天的內容是關于大圖瀏覽的實現,可能各種實現方法都很多,但我這里要說的是基于Fresco來實現。(其實主要是項目中用的就是Fresco)
Fresco可能還有人不了解Fresco,這里我來簡單的介紹一下。
Fresco是facebook推出的開源項目,該項目主要用來解決Android圖片加載的,它是一個強大的圖片加載組件,使用它之后,你不需要再去關心圖片的加載和顯示的繁瑣事件。對于專注于圖片App強烈推薦使用它。
Feature下面是它的一些突出特性
Fresco中的Image Pipeline負責從網絡、本地文件系統、本地資源加載圖片,最大的節省空間與CPU時間,同時含有3級緩存(2級內存,1級磁盤),支持縮略圖與清晰度的轉換等
Fresco的Drawees,負責圖片加載完成前的占位圖與圖片不可見時的釋放,同時還支持圓形圖片的實現
Fresco支持漸進式圖片展示,Android本身是不支持的。
Fresco完美支持Gif與WebP動圖,輕松解決每一幀都是很大的Bitmap煩惱。
傳送門: Fresco
大圖瀏覽 添加依賴既然是基于Fresco,在實現之前自然要導入Fresco的相關依賴包。
compile "com.facebook.fresco:fresco:1.0.0" compile "com.facebook.fresco:animated-gif:1.0.0" compile "com.facebook.fresco:animated-webp:1.0.0" compile "com.facebook.fresco:webpsupport:1.0.0"
如果只要實現普通圖片的加載,那么只要導入第一個就可以了。好了現在你就可牛逼哄哄的使用這么高大上的組件來加載圖片,至于使用步驟,隨便看下相關教程就能輕松搞定,例如前面所說的圓形圖片。想當初我還是苦逼是找相關的庫來實現的...
SimpleDraweeView上面只是針對于普通的圖片展示,但不是今天的主題。下面是一段基本的使用代碼
private void displayImage(SimpleDraweeView draweeView, String url) { GenericDraweeHierarchy hierarchy = draweeView.getHierarchy(); //設置占位圖 if (hierarchy == null) { hierarchy = GenericDraweeHierarchyBuilder.newInstance(getResources()) .setPlaceholderImage(getResources().getDrawable(R.mipmap.ic_launcher) , ScalingUtils.ScaleType.CENTER).build(); draweeView.setHierarchy(hierarchy); } else { hierarchy.setPlaceholderImage(getResources().getDrawable(R.mipmap.ic_launcher) , ScalingUtils.ScaleType.CENTER); } //構建ImageRequestBuilder,傳入請求Uri ImageRequestBuilder requestBuilder = ImageRequestBuilder.newBuilderWithSource(Uri.parse(url)); //構建Controller DraweeController controller = Fresco.newDraweeControllerBuilder() .setOldController(draweeView.getController()) .setImageRequest(requestBuilder.build()) .build(); //設置圖片,Fresco設置顯示圖片都是通過Controller來實現 draweeView.setController(controller); }
相信上面的注釋已經非常明顯了ZoomableView
我們都知道現在只要是個App且里面有圖片的展示,那么基本上就有圖片瀏覽這一個功能。對于大圖瀏覽需要支持縮放、拖拽、雙擊放大。Fresco原生的SimpleDraweeView是不支持這些功能的,所以我們這里要使用另外一個控件ZoomableView。當然它也是Fresco官方提供的,我們現在要做的就是接入到我們的項目中。前面的傳送門中可以找到ZoomableView。但畢竟是Fresco項目的集合體,本片文章的末尾我會提供我已經提取好的相關代碼。
實現我們創建一個界面ZoomableActivity,至于布局大圖瀏覽自然少不了ViewPager,這里就不多介紹ViewPager了,直接上ZoomableActivity代碼
public class ZoomableActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener { private static final String EXTRA_ZOOMABLE_PATHS = "extra_zoomable_paths"; private static final String EXTRA_ZOOMABLE_INDEX = "extra_zoomable_index"; private ViewPager mViewPager; private TextView mZoomableIndex; private ArrayListmPaths; private int mIndex; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.zoommable_activity); getExtraData(); initView(); setupViewPager(); } private void getExtraData() { mPaths = getIntent().getStringArrayListExtra(EXTRA_ZOOMABLE_PATHS); mIndex = getIntent().getIntExtra(EXTRA_ZOOMABLE_INDEX, 0); } private void initView() { mViewPager = (ViewPager) findViewById(R.id.view_pager); mZoomableIndex = (TextView) findViewById(R.id.zoomable_index); } private void setupViewPager() { mViewPager.setAdapter(new ZoomableViewPagerAdapter(this, mPaths)); mViewPager.setCurrentItem(mIndex); mZoomableIndex.setText(mIndex + 1 + "/" + mPaths.size()); mViewPager.addOnPageChangeListener(this); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mZoomableIndex.setText(position + 1 + "/" + mPaths.size()); } @Override public void onPageScrollStateChanged(int state) { } public static void goToPage(Context context, ArrayList paths, int index) { Intent intent = new Intent(context, ZoomableActivity.class); intent.putStringArrayListExtra(EXTRA_ZOOMABLE_PATHS, paths); intent.putExtra(EXTRA_ZOOMABLE_INDEX, index); context.startActivity(intent); } }
下面就是Adapter了,主要就是圖片的顯示,因為我這里直接是ViewPager所以使用PagerAdapter,核心代碼就是它的instantiateItem方法。
@Override public Object instantiateItem(ViewGroup container, int position) { View view = LayoutInflater.from(mContext).inflate(R.layout.zoomable_view_pager_item, null); ZoomableDraweeView zoomableDraweeView = (ZoomableDraweeView) view.findViewById(R.id.zoomable_image); //允許縮放時切換 zoomableDraweeView.setAllowTouchInterceptionWhileZoomed(true); //長按 zoomableDraweeView.setIsLongpressEnabled(false); //雙擊擊放大或縮小 zoomableDraweeView.setTapListener(new DoubleTapGestureListener(zoomableDraweeView)); DraweeController draweeController = Fresco.newDraweeControllerBuilder() .setUri(mPaths.get(position)) .build(); //加載圖片 zoomableDraweeView.setController(draweeController); container.addView(view); view.requestLayout(); return view; }
這樣就實現了大圖瀏覽的效果,是不是很簡單了,我們借助ZoomableView后,只要實現交互的展示邏輯就Ok了效果圖
項目傳送門:https://github.com/idisfkj/Zo...
個人blog:https://idisfkj.github.io/arc...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/66771.html
摘要:中設計有一個叫做模塊,它會在圖片加載完成前顯示占位圖,加載成功后自動替換為目標圖片。當圖片不再顯示在屏幕上時,它會及時地釋放內存和空間占用。大的內存占用勢必引發更加頻繁的。 Fresco圖片框架簡介及使用 Fresco是FaceBook退出了一個Android開源圖片管理框架,它提供了圖片下載、漸進式加載、內存管理等功能,很大程度上把程序員從繁瑣的圖片管理工作中解放了出來,官網地址,F...
閱讀 3540·2023-04-25 20:09
閱讀 3743·2022-06-28 19:00
閱讀 3064·2022-06-28 19:00
閱讀 3087·2022-06-28 19:00
閱讀 3178·2022-06-28 19:00
閱讀 2883·2022-06-28 19:00
閱讀 3051·2022-06-28 19:00
閱讀 2641·2022-06-28 19:00