Home  >  Article  >  WeChat Applet  >  Android development example code for imitating WeChat posts to Moments and browsing pictures

Android development example code for imitating WeChat posts to Moments and browsing pictures

高洛峰
高洛峰Original
2017-03-23 13:30:293343browse

This article mainly introduces the relevant information on the effect of Android imitating WeChat for sending pictures to Moments. Friends in need can refer to it

Let’s take a look at the effect first:

Android development example code for imitating WeChat posts to Moments and browsing pictures

Let’s talk about how to implement it:

Implementation ideas

  • 1. First we need to obtain the data source, The data source is each of our comments (including name, title, picture array)

  • 2. Custom adapter (ListView embedded Set with GridView)

  • 3. Click on the picture to browse the picture (Fragment+ViewPager)

Specific implementation

1. Initialize the data source, set up the adapter, and take a look at the code:


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

The pictures here are online pictures that I uploaded to Qiniu. ImageLoader is used to load the pictures. There are also specific ImageLoader configurations below.
2. Take a look at the adapter content
Set the adapter of the picture in the list adapter. The GridView of the picture is a GridView that cannot be slid. Rewrite 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. Then there is picture browsing. There are many demos on this website, as well as detailed explanations. Just drag them over and use them. The number of pictures below is to monitor setOnPageChangeListener () to change the image index value below


/**
 * 图片查看器
 */
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);
    }

  }
}

The detailed interface of the image Fragment, which contains long press click events and image loading status


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

I forgot about the initialization of ImageLoader, so I’ll add it to you. I wrote it in 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);
  }

The above is all about the effect of Android imitating WeChat when sending friends to browse pictures. I hope it will be helpful for everyone to learn Android software programming.

The above is the detailed content of Android development example code for imitating WeChat posts to Moments and browsing pictures. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn