最近一直在高仿微信、高仿微信,今天小编再给大家分享一个仿微信发朋友圈浏览图片的效果....

好了,先看一下效果吧:

这里写图片描述

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

实现思路

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

}

/**

* 初始化数据

* by Hankkin at:2015-11-22 23:21:28

*/

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

}

/**

* 初始化组件

* by Hankkin at:2015-11-22 23:21:44

*/

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()来改变下面的图片索引值

/**

* 图片查看器

* Created by Hankkin on 15/11/22.

*/

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

* Created by Hankkin on 15/11/22.

*/

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)

.***InMemory(true) // default

.***OnDisk(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);

}

这个效果就很容易实现了,揣摩别人的APP很容易,但是我们要试着去实现别人的APP,生命在于折腾,折腾吧,亲们…..

最后小编把源码上传到了Github上,宝贝们,star吧

android 微信高仿,Android 高仿微信发朋友圈浏览图片效果(转)相关推荐

  1. php仿微信朋友圈源码,Android开发仿微信发朋友圈浏览图片效果实例代码

    这篇文章主要介绍了Android仿微信发朋友圈浏览图片效果的相关资料,需要的朋友可以参考下 先看一下效果吧: 下面就来说一下具体怎么实现的: 实现思路1.首先我们要获取数据源,数据源就是我们的每条说说 ...

  2. Android 高仿微信发朋友圈浏览图片效果

    最近一直在高仿微信.高仿微信,今天小编再给大家分享一个仿微信发朋友圈浏览图片的效果.... 好了,先看一下效果吧: 下面就来说一下具体怎么实现的: 实现思路 1.首先我们要获取数据源,数据源就是我们的 ...

  3. 使用GridView实现仿微信发朋友圈添加图片,点击预览、删除图片

    最近在项目中有一个用户反馈的功能中要上传图片,和微信发朋友圈添加图片的功能其实有点类似,所以我想着用GridView来实现这个功能,整个过程也很简单,画不多说,详细步骤见下: 1.先来看MainAct ...

  4. 调用个人微信API协议接口收发消息,发朋友圈

    调用个人微信API协议接口收发消息,发朋友圈 java调用个人微信的API接口收发消息 /** * 接受微信好友发来聊天消息 * @author wechatno:tangjinjinwx * @pa ...

  5. iOS高仿微信发朋友圈,图片拖拽,删除组件

    源码地址:https://github.com/Jethuang/HDragImageView

  6. 微信小助手2.9.0:专为mac微信3.1.2发行!支持发朋友圈!

    WeChatExtension是一款适用于Mac版的WeChat拓展功能插件,中文名为微信小助手,这款插件想必很多人都用过,其功能非常多,包括自动回复.消息防撤回.远程控制.微信多开.登录免认证.会话 ...

  7. python发朋友圈_用 Python 发一个高逼格的朋友圈

    原标题:用 Python 发一个高逼格的朋友圈 源 /痴海文 /痴海 分享一个非常骚气的发朋友圈姿势.效果如下. 利用今天教给大家的 python 脚本,把一张图重新分隔成 9 张.上传到朋友圈,最后 ...

  8. Android 仿微信朋友圈添加图片

    github地址(欢迎下载Demo) https://github.com/zhouxu88/WXCircleAddPic 老习惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧, ...

  9. Android 仿微信朋友圈发表图片拖拽和删除功能

    朋友圈实现原理 我们使用 Android Device Monitor 来分析朋友圈发布图片的界面实现原理.如果需要分析其他应用的界面实现也是采用这种方法哦. 打开 Android Device Mo ...

最新文章

  1. 震精~python运算符还能这么玩~到底这么做到的?神级程序员解密!
  2. hbase基础建表语句
  3. 记asp.net VB与C# 页面参数传值
  4. 计算机网络与综合布线系统设计,【方案】某医院计算机网络综合布线系统设计...
  5. 支持向量回归预测怎么做_财务预测模型怎么做?这些关键指标,你一定要知道...
  6. 如何用JavaScript判断前端应用运行环境(移动平台还是桌面环境)
  7. Android日志拦截器,Retrofit2日志拦截器的使用
  8. android insmod命令,android的启动脚本(init.rc)文件的语法
  9. python多元线性回归代码_Python实现梯度下降算法求多元线性回归(一)
  10. Spring data jpa Specification查询关于日期的范围搜索
  11. JS传值中文乱码解决方案
  12. c# 调用java webservice 参数获取不到_用C#.NET调用Java开发的WebService传递int,double问题,出现java无法获得值!...
  13. 51. Element replaceChild() 方法
  14. java中弱引用和强信用_Java 强引用 软引用与弱引用,虚引用区别
  15. 艾默生Ev3100变频器源码,汇编语言的。电梯变频器
  16. Air722UG_模块硬件设计手册_V1.1
  17. 41家对中国市场依赖度最高(依营收占比计算)的美国公司
  18. 场景分析法设计测试用例
  19. 电子招投标采购系统之电子招标投标的全流程!企业电子招投标系统源码
  20. 云存储的分布式文件系统

热门文章

  1. uniApp使用uni.chooseAddress()获取微信收货地址
  2. [9i] 猪年说猪,属相,本命年,十二生肖用英语该怎么说
  3. [Unity3D]Unity3D官方案例SpaceShooter开发教程
  4. 【电脑配置知识】显卡 GPU
  5. 面试系列之-如何选择外包与自研公司
  6. 中国光学镜头行业营销趋势及盈利前景预测报告(新版)2022-2027年
  7. 解答为什么@Autowired使用在接口上而不是实现类上
  8. Spring项目使用H2内存数据库做单元测试
  9. win10电脑虚拟机关闭 Device/Credential Guard
  10. 美国奶酪(芝士) - cheese