首页 微信小程序 微信开发 Android开发仿微信发朋友圈浏览图片效果实例代码

Android开发仿微信发朋友圈浏览图片效果实例代码

Mar 23, 2017 pm 01:30 PM

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

先看一下效果吧:

Android开发仿微信发朋友圈浏览图片效果实例代码

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

实现思路

  • 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软件编程有所帮助。

以上是Android开发仿微信发朋友圈浏览图片效果实例代码的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)