当前位置: 移动技术网 > IT编程>移动开发>Android > Android轮播图点击图片放大效果的实现方法

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

2019年09月09日  | 移动技术网IT编程  | 我要评论

鹩哥说话教材,6564,星海镖师64

前言

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

实现步骤:

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源码:。

总结

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网