国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) 微信小程式 微信開發(fā) Android開發(fā)仿微信發(fā)朋友圈瀏覽圖片效果實(shí)例代碼

Android開發(fā)仿微信發(fā)朋友圈瀏覽圖片效果實(shí)例代碼

Mar 23, 2017 pm 01:30 PM

這篇文章主要介紹了Android仿微信發(fā)朋友圈瀏覽圖片效果的相關(guān)資料,需要的朋友可以參考下

先看一下效果吧:

Android開發(fā)仿微信發(fā)朋友圈瀏覽圖片效果實(shí)例代碼

#下面就來(lái)說(shuō)一下具體怎麼實(shí)現(xiàn)的:

實(shí)作想法

  • #1.首先我們要取得資料來(lái)源,資料來(lái)源就是我們的每個(gè)說(shuō)說(shuō)(包括姓名、標(biāo)題、圖片陣列)

  • #2.自訂適配器(ListView嵌套著GridView)

  • 3.圖片點(diǎn)擊瀏覽圖片(Fragment+ViewPager)

#具體實(shí)作

1.初始化資料來(lái)源,設(shè)定適配器,看一下程式碼:


##

public class MyActivity extends Activity {
  /*圖片顯示列表*/
  private ListView listView;
  /*圖片URL數(shù)組*/
  private List<ContentBean> contentBeans;
  /*說(shuō)說(shuō)適配器*/
  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();
  }

  /**
   * 初始化數(shù)據(jù)
   */
  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);
  }
}

這裡面的圖片是我上傳到七牛的網(wǎng)路圖片,載入圖片是用ImageLoader,下面也有具體的ImageLoader配置。


2.看一下適配器內(nèi)容
在說(shuō)說(shuō)列表適配器中去設(shè)定圖片的適配器,圖片的GridView是重寫了一個(gè)不能滑動(dòng)的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()));
    }
    /**
     * 圖片列表點(diǎn)擊事件
     */
    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.然後就是圖片瀏覽,這個(gè)網(wǎng)上也有好多的Demo,也有詳細(xì)的講解,直接拽過(guò)來(lái)用就可以了,下面的圖片數(shù)量是監(jiān)聽setOnPageChangeListener ()來(lái)改變下面的圖片索引值


/**
 * 圖片查看器
 */
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);
    // 更新下標(biāo)
    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);
    }

  }
}

圖片F(xiàn)ragment的詳細(xì)介面,裡面有長(zhǎng)按點(diǎn)擊事件,和圖片載入的狀態(tài)


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 = "下載錯(cuò)誤";
          break;
        case DECODING_ERROR:
          message = "圖片無(wú)法顯示";
          break;
        case NETWORK_DENIED:
          message = "網(wǎng)絡(luò)有問(wèn)題,無(wú)法下載";
          break;
        case OUT_OF_MEMORY:
          message = "圖片太大無(wú)法顯示";
          break;
        case UNKNOWN:
          message = "未知的錯(cuò)誤";
          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);
  }

以上就是關(guān)於Android仿微信發(fā)朋友圈瀏覽圖片效果的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)Android軟體程式設(shè)計(jì)有所幫助。

以上是Android開發(fā)仿微信發(fā)朋友圈瀏覽圖片效果實(shí)例代碼的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276