这篇文章主要介绍了Android仿微信发朋友圈浏览图片效果的相关资料,需要的朋友可以参考下

先看一下效果吧:

下面就来说一下具体怎么实现的:

实现思路1.首先我们要获取数据源,数据源就是我们的每条说说(包括姓名、标题、图片数组)

2.自定义适配器(ListView嵌套着GridView)

3.图片点击浏览图片(Fragment+ViewPager)

具体实现

1.初始化数据源,设置适配器,看一下代码:

public class MyActivity extends Activity {

/*图片显示列表*/

private ListView listView;

/*图片URL数组*/

private List 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();

ArrayList imgUrls1 = new ArrayList();

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 imgUrls2 = new ArrayList();

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 imgUrls3 = new ArrayList();

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 data;

public MyAdapter(Context context, List 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 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 fileList;

public ImagePagerAdapter(FragmentManager fm, ArrayList 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软件编程有所帮助。

php仿微信朋友圈源码,Android开发仿微信发朋友圈浏览图片效果实例代码相关推荐

  1. 仿京细菜谱微信小程序源码 云开发菜谱微信小程序源码

    京细菜谱是一个美食分享网站,提供优质的家常菜谱大全,仿京细菜谱小程序源码为喜欢美食的朋友提供了很多的美食烹饪教程 让您轻松学会做美食.对不同食材和地域的饮食做了不同的分类和详细的做菜方法 分类十分详细 ...

  2. 仿京细菜谱微信小程序源码/云开发菜谱微信小程序源码

    ☑️ 编号:ym405 ☑️ 品牌:无 ☑️ 语言:小程序 ☑️ 大小:1.8MB ☑️ 类型:云开发菜谱 ☑️ 支持:小程序

  3. android 快传 源码_安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端...

    适用范围:安卓APP仿茄子快传源码,Android项目源码类似茄子快传的快传项目包括服务端 演示地址:(以截图为准) 运行环境:Android+PC+web 其他说明: 本项目是一个基于安卓的类似茄子 ...

  4. 2022在线微信对话生成器源码,抖音微信聊天搞笑视频制作神器

    在线微信对话生成器源码,抖音微信聊天搞笑视频制作神器 微信对话生成器,是一款在线微信聊天对话制作的工具,它可以设置苹果或安卓状态栏,包括手机电量.手机时间等,还可以设置不同用户的角色,然后发送文字.语 ...

  5. android 快传 源码_最新安卓仿茄子快传APP源码包括服务端源码Android开发快传类项目源码全套...

    适使用范围:  安卓APP茄子快传源码 Android项目源码相似茄子快传的快传项目包括服务端 运行环境:  Android app 源码详细: 本项目是一个基于安卓的相似茄子快传的项目源码,包括安卓 ...

  6. 2022最新坤坤鸡乐盒微信小程序源码+云开发的

    正文: 云开发坤坤鸡乐盒微信小程序源码是由坤坤铁粉ikun们开发的. 因部分ios用户无法体验共举办,特地开发的小程序版鸡乐盒,听说作者也是5年的铁粉. 现在特别火,我也就不多作介绍了,点击就可以发出 ...

  7. 最新祖传七星彩等梦码微信小程序源码+云开发

    正文: 祖传七星彩等梦码微信小程序源码,安装搭建简单,云开发无后台,这个小程序的内容对于一般的小伙伴来说可能是一脸懵逼. 但是对于海南和广东地区的小伙伴来说应该是不陌生,因为这两个地区的人可能都打七星 ...

  8. 微信小程序反编译wxss文件缺失_如何找回微信小程序源码?2020年微信小程序反编译最新教程 小宇子李...

    前言:在网上看了找回微信小程序源码很多教程,都没法正常使用.微信版本升级后,会遇到各种报错, 以及无法获取到wxss的问题.查阅各种资料,最终解决,于是贴上完整的微信小程序反编译方案与教程. 本文章仅 ...

  9. 微信小程序反编译wxss文件缺失_如何找回微信小程序源码?2019年微信小程序反编译最新教程...

    前言:在网上看了找回微信小程序源码很多教程,都没法正常使用.微信版本升级后,会遇到各种报错, 以及无法获取到wxss的问题.查阅各种资料,最终解决,于是贴上完整的微信小程序反编译方案与教程. 本文章仅 ...

最新文章

  1. 小技巧:帮你批量删除代码前的行号
  2. 时间序列里面最强特征之一
  3. HTTP 307 redirect
  4. 组合数学 —— 组合数取模
  5. commit(), commitNow()和commitAllowingStateLoss()
  6. BTrace入门教程
  7. .NET 环境下进制间的转换
  8. 倾斜补偿的电子罗盘(1):地磁场,磁传感器,倾斜补偿
  9. 如何使用python调用ads接口(版图仿真)
  10. 网络管理员面试时常用的问题及答案
  11. Macbook PS快捷键
  12. iPhone模拟器突然开始运行非常慢
  13. python编写回文程序上海自来水来自海_2019春Python程序设计练习3(0402--0408)
  14. 数字逻辑educoder实训项目 logisim实现 交通灯系统设计超详细实验步骤,绝对完整
  15. 面试必看的注意事项在这里!
  16. 阿里云的这群疯子 (共勉)
  17. fastadmin实现导出Excel和导入Excel数据
  18. 无线数传模块DTU终端
  19. python在家怎么赚钱手工艺_在家手工做什么挣钱,超适合宝妈的6种赚钱方法!...
  20. 如何去掉微软正版的产品验证提醒

热门文章

  1. 在windows操作系统下安装linux
  2. dialog,activity 屏蔽Home键详解
  3. 数据结构题集c语言版第七章答案,数据结构题集(C语言版)答案 - 严蔚敏编著...
  4. 从元宇宙到Web3.0,“新赛道”的职场人该怎么找工作?
  5. 【项目需求说明书文档模板】WEB即时通讯规格说明书
  6. KerasClassifier 中verbose是什么
  7. 阮一峰react入门笔记
  8. 软件项目开发分工贡献占比
  9. 【译文】KKR与CDR53亿美元收购Cloudera影响
  10. 出国旅游带着贴身“随行翻译”很有必要