欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android轮播图点击图片放大效果的实现方法

程序员文章站 2022-07-06 16:50:55
前言 最近项目中需要实现轮播图显示商品图片,当用户点击商品图片的时候,需要图片放大显示,当然用户还能进行多张图片的滑动切换,放大,缩小图片等操作,实现起来相对还是比较简单...

前言

最近项目中需要实现轮播图显示商品图片,当用户点击商品图片的时候,需要图片放大显示,当然用户还能进行多张图片的滑动切换,放大,缩小图片等操作,实现起来相对还是比较简单的,话不多说,咱们是用代码说话的,直接上代码。

实现步骤:

1.效果图的展示

2.项目中添加相关的依赖

3.主界面实现轮播图的效果

4.点击轮播图进入图片放大展示页面

5.图片放大展示页面所需的适配器

6.获取fragment需要展示图片的url

7.图片缩放时遇到bug解决

实现过程:

1.效果图的展示

Android轮播图点击图片放大效果的实现方法

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

Android轮播图点击图片放大效果的实现方法

在做多点触控放大缩小,操作自己所绘制的图形时发生这个异常,如果是操作图片的放大缩小多点触控不会出现这个错误
这个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源码:点击这里

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。