Android仿微信发朋友圈浏览图片效果
程序员文章站
2024-02-21 12:28:52
先看一下效果吧:
下面就来说一下具体怎么实现的:
实现思路
1.首先我们要获取数据源,数据源就是我们的每条说说(包括姓名、标题、图片数组)
2.自...
先看一下效果吧:
下面就来说一下具体怎么实现的:
实现思路
- 1.首先我们要获取数据源,数据源就是我们的每条说说(包括姓名、标题、图片数组)
- 2.自定义适配器(listview嵌套着gridview)
- 3.图片点击浏览图片(fragment+viewpager)
具体实现
1.初始化数据源,设置适配器,看一下代码:
public class myactivity extends activity { /*图片显示列表*/ private listview listview; /*图片url数组*/ private list<contentbean> contentbeans; /*说说适配器*/ private myadapter adapter; /** * called when the activity is first created. */ @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); initdata(); initviews(); } /** * 初始化数据 */ private void initdata(){ contentbeans = new arraylist<contentbean>(); arraylist<string> imgurls1 = new arraylist<string>(); imgurls1.add("http://7xojuc.com1.z0.glb.clouddn.com/110h2e40-6.jpg?attname=&e=1448288962&token=kdscquawz3p-yt6in6opnt56eh2cig4zgqd12sj_:altjfyd9sbfodb4jmmzukxamop8"); contentbean cb1 = new contentbean(1,"java","sun microsystems",imgurls1); contentbeans.add(cb1); arraylist<string> imgurls2 = new arraylist<string>(); imgurls2.add("http://7xojuc.com1.z0.glb.clouddn.com/110h2e40-6.jpg?attname=&e=1448288962&token=kdscquawz3p-yt6in6opnt56eh2cig4zgqd12sj_:altjfyd9sbfodb4jmmzukxamop8"); imgurls2.add("http://7xojuc.com1.z0.glb.clouddn.com/110h2e40-6.jpg?attname=&e=1448288962&token=kdscquawz3p-yt6in6opnt56eh2cig4zgqd12sj_:altjfyd9sbfodb4jmmzukxamop8"); imgurls2.add("http://7xojuc.com1.z0.glb.clouddn.com/110h2e40-6.jpg?attname=&e=1448288962&token=kdscquawz3p-yt6in6opnt56eh2cig4zgqd12sj_:altjfyd9sbfodb4jmmzukxamop8"); contentbean cb2 = new contentbean(2,"oc","stepstone",imgurls2); contentbeans.add(cb2); arraylist<string> imgurls3 = new arraylist<string>(); imgurls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110h2e40-6.jpg?attname=&e=1448288962&token=kdscquawz3p-yt6in6opnt56eh2cig4zgqd12sj_:altjfyd9sbfodb4jmmzukxamop8"); imgurls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110h2e40-6.jpg?attname=&e=1448288962&token=kdscquawz3p-yt6in6opnt56eh2cig4zgqd12sj_:altjfyd9sbfodb4jmmzukxamop8"); imgurls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110h2e40-6.jpg?attname=&e=1448288962&token=kdscquawz3p-yt6in6opnt56eh2cig4zgqd12sj_:altjfyd9sbfodb4jmmzukxamop8"); imgurls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110h2e40-6.jpg?attname=&e=1448288962&token=kdscquawz3p-yt6in6opnt56eh2cig4zgqd12sj_:altjfyd9sbfodb4jmmzukxamop8"); imgurls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110h2e40-6.jpg?attname=&e=1448288962&token=kdscquawz3p-yt6in6opnt56eh2cig4zgqd12sj_:altjfyd9sbfodb4jmmzukxamop8"); imgurls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110h2e40-6.jpg?attname=&e=1448288962&token=kdscquawz3p-yt6in6opnt56eh2cig4zgqd12sj_:altjfyd9sbfodb4jmmzukxamop8"); imgurls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110h2e40-6.jpg?attname=&e=1448288962&token=kdscquawz3p-yt6in6opnt56eh2cig4zgqd12sj_:altjfyd9sbfodb4jmmzukxamop8"); imgurls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110h2e40-6.jpg?attname=&e=1448288962&token=kdscquawz3p-yt6in6opnt56eh2cig4zgqd12sj_:altjfyd9sbfodb4jmmzukxamop8"); imgurls3.add("http://7xojuc.com1.z0.glb.clouddn.com/110h2e40-6.jpg?attname=&e=1448288962&token=kdscquawz3p-yt6in6opnt56eh2cig4zgqd12sj_:altjfyd9sbfodb4jmmzukxamop8"); contentbean cb3 = new contentbean(3,"python","guido van rossum",imgurls3); contentbeans.add(cb3); } private void initviews(){ listview = (listview) findviewbyid(r.id.lv_my); adapter = new myadapter(myactivity.this,contentbeans); listview.setadapter(adapter); } }
这里面的图片是我上传到七牛的网络图片,加载图片是用imageloader,下面也有具体的imageloader配置。
2.看一下适配器内容
在说说列表适配器中去设置图片的适配器,图片的gridview是重写了一个不能滑动的gridview,重写一下onmeasure();
public class myadapter extends baseadapter { private context context; private list<contentbean> data; public myadapter(context context, list<contentbean> data) { this.context = context; this.data = data; } @override public int getcount() { return data.size(); } @override public object getitem(int i) { return data.get(i); } @override public long getitemid(int i) { return i; } @override public view getview(int i, view view, viewgroup viewgroup) { viewholder holder; if (view == null) { holder = new viewholder(); view = view.inflate(context, r.layout.item, null); holder.gridview = (noscrollgridview) view.findviewbyid(r.id.gridview); holder.tvname = (textview) view.findviewbyid(r.id.tv_name); holder.tvtitle = (textview) view.findviewbyid(r.id.tv_title); view.settag(holder); } else { holder = (viewholder) view.gettag(); } final contentbean bean = data.get(i); holder.tvname.settext(bean.getname()); holder.tvtitle.settext(bean.gettitle()); if (data != null && data.size() > 0) { holder.gridview.setadapter(new imagegridadapter(context, bean.getimgurls())); } /** * 图片列表点击事件 */ holder.gridview.setonitemclicklistener(new adapterview.onitemclicklistener() { @override public void onitemclick(adapterview<?> adapterview, view view, int i, long l) { intent intent = new intent(context, imagepageractivity.class); intent.putextra(imagepageractivity.extra_image_urls, (serializable) bean.getimgurls()); intent.putextra(imagepageractivity.extra_image_index, i); context.startactivity(intent); } }); return view; } class viewholder { textview tvname, tvtitle; noscrollgridview gridview; } }
3.然后就是图片浏览,这个网上也有好多的demo,也有详细的讲解,直接拽过来用就可以了,下面的图片数量是监听setonpagechangelistener()来改变下面的图片索引值
/** * 图片查看器 */ public class imagepageractivity extends fragmentactivity { private static final string state_position = "state_position"; public static final string extra_image_index = "image_index"; public static final string extra_image_urls = "image_urls"; private hackyviewpager mpager; private int pagerposition; private textview indicator; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.image_detail_pager); pagerposition = getintent().getintextra(extra_image_index, 0); arraylist<string> urls = getintent().getstringarraylistextra(extra_image_urls); mpager = (hackyviewpager) findviewbyid(r.id.pager); imagepageradapter madapter = new imagepageradapter(getsupportfragmentmanager(), urls); mpager.setadapter(madapter); indicator = (textview) findviewbyid(r.id.indicator); charsequence text = getstring(r.string.viewpager_indicator, 1, mpager.getadapter().getcount()); indicator.settext(text); // 更新下标 mpager.setonpagechangelistener(new onpagechangelistener() { @override public void onpagescrollstatechanged(int arg0) { } @override public void onpagescrolled(int arg0, float arg1, int arg2) { } @override public void onpageselected(int arg0) { charsequence text = getstring(r.string.viewpager_indicator, arg0 + 1, mpager.getadapter().getcount()); indicator.settext(text); } }); if (savedinstancestate != null) { pagerposition = savedinstancestate.getint(state_position); } mpager.setcurrentitem(pagerposition); } @override public void onsaveinstancestate(bundle outstate) { outstate.putint(state_position, mpager.getcurrentitem()); } private class imagepageradapter extends fragmentstatepageradapter { public arraylist<string> filelist; public imagepageradapter(fragmentmanager fm, arraylist<string> filelist) { super(fm); this.filelist = filelist; } @override public int getcount() { return filelist == null ? 0 : filelist.size(); } @override public fragment getitem(int position) { string url = filelist.get(position); return imagedetailfragment.newinstance(url); } } }
图片fragment的详细界面,里面有长按点击事件,和图片加载的状态
package com.hankkin.weixinlookimgsdemo.activty; import android.graphics.bitmap; import android.os.bundle; import android.support.v4.app.fragment; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.imageview; import android.widget.progressbar; import android.widget.toast; import com.hankkin.weixinlookimgsdemo.r; import com.nostra13.universalimageloader.core.imageloader; import com.nostra13.universalimageloader.core.assist.failreason; import com.nostra13.universalimageloader.core.listener.simpleimageloadinglistener; import com.others.photoviewattacher; /** * 单张图片显示fragment */ public class imagedetailfragment extends fragment { private string mimageurl; private imageview mimageview; private progressbar progressbar; private photoviewattacher mattacher; public static imagedetailfragment newinstance(string imageurl) { final imagedetailfragment f = new imagedetailfragment(); final bundle args = new bundle(); args.putstring("url", imageurl); f.setarguments(args); return f; } @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); mimageurl = getarguments() != null ? getarguments().getstring("url") : null; } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { final view v = inflater.inflate(r.layout.image_detail_fragment, container, false); mimageview = (imageview) v.findviewbyid(r.id.image); mattacher = new photoviewattacher(mimageview); mattacher.setonphototaplistener(new photoviewattacher.onphototaplistener() { @override public void onphototap(view arg0, float arg1, float arg2) { getactivity().finish(); } }); mattacher.setonlongclicklistener(new view.onlongclicklistener() { @override public boolean onlongclick(view view) { toast.maketext(getactivity().getapplicationcontext(),"保存",toast.length_short).show(); return false; } }); progressbar = (progressbar) v.findviewbyid(r.id.loading); return v; } @override public void onactivitycreated(bundle savedinstancestate) { super.onactivitycreated(savedinstancestate); imageloader.getinstance().displayimage(mimageurl, mimageview, new simpleimageloadinglistener() { @override public void onloadingstarted(string imageuri, view view) { progressbar.setvisibility(view.visible); } @override public void onloadingfailed(string imageuri, view view, failreason failreason) { string message = null; switch (failreason.gettype()) { case io_error: message = "下载错误"; break; case decoding_error: message = "图片无法显示"; break; case network_denied: message = "网络有问题,无法下载"; break; case out_of_memory: message = "图片太大无法显示"; break; case unknown: message = "未知的错误"; break; } toast.maketext(getactivity(), message, toast.length_short).show(); progressbar.setvisibility(view.gone); } @override public void onloadingcomplete(string imageuri, view view, bitmap loadedimage) { progressbar.setvisibility(view.gone); mattacher.update(); } }); } }
忘了imageloader的初始化工作了,给大家加上吧,我写到application里了。
private myapplication context; @override public void oncreate() { super.oncreate(); context = this; initimageloader(context); } /** * 初始化imageloader * by hankkin at:2015-11-22 23:20:29 * @param context */ public static void initimageloader(context context){ displayimageoptions options = new displayimageoptions.builder() .showimageonloading(r.drawable.ic_launcher) .showimageonfail(r.drawable.ic_launcher) .resetviewbeforeloading(false) // default .delaybeforeloading(0) .cacheinmemory(true) // default .cacheondisk(true) // default .considerexifparams(true) // default .imagescaletype(imagescaletype.in_sample_power_of_2) // default .bitmapconfig(bitmap.config.argb_8888) // default .displayer(new simplebitmapdisplayer()) // default .handler(new handler()) // default .build(); file picpath = new file(environment.getexternalstoragedirectory().getpath() + file.separator + "weixinlookimgdemo" + file.separator + "files"); imageloaderconfiguration config = new imageloaderconfiguration.builder(context) .memorycacheextraoptions(480, 800) // default = device screen dimensions .diskcacheextraoptions(480, 800, null) .threadpoolsize(3) // default .threadpriority(thread.norm_priority - 1) // default .tasksprocessingorder(queueprocessingtype.fifo) // default .denycacheimagemultiplesizesinmemory() .memorycache(new lrumemorycache(2 * 1024 * 1024)) .memorycachesize(2 * 1024 * 1024) .memorycachesizepercentage(13) // default .diskcache(new unlimiteddisccache(picpath)) // default .diskcachesize(50 * 1024 * 1024) .diskcachefilecount(1000) .diskcachefilenamegenerator(new hashcodefilenamegenerator()) // default .imagedownloader(new baseimagedownloader(context)) // default .imagedecoder(new baseimagedecoder(true)) // default .defaultdisplayimageoptions(options) // default .writedebuglogs() .build(); // initialize imageloader with configuration. imageloader.getinstance().init(config); }
以上就是关于android仿微信发朋友圈浏览图片效果的全部内容,希望对大家学习android软件编程有所帮助。
上一篇: C#枚举类型与结构类型实例解析
推荐阅读
-
Android仿微信发朋友圈浏览图片效果
-
Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果(推荐)
-
Android GridView仿微信朋友圈显示图片
-
Android仿微信activity滑动关闭效果
-
Android使用Retrofit仿微信多张图片拍照上传
-
Android使用Retrofit2.0技术仿微信发说说
-
Android 高仿微信朋友圈动态支持双击手势放大并滑动查看图片效果
-
[Android] 通过GridView仿微信动态添加本地图片示例代码
-
Android仿微信底部实现Tab选项卡切换效果
-
Android仿微信朋友圈实现滚动条下拉反弹效果