热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PhotoView+Glide+Dialog+ViewPager:打造轻量级的图片浏览方案

前言在接手老代码后发现的问题,近日在项目中发现用的图片浏览框架搭的是FragmentActivity+fragment+viewpager+photoview框架,运用fragme

前言

在接手老代码后发现的问题,近日在项目中发现用的图片浏览框架搭的是FragmentActivity+fragment+viewpager+photoview框架,运用fragment来仅仅装载一张图片(photoview同样也是继承imageview的)未免显得太过笨重

其实不单单是做简单的图片浏览、android原生的dialog可以做到activity、fragment的大部分展示功能,而且更轻量化,易于封装与维护。

本文旨在替换fragment浏览图片的笨重方案,图片控件为了支持手势,还是用github上的PhotoView,在使用中出现什么问题可以看一下参考文档,图片加载控件用的Google开源的Glide,Glide的好处我就不多说了。
附上github地址:* 替换fragment浏览图片方案 *

1.gradle配置

dependencies {
compile 'com.github.chrisbanes.photoview:library:+'
compile 'com.github.bumptech.glide:glide:3.7.0'
}

2.dialog样式

由于我们图片一般是全屏展示,而且用系统原本的style不同版本之间会有更加奇怪的现象(如自带边框与黑色背景的window)所以对话框的style需要自定义一下,大概意思就是全屏+window背景透明
在values/styles下新增如下样式:



3.ShowImagesDialog的创建

毫无疑问的我们继承一下Dialog类并在构造方法里更改style样式并拿到图片url地址list。为了在系统创建dialog时能够全屏展示我们的图片以及其他更多的界面信息(如索引),在系统创建dialog时指定大小为屏幕宽高。

public ShowImagesDialog(@NonNull Context context, List imgUrls) {
super(context, R.style.transparentBgDialog);
···
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.setContentView(mView);
Window window = getWindow();
WindowManager.LayoutParams wl = window.getAttributes();
wl.x = 0;
wl.y = 0;
wl.height = Config.EXACT_SCREEN_HEIGHT;
wl.width = Config.EXACT_SCREEN_WIDTH; //屏幕宽高的属性由DisplayMetrics类获得
wl.gravity = Gravity.CENTER;
window.setAttributes(wl);
}

4.xml布局

布局很简单,就一个图片文字索引跟photoview的父控件viewpager


android:layout_
android:layout_
android:gravity="center_horizontal"
android:orientation="vertical"
android:paddingTop="@dimen/padding_small_5dp">
android:id="@+id/tv_image_index"
android:layout_
android:layout_/>
android:id="@+id/vp_images"
android:layout_
android:layout_
android:layout_weight="1"/>

5.初始化数据

到了这一步,只需要根据图片url集合配置Glide装载到photoview中,并将photoview添加到viewpager中就可以了,对了,为了photoview的正常显示,还必须给其设置布局参数。(viewpager适配器的代码大多都是写死的,照模板copy份就可以了,下面不贴其代码)

private void initData() {
...
for (int i = 0; i final PhotoView photoView = new PhotoView(mContext);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
photoView.setLayoutParams(layoutParams);
photoView.setOnPhotoTapListener(listener); //点击事件
Glide.with(mContext).load(mImgUrls.get(i)).into(new SimpleTarget() {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) {
//photoview重写了设置图片的方法 ,所以不能像普通的imageview去对待
photoView.setImageDrawable(resource);
}
});
mViews.add(photoView);
mTitles.add(i + "");
}
mAdapter = new ShowImagesAdapter(mViews, mTitles);
mViewPager.setAdapter(mAdapter);
...
}

6.展示

展示就按写的构造方法去生成dialog然后show()就可以了。最后附github源码下载:ShowImagesDialogDemo轻量图片浏览方案

《PhotoView+Glide+Dialog+ViewPager:打造轻量级的图片浏览方案》 dialog正常显示photoview

《PhotoView+Glide+Dialog+ViewPager:打造轻量级的图片浏览方案》 同一张图片缩放后的photoview
《PhotoView+Glide+Dialog+ViewPager:打造轻量级的图片浏览方案》 图片


推荐阅读
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • Android 自定义 RecycleView 左滑上下分层示例代码
    为了满足项目需求,需要在多个场景中实现左滑删除功能,并且后续可能在列表项中增加其他功能。虽然网络上有很多左滑删除的示例,但大多数封装不够完善。因此,我们尝试自己封装一个更加灵活和通用的解决方案。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • Android开发技巧:使用IconFont减少应用体积
    本文介绍如何在Android应用中使用IconFont来显示图标,从而有效减少应用的体积。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 【问题】在Android开发中,当为EditText添加TextWatcher并实现onTextChanged方法时,会遇到一个问题:即使只对EditText进行一次修改(例如使用删除键删除一个字符),该方法也会被频繁触发。这不仅影响性能,还可能导致逻辑错误。本文将探讨这一问题的原因,并提供有效的解决方案,包括使用Handler或计时器来限制方法的调用频率,以及通过自定义TextWatcher来优化事件处理,从而提高应用的稳定性和用户体验。 ... [详细]
  • 在Android开发中,当TextView的高度固定且内容超出时,可以通过设置其内置的滚动条属性来实现垂直滚动功能。具体来说,可以通过配置`android:scrollbars="vertical"`来启用垂直滚动,确保用户能够查看完整的内容。此外,为了优化用户体验,建议结合`setMovementMethod(ScrollerMovementMethod.getInstance())`方法,使滚动操作更加流畅和自然。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
author-avatar
情歌怎厸唱狂想曲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有