显示大图Activity(支持手势放大)
xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"> <android.support.v4.view.ViewPager
android:id="@+id/picViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </RelativeLayout>
java类:
public class ActShowBigPicture extends BaseActivity implements ZoomImageView.onImageTouchedListener {
/** 图片url集合 intent key */
public static final String INTENT_PICURLS = "picUrls";
/** 显示下标 intent key */
public static final String INTENT_SHOW_POS = "showPos";
private List<String> picUrls; // 图片URL集合
private int showPos; // 显示下标
private int oldPosition = 0;
private ViewPager picViewPager;
private List<View> zoomImageViewContainers;
private List<ZoomImageView> zoomImageViews;
private DisplayImageOptions mPicOptions;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_show_big_picture);
mBar.setVisibility(View.GONE);
dismissLoadingView();
// 获取传递过来的Intent对象
Intent intent = getIntent();
picUrls = intent.getStringArrayListExtra(INTENT_PICURLS);
showPos = intent.getIntExtra(INTENT_SHOW_POS, 0);
if (null == picUrls || picUrls.size() <= 0) {
finish();
return ;
}
mPicOptions = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.def_banner_img)
.showImageOnFail(R.drawable.def_banner_img)
.showImageForEmptyUri(R.drawable.def_banner_img)
.cacheOnDisk(true)
.cacheInMemory(false)
.displayer(new FadeInBitmapDisplayer(200, true, true, false)) // 显示动画
.build();
// 初始化View
picViewPager = (ViewPager)findViewById(R.id.picViewPager);
// 设置事件
// findViewById(R.id.layout_back).setOnClickListener(this);
zoomImageViews = new ArrayList<>();
zoomImageViewContainers = new ArrayList<>();
for (int i=0; i<picUrls.size(); i++) {
View zoomImageViewContainer = getLayoutInflater().inflate(R.layout.item_big_picture, null);
ZoomImageView zommImageView = (ZoomImageView)zoomImageViewContainer.findViewById(R.id.zommImageView);
zommImageView.setOnImageTouchedListener(this);
zommImageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
ZoomImageView curZoomImageView = (ZoomImageView)v;
Bitmap tempImageBitmap = curZoomImageView.getImageBitmap();
if (null == tempImageBitmap) {
return false;
}
int curW = tempImageBitmap.getWidth();
int curH = tempImageBitmap.getWidth();
Matrix m = curZoomImageView.getImageViewMatrix();
RectF rect = new RectF(0, 0, curW, curH);
m.mapRect(rect);
// 图片超出屏幕范围后移动
// Log.i("wg", "rect.right= " + rect.right + " _ rect.left = " + rect.left);
if (!(rect.right > curZoomImageView.getWidth() + 0.1 && rect.left < -0.1)) {
picViewPager.requestDisallowInterceptTouchEvent(false);
} else {
picViewPager.requestDisallowInterceptTouchEvent(true);
}
return false;
}
});
zoomImageViewContainers.add(zoomImageViewContainer);
zoomImageViews.add(zommImageView);
}
// 设置图片间的间距
// final float scale = getResources().getDisplayMetrics().density;
// int pagerMarginPixels = (int) (PAGER_MARGIN_DP * scale + 0.5f);
// picViewPager.setPageMargin(pagerMarginPixels);
// picViewPager.setPageMarginDrawable(new ColorDrawable(Color.BLACK));
// 设置适配器
picViewPager.setAdapter(new PagerAdapter() {
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager)arg0).removeView(zoomImageViewContainers.get(arg1));
}
@Override
public int getCount() {
return zoomImageViewContainers.size();
}
@Override
public Object instantiateItem(View arg0, int arg1) {
View v = zoomImageViewContainers.get(arg1);
((ViewPager) arg0).addView(v, 0);
return v;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == (arg1);
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
});
picViewPager.setOnPageChangeListener(new SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// 恢复原图最小化
ZoomImageView oldImageViewTouch = zoomImageViews.get(oldPosition);
if (null != oldImageViewTouch && null != oldImageViewTouch.getImageBitmap() && !oldImageViewTouch.getImageBitmap().isRecycled()) {
oldImageViewTouch.zoomTo(oldImageViewTouch.zoomDefault());
}
ZoomImageView curImageViewTouch = zoomImageViews.get(position);
Bitmap curImageBitmap = curImageViewTouch.getImageBitmap();
// 当图片Bitmap为空或者已经被回收的时候才去加载
if (null == curImageBitmap || curImageBitmap.isRecycled()) {
loadImageViewBitmap(picUrls.get(position), curImageViewTouch, null);
}
oldPosition = position;
}
});
picViewPager.setCurrentItem(showPos, false);
if (showPos == 0) {
// 显示第一张图片
// 显示Loading
ImageLoader.getInstance().displayImage(picUrls.get(0), zoomImageViews.get(0), mPicOptions, new SimpleImageLoadingListener(){
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view, loadedImage);
// ((FrameLayout)zoomImageViews.get(0).getParent()).findViewById(R.id.pagerLoad).setVisibility(View.GONE);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
super.onLoadingFailed(imageUri, view, failReason);
// 隐藏Loading
// ((FrameLayout)zoomImageViews.get(0).getParent()).findViewById(R.id.pagerLoad).setVisibility(View.GONE);
// 显示loading错误View
// ((FrameLayout)zoomImageViews.get(0).getParent()).findViewById(R.id.loaddataErrRL).setVisibility(View.VISIBLE);
}
});
}
}
private void loadImageViewBitmap(final String picUrl, final ImageView iv, final View parentView) {
if (null != parentView) {
// 显示Loading
// parentView.findViewById(R.id.pagerLoad).setVisibility(View.VISIBLE);
}
ImageLoader.getInstance().displayImage(picUrl, iv, mPicOptions, new SimpleImageLoadingListener() {
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
super.onLoadingFailed(imageUri, view, failReason);
// 获取父View
// final FrameLayout parentView = (FrameLayout)iv.getParent();
// 隐藏Loading
// parentView.findViewById(R.id.pagerLoad).setVisibility(View.GONE);
// 显示loading错误View
// parentView.findViewById(R.id.loaddataErrRL).setVisibility(View.VISIBLE);
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
super.onLoadingComplete(imageUri, view, loadedImage);
// 获取父View
// final FrameLayout parentView = (FrameLayout)iv.getParent();
if (null == loadedImage) {
// 显示loading错误View
// parentView.findViewById(R.id.loaddataErrRL).setVisibility(View.VISIBLE);
}
// 隐藏Loading
// parentView.findViewById(R.id.pagerLoad).setVisibility(View.GONE);
}
});
}
@Override
public void onImageTouched() {
finish();
}
public static void showPic(Context context, String path) {
if (TextUtils.isEmpty(path)) return ;
ArrayList<String> picurls = new ArrayList<>();
picurls.add(path);
showPic(context, picurls);
}
public static void showPic(Context context, ArrayList<String> picurls) {
showPic(context, picurls, 0);
}
public static void showPic(Context context, ArrayList<String> picurls, int postion) {
if (null == picurls || picurls.size() == 0) return ;
Intent intent = new Intent(context, ActShowBigPicture.class);
intent.putStringArrayListExtra(ActShowBigPicture.INTENT_PICURLS, picurls);
if (postion != 0) {
intent.putExtra(INTENT_SHOW_POS, postion);
}
context.startActivity(intent);
}
@Override
protected boolean isNotSwipe() {
return true;
}
}
ZoomImageView类参考前一篇随笔
显示大图Activity(支持手势放大)的更多相关文章
- 手把手教你打造ImageView支持手势放大缩小
写在前面 最近有了新的任务,学习的时间比以前少了不少,Java回炉的文估计是得缓缓了,不过每周一篇尽量保质保量.最近感觉我文写的有点不好,因为我写东西除非必要,不然概念性的东西我基本上都是一笔带过…… ...
- Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。
转载请注明出处:http://blog.csdn.net/sk719887916/article/details/40348873 作者skay: 最近参与了开发一款旅行APP,其中包含实时聊天和动态 ...
- 【读书笔记《Bootstrap 实战》】3.优化站点资源、完成响应式图片、让传送带支持手势
A.优化站点资源 速度很重要.用户很关心.我们的站点必须加载够快,否则用户就会走人.SEO 也很重要.我们的站点必须加载够快,否者搜索排名就会下降. 明白了这样,我们就来清点一下 [Bootstrap ...
- 【Bootstrap】3.优化站点资源、完成响应式图片、让传送带支持手势
A.优化站点资源 速度很重要.用户很关心.我们的站点必须加载够快,否则用户就会走人.SEO 也很重要.我们的站点必须加载够快,否者搜索排名就会下降. 明白了这样,我们就来清点一下 [Bootstrap ...
- swiper默认显示三个,中间放大且显示全部图片两边显示部分图片的实现方法
本页面内容最后的红色部分有惊喜哦! 最近在做一个活动页面,要求触摸切换图片时,默认在可视区域中显示三张图片,其中中间的一张图片比其他两张都大且全部显示,而其他两张图片只显示部分即可,于是就想到了swi ...
- WPF图片浏览器(显示大图、小图等)
原文:WPF图片浏览器(显示大图.小图等) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wangshubo1989/article/details ...
- XML文件解析并利用SimpleAdapter将解析结果显示在Activity中
首先创建一个实体类 Mp3Info用来存储解析的XML文件中的内容: public class Mp3Info implements Serializable{ private static fina ...
- jQuery鼠标经过显示大图
效果:http://keleyi.com/keleyi/phtml/image/8.htm 以下是完整代码: <!DOCTYPE html> <html lang="en& ...
- DIV横排/竖排滚动(white-space/::-webkit-scrollbar的使用技巧以及display: inline-block的选择)支持手势
参考微信的京东客户端http://wqs.jd.com/,实现DIV的横排滚动,且支持手势,并且不会出现滚动跳,效果如下: 但是观察其div结构是没有使用任何JS去实现. 一.实现上DIV的横排 观察 ...
随机推荐
- bzoj 5092 分割序列 —— 高维前缀和
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5092 首先,处理出异或前缀和 s[i],i 位置的答案就是 s[j] + s[j]^s[i] ...
- 如何用vs2013开发人员命令提示工具执行一个方法(一个简单的demo)
在任何一个编辑器中编写一个静态的Main方法,必须是静态且名为Main的方法,并将Main方法所在的类文件命名为yang.cs(这个名字随便命名),如图-1. 图-1 打开你的vs2013开发人员命令 ...
- python_re函数
1,贪婪和非贪婪模式 重复运算符默认是贪婪的,即会进行尽可能多的匹配 代码示例: >>> import re >>> emphasis_pattern = re.c ...
- Linux 执行定时任务 shell脚本
Linux上面执行定时任务,我们可以利用crontab -e直接编辑定时任务 另外我们还可以写好shell脚本,定时去执行shell脚本,这两个方法都可以起到定时执行的作用 下面我详细说一下入如何执行 ...
- HDOJ-2034
人见人爱A-B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- 1.4-1.5 HBase部署及基本使用
一.部署 1.准备 ##先用Apache hadoop ##之前的cdh 服务器先全部停掉 ##解压HBASE [root@hadoop-senior hbase]# tar zxf hbase-0. ...
- UVaLive 6853 Concert Tour (DP)
题意:给定 n 个城市,m 个月,表示要在这 n 个城市连续 m 个月开演唱会,然后给定每个月在每个城市开演唱会能获得的利润,然后就是演唱会在不同城市之间调动所要的费用, 问你,怎么安排这 n 个演唱 ...
- CCF 201512-3 画图 (DFS搜索+模拟)
问题描述 用 ASCII 字符来画图是一件有趣的事情,并形成了一门被称为 ASCII Art 的艺术.例如,下图是用 ASCII 字符画出来的 CSPRO 字样. ..____.____..____. ...
- C#backgroundWorker用法
1.在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应.解决的方法就是新开一个线程,把耗时的操作放到线程中执行,这样就可以在用户界面上进行其它操作. ...
- C# web 总结
(1)Cshtml 中 “@” 符号转义 在 cshtml 中需要使用 “@” 符号,如 “@幸福摩天轮版权所有”.那么我们需要使用转义,使用 “@@” 就好!“© ”和 “@” 好像呀. <t ...