Android轮播图点击图片放大效果的实现方法
程序员文章站
2022-07-06 16:50:55
前言
最近项目中需要实现轮播图显示商品图片,当用户点击商品图片的时候,需要图片放大显示,当然用户还能进行多张图片的滑动切换,放大,缩小图片等操作,实现起来相对还是比较简单...
前言
最近项目中需要实现轮播图显示商品图片,当用户点击商品图片的时候,需要图片放大显示,当然用户还能进行多张图片的滑动切换,放大,缩小图片等操作,实现起来相对还是比较简单的,话不多说,咱们是用代码说话的,直接上代码。
实现步骤:
1.效果图的展示
2.项目中添加相关的依赖
3.主界面实现轮播图的效果
4.点击轮播图进入图片放大展示页面
5.图片放大展示页面所需的适配器
6.获取fragment需要展示图片的url
7.图片缩放时遇到bug解决
实现过程:
1.效果图的展示
2.项目中添加相关的依赖
implementation 'com.youth.banner:banner:1.4.9' implementation 'com.github.bumptech.glide:glide:4.5.0' implementation 'com.commit451:photoview:1.2.4'
3.主界面实现轮播图的效果
public class mainactivity extends appcompatactivity implements onbannerlistener { private banner banner; private arraylist<string> list_path; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); initview(); initdata(); initlistener(); } private void initview() { banner = findviewbyid(r.id.banner); } private void initdata() { setbanner();//设置轮播图 } private void initlistener() { } /** * 设置轮播图 */ private void setbanner() { //放图片地址的集合 list_path = new arraylist<>(); //设置图片数据 list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/2a919def19fc47e3aa0d75d8c227ab1b.jpg"); list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/d027d1efc0564c44bb979ba0bd21f560.jpg"); list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/bbb930d66e5a48baa8d3c143544d7631.jpg"); list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/fb1721b8c9be4da9949fcdd26fc902a2.jpg"); list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/08b58dde9b284638b44e2d03c4cb9acf.jpg"); list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/d3caeb6129ee43df87f5c1e1058d96fc.jpg"); list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/9fd01c4add07473db31ba850f20a7232.jpg"); list_path.add("http://a.hiphotos.baidu.com/image/pic/item/00e93901213fb80e3b0a611d3fd12f2eb8389424.jpg"); //设置内置样式,共有六种可以点入方法内逐一体验使用。 banner.setbannerstyle(bannerconfig.num_indicator); //设置图片加载器,图片加载器在下方 banner.setimageloader(new imgloader()); //设置图片网址或地址的集合 banner.setimages(list_path); //设置轮播的动画效果,内含多种特效,可点入方法内查找后内逐一体验 banner.setbanneranimation(transformer.default); //设置轮播间隔时间 banner.setdelaytime(3000); //设置是否为自动轮播,默认是“是” banner.isautoplay(true); //设置指示器的位置,小点点,左中右。 banner.setindicatorgravity(bannerconfig.center) //以上内容都可写成链式布局,这是轮播图的监听。比较重要。方法在下面。 .setonbannerlistener(this) //必须最后调用的方法,启动轮播图。 .start(); } //轮播图的监听方法 @override public void onbannerclick(int position) { intent intent = new intent(this, bigimgactivity.class); intent.putstringarraylistextra("imgdata", list_path); intent.putextra("clickposition", position); startactivity(intent); } //自定义的图片加载器 private class imgloader extends imageloader { @override public void displayimage(context context, object path, imageview imageview) { glide.with(context).load((string) path).into(imageview); } } }
4.点击轮播图进入图片放大展示页面
public class bigimgactivity extends appcompatactivity { private viewpagerfixed viewpager; private textview tvnum; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_big_img); initview(); } private void initview() { viewpager = findviewbyid(r.id.viewpager); tvnum = findviewbyid(r.id.tv_num); //接收图片数据及位置 final arraylist<string> imgdata = getintent().getstringarraylistextra("imgdata"); int clickposition = getintent().getintextra("clickposition", 0); //添加适配器 photopageradapter viewpageradapter = new photopageradapter(getsupportfragmentmanager(), imgdata); viewpager.setadapter(viewpageradapter); viewpager.setcurrentitem(clickposition);//设置选中图片位置 viewpager.addonpagechangelistener(new viewpager.onpagechangelistener() { @override public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) { tvnum.settext(string.valueof(position + 1) + "/" + imgdata.size()); } @override public void onpageselected(int position) { } @override public void onpagescrollstatechanged(int state) { } }); } }
5.图片放大展示页面所需的适配器
/** * 滑动图片viewpager适配器 */ public class photopageradapter extends fragmentpageradapter { private final arraylist<string> urllist; public photopageradapter(fragmentmanager fm, arraylist<string> urllist) { super(fm); this.urllist=urllist; } @override public fragment getitem(int position) { return photofragment.newinstance(urllist.get(position)); } @override public int getcount() { return urllist.size(); } }
6.获取fragment需要展示图片的url
public class photofragment extends fragment { private string url; private photoview mphotoview; /** * 获取这个fragment需要展示图片的url * * @param url * @return */ public static photofragment newinstance(string url) { photofragment fragment = new photofragment(); bundle args = new bundle(); args.putstring("url", url); fragment.setarguments(args); return fragment; } @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); url = getarguments().getstring("url"); } @nullable @override public view oncreateview(layoutinflater inflater, final viewgroup container, bundle savedinstancestate) { view view = inflater.inflate(r.layout.fragment_img, container, false); mphotoview = view.findviewbyid(r.id.photoview); //设置缩放类型,默认scaletype.center(可以不设置) // mphotoview.setscaletype(imageview.scaletype.center); //长按事件 mphotoview.setonlongclicklistener(new view.onlongclicklistener() { @override public boolean onlongclick(view view) { //toast.maketext(getactivity(), "长按事件", toast.length_short).show(); return true; } }); //点击事件 mphotoview.setonphototaplistener(new photoviewattacher.onphototaplistener() { @override public void onphototap(view view, float x, float y) { //toast.maketext(getactivity(), "点击事件,真实项目中可关闭activity", toast.length_short).show(); getactivity().finish(); } }); glide.with(getcontext()) .load(url) // .placeholder(r.mipmap.ic_launcher)//加载过程中图片未显示时显示的本地图片 // .error(r.mipmap.ic_launcher)//加载异常时显示的图片 //.centercrop()//图片图填充imageview设置的大小 // .fitcenter()//缩放图像测量出来等于或小于imageview的边界范围,该图像将会完全显示 .into(mphotoview); return view; } }
7.图片缩放时遇到bug解决
在测试的过程中,对放大的图片进行缩放的时候,遇到下面的bug:
java.lang.illegalargumentexception: pointerindex out of range
在做多点触控放大缩小,操作自己所绘制的图形时发生这个异常,如果是操作图片的放大缩小多点触控不会出现这个错误
这个bug是android系统原因 。
问题解决方案:
自定义viewpager,重写ontouchevent 和onintercepttouchevent
public class viewpagerfixed extends android.support.v4.view.viewpager { public viewpagerfixed(context context) { super(context); } public viewpagerfixed(context context, attributeset attrs) { super(context, attrs); } @override public boolean ontouchevent(motionevent ev) { try { return super.ontouchevent(ev); } catch (illegalargumentexception ex) { ex.printstacktrace(); } return false; } @override public boolean onintercepttouchevent(motionevent ev) { try { return super.onintercepttouchevent(ev); } catch (illegalargumentexception ex) { ex.printstacktrace(); } return false; } }
布局文件:
<?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="#fff"> <com.showly.testimagedemo.view.viewpagerfixed android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" /> <textview android:id="@+id/tv_num" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerhorizontal="true" android:textcolor="#ffffff" android:textsize="30sp" /> </relativelayout>
实现过程就这样完成了。
需要demo源码:点击这里。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
上一篇: 朱仝在梁山好汉中排列第十二名,那么他有着怎样的绰号?
下一篇: Ajax实现搜索功能的分页