天天看点

Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo

权声明:本文为博主原创文章,请尊重原创,转载请标明地址。

转载请注明出处: http://blog.csdn.net/sk719887916/article/details/40348873 作者skay:      
最近参与了开发一款旅行APP,其中包含实时聊天和动态评论功能,终于耗时几个月几个伙伴完成了,今天就小结一下至于实时聊天功能如果用户不多的情况可以scoket实现,如果用户万级就可以采用开源的smack + opnefile实现,也可以用mina开源+XMMP,至于怎么搭建和实现,估计目前github上一搜一大把,至于即时通讯怕误人子弟,暂且不做介绍,现就把实现的一个微信朋友圈的小功能介绍一下。      
先上效果图:
 
        
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
u      
一拿到主流的UI需求,大致分析下,需要我ListView嵌套Gridview,而gridView的行数也和图片总数有关系,因此通过个数我们可以动态设置条目的宽高,而点击图片放大我们可一跳转到另一界面,图片左右滑动可以用viewpager实现,双击图片放大和手指缩放图片也可以用就监听手势进行不断放大,对于安卓事件不熟悉的朋友可以直接使用一个著名的photoVIew开源项目,支持手势缩放图片和滑动图片实现画廊功能,也很好的解决了内存溢出问题。      
一 配置ImageLoader      
本项目中加载网络图片我就直接使用imageLoader,但建议还是去看下源码,因为开源项目本身自带缓存机制,有很好的缓存技巧,有很多东西值得我们借鉴。其不仅可以加载本地图片(文件path),也支持加载网络图片(url),并且自带防止内存溢出功能。      
[java] 
    view plain
     copy
     print
    ?
    
        
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
  1. public class MyApplication extends Application {  
  2.     @Override  
  3.     public void onCreate() {  
  4.         super.onCreate();  
  5.         DisplayImageOptions defaultOptions = new DisplayImageOptions  
  6.                 .Builder()  
  7.                 .showImageForEmptyUri(R.drawable.empty_photo)   
  8.                 .showImageOnFail(R.drawable.empty_photo)   
  9.                 .cacheInMemory(true)  
  10.                 .cacheOnDisc(true)  
  11.                 .build();  
  12.         ImageLoaderConfiguration config = new ImageLoaderConfiguration  
  13.                 .Builder(getApplicationContext())  
  14.                 .defaultDisplayImageOptions(defaultOptions)  
  15.                 .discCacheSize(50 * 1024 * 1024)//  
  16.                 .discCacheFileCount(100)//缓存一百张图片  
  17.                 .writeDebugLogs()  
  18.                 .build();  
  19.         ImageLoader.getInstance().init(config);  
  20.     }  
  21. }  
二 准备主界面和需要的基础类      
1  Listadapter 

 
  
   
    [java] 
    view plain
     copy
     print
    ?
    
        
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
  1. public class  FridListAdapter extends BaseAdapter{  
  2.     private ArrayList<MyBean> mList;  
  3.     private LayoutInflater mInflater;  
  4.     private Context mContext;  
  5.     public FridListAdapter(Context context,ArrayList<MyBean> list) {  
  6.         mInflater = LayoutInflater.from(context);  
  7.         mContext=context;  
  8.         this.mList=list;  
  9.     }  
  10.     @Override  
  11.     public int getCount() {  
  12.         return mList==null?0:mList.size();  
  13.     }  
  14.     @Override  
  15.     public MyBean getItem(int position) {  
  16.         return mList.get(position);  
  17.     }  
  18.     @Override  
  19.     public long getItemId(int position) {  
  20.         return getItem(position).id;  
  21.     }  
  22.     @Override  
  23.     public View getView(int position, View convertView, ViewGroup parent) {  
  24.         ViewHolder holder;  
  25.         if (convertView == null) {  
  26.             holder = new ViewHolder();  
  27.             convertView = mInflater.inflate(R.layout.list_item, null);  
  28.             holder.avator=(ImageView)convertView.findViewById(R.id.avator);  
  29.             holder.name=(TextView)convertView.findViewById(R.id.name);  
  30.             holder.content = (TextView) convertView.findViewById(R.id.content);  
  31.             holder.gridView=(NoScrollGridView)convertView.findViewById(R.id.gridView);  
  32.             convertView.setTag(holder);  
  33.         } else {  
  34.             holder = (ViewHolder) convertView.getTag();  
  35.         }  
  36.         final MyBean bean = getItem(position);  
  37.         //加载网络图片  
  38.         ImageLoader.getInstance().displayImage(bean.avator, holder.avator);  
  39.         holder.name.setText(bean.name);  
  40.         holder.content.setText(bean.content);  
  41.         if(bean.urls!=null&&bean.urls.length>0){  
  42.             holder.gridView.setVisibility(View.VISIBLE);  
  43.             holder.gridView.setAdapter(new DynamicGridAdapter(bean.urls, mContext));  
  44.             holder.gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
  45.                 @Override  
  46.                 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  47.                     imageBrower(position,bean.urls);  
  48.                 }  
  49.             });  
  50.         }else{  
  51.             holder.gridView.setVisibility(View.GONE);  
  52.         }  
  53.         return convertView;  
  54.     }  
  55.     private void imageBrower(int position, String[] urls) {  
  56.         Intent intent = new Intent(mContext, ImagePagerActivity.class);  
  57.         // 图片url,为了演示这里使用常量,一般从数据库中或网络中获取  
  58.         intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_URLS, urls);  
  59.         intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_INDEX, position);  
  60.         mContext.startActivity(intent);  
  61.     }  
  62.     // 优化listview  
  63.     private static class ViewHolder {  
  64.         public TextView name;  
  65.         public ImageView avator;  
  66.         TextView content;  
  67.         NoScrollGridView gridView;  
  68.     }  
  69. }  
2 主界面
实际项目中数据是数据是从服务器获取的,本次就只将图片从网络获取,
 
  
   
    [java] 
    view plain
     copy
     print
    ?
    
        
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
  1. public class MainActivity extends ListActivity {  
  2.     public static final String TAG = "MainActivity";  
  3.     private FridListAdapter mAdapter;  
  4.     @Override  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.activity_main);  
  8.         new LoderDataTask().execute();  
  9.     }  
  10.     class LoderDataTask extends AsyncTask<Void, Void, MessageModle> {  
  11.         @Override  
  12.         protected MessageModle doInBackground(Void... params) {  
  13.             Gson gson = new Gson();  
  14.             MessageModle msg = gson.fromJson(getData(), MessageModle.class);  
  15.             return msg;  
  16.         }  
  17.         @Override  
  18.         protected void onPostExecute(MessageModle result) {  
  19.             mAdapter = new FridListAdapter(MainActivity.this, result.list);  
  20.             setListAdapter(mAdapter);  
  21.         }  
  22.     }  
  23.     private String getData() {  
  24.         // 模拟网络获取数据  
  25.         String json = "{\"code\":200,\"msg\":\"ok\",list:["  
  26.                 + "{\"id\":110,\"avator\":\"http://img0.bdstatic.com/img/image/shouye/leimu/mingxing.jpg\",\"name\":\"赵薇\",\"content\":\"今天不开心!\",\"urls\":[]},"  
  27.                 + "{\"id\":111,\"avator\":\"http://image.cnwest.com/attachement/jpg/site1/20110507/001372d8a36f0f2f4c953a.jpg\",\"name\":\"李晨\",\"content\":\"我们\","  
  28.                 + "  \"urls\":[\"http://guangdong.sinaimg.cn/2015/0530/U11307P693DT20150530094310.jpg\"]},"  
  29.                 + "{\"id\":114,\"avator\":\"http://img.hexun.com/2009-05-01/117287830.jpg\",\"name\":\"小马哥\",\"content\":\"今天淘宝了吗\",\"urls\":["  
  30.                 + "\"http://g.hiphotos.bdimg.com/album/s%3D680%3Bq%3D90/sign=ccd33b46d53f8794d7ff4b26e2207fc9/0d338744ebf81a4c0f993437d62a6059242da6a1.jpg\","  
  31.                 + "\"http://f.hiphotos.bdimg.com/album/s%3D680%3Bq%3D90/sign=6b62f61bac6eddc422e7b7f309e0c7c0/6159252dd42a2834510deef55ab5c9ea14cebfa1.jpg\","  
  32.                 + "\"http://g.hiphotos.bdimg.com/album/s%3D680%3Bq%3D90/sign=e58fb67bc8ea15ce45eee301863b4bce/a5c27d1ed21b0ef4fd6140a0dcc451da80cb3e47.jpg\","  
  33.                 + "\"http://c.hiphotos.bdimg.com/album/s%3D680%3Bq%3D90/sign=cdab1512d000baa1be2c44b3772bc82f/91529822720e0cf3855c96050b46f21fbf09aaa1.jpg\"]},"  
  34.                 + "{\"id\":112,\"avator\":\"http://img3.yxlady.com/yl/UploadFiles_5361/20150528/20150528050208705.jpg\",\"name\":\"邓超\",\"content\":\"奔跑吧兄弟! 欢迎收看!\",\"urls\":[\"http://upload.cbg.cn/2015/0305/1425518659246.jpg\","  
  35.                 + "\"http://www.people.com.cn/mediafile/pic/20150619/30/4179219540177204330.jpg\"]},"  
  36.                 + "{\"id\":113,\"avator\":\"http://img4.imgtn.bdimg.com/it/u=945108765,1070109457&fm=21&gp=0.jpg\",\"name\":\"奥巴马\",\"content\":\"holle\",\"urls\":[\"http://f.hiphotos.bdimg.com/album/s%3D680%3Bq%3D90/sign=6b62f61bac6eddc422e7b7f309e0c7c0/6159252dd42a2834510deef55ab5c9ea14cebfa1.jpg\",\"http://g.hiphotos.bdimg.com/album/s%3D680%3Bq%3D90/sign=e58fb67bc8ea15ce45eee301863b4bce/a5c27d1ed21b0ef4fd6140a0dcc451da80cb3e47.jpg\",\"http://c.hiphotos.bdimg.com/album/s%3D680%3Bq%3D90/sign=cdab1512d000baa1be2c44b3772bc82f/91529822720e0cf3855c96050b46f21fbf09aaa1.jpg\"]}]}";  
  37.         return json;  
  38.     }  
3 GridView的Adapter
因为Listview的条目中包含Gridview,在这里还需要为它创建atapter      
由于adapter没太多技术含量,因此重点部分列出,在这里我们需要判断下适配的数据眼总数,微信最大数是9张,显示一张的时候,图片比较大,两张的时候稍微减少,四张的时候两列两行和两张的大小一致,其他张数的时候都是三行三列的九宫格。      
[java] 
    view plain
     copy
     print
    ?
    
        
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
  1. @Override  
  2.     public View getView(int position, View convertView, ViewGroup parent) {  
  3.         MyGridViewHolder viewHolder;  
  4.         if (convertView == null) {  
  5.             viewHolder = new MyGridViewHolder();  
  6.             convertView = mLayoutInflater.inflate(R.layout.gridview_item,  
  7.                     parent, false);  
  8.             viewHolder.imageView = (ImageView) convertView  
  9.                     .findViewById(R.id.album_image);  
  10.             convertView.setTag(viewHolder);  
  11.         } else {  
  12.             viewHolder = (MyGridViewHolder) convertView.getTag();  
  13.         }  
  14.         String url = getItem(position);  
  15.         if (getCount() == 1) {  
  16.             viewHolder.imageView.setLayoutParams(new android.widget.AbsListView.LayoutParams(300, 250));  
  17.         }  
  18.         if (getCount() == 2 ||getCount() == 4) {  
  19.             viewHolder.imageView.setLayoutParams(new android.widget.AbsListView.LayoutParams(200, 200));  
  20.         }  
  21.         ImageLoader.getInstance().displayImage(url, viewHolder.imageView);  
  22.         return convertView;  
  23.     }  
 4 新建用于支持九宫格自定义的Gridview
[java] 
    view plain
     copy
     print
    ?
    
        
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
  1. public class NoScrollGridView extends GridView {  
  2.     public NoScrollGridView(Context context) {  
  3.         super(context);  
  4.     }  
  5.     public NoScrollGridView(Context context, AttributeSet attrs) {  
  6.         super(context, attrs);  
  7.     }  
  8.     @Override  
  9.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  10.         int  expandSpec = 0;  
  11.         int  size = getAdapter().getCount();  
  12.         if (size == 1) {  
  13.             setNumColumns(1);  
  14.         }   
  15.         if ( size==2 || size == 4  ) {  
  16.             setNumColumns(2);  
  17.         }  
  18.         else {  
  19.             setNumColumns(3);  
  20.         }  
  21.         expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);  
  22.         super.onMeasure(widthMeasureSpec,expandSpec );  
  23.     }  
  24. }  
三 点击图片后的基础类      
1 建立大图查看器viewpaer      
[java] 
    view plain
     copy
     print
    ?
    
        
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
  1. public class ImagePagerActivity extends FragmentActivity {  
  2.     private static final String STATE_POSITION = "STATE_POSITION";  
  3.     public static final String EXTRA_IMAGE_INDEX = "image_index";  
  4.     public static final String EXTRA_IMAGE_URLS = "image_urls";  
  5.     private HackyViewPager mPager;  
  6.     private int pagerPosition;  
  7.     private TextView indicator;  
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.image_detail_pager);  
  12.         pagerPosition = getIntent().getIntExtra(EXTRA_IMAGE_INDEX, 0);  
  13.         String[] urls = getIntent().getStringArrayExtra(EXTRA_IMAGE_URLS);  
  14.         mPager = (HackyViewPager) findViewById(R.id.pager);  
  15.         ImagePagerAdapter mAdapter = new ImagePagerAdapter(  
  16.                 getSupportFragmentManager(), urls);  
  17.         mPager.setAdapter(mAdapter);  
  18.         indicator = (TextView) findViewById(R.id.indicator);  
  19.         CharSequence text = getString(R.string.viewpager_indicator, 1, mPager  
  20.                 .getAdapter().getCount());  
  21.         indicator.setText(text);  
  22.         // 更新下标  
  23.         mPager.setOnPageChangeListener(new OnPageChangeListener() {  
  24.             @Override  
  25.             public void onPageScrollStateChanged(int arg0) {  
  26.             }  
  27.             @Override  
  28.             public void onPageScrolled(int arg0, float arg1, int arg2) {  
  29.             }  
  30.             @Override  
  31.             public void onPageSelected(int arg0) {  
  32.                 CharSequence text = getString(R.string.viewpager_indicator,  
  33.                         arg0 + 1, mPager.getAdapter().getCount());  
  34.                 indicator.setText(text);  
  35.             }  
  36.         });  
  37.         if (savedInstanceState != null) {  
  38.             pagerPosition = savedInstanceState.getInt(STATE_POSITION);  
  39.         }  
  40.         mPager.setCurrentItem(pagerPosition);  
  41.     }  
  42.     @Override  
  43.     public void onSaveInstanceState(Bundle outState) {  
  44.         outState.putInt(STATE_POSITION, mPager.getCurrentItem());  
  45.     }  
  46.     private class ImagePagerAdapter extends FragmentStatePagerAdapter {  
  47.         public String[] fileList;  
  48.         public ImagePagerAdapter(FragmentManager fm, String[] fileList) {  
  49.             super(fm);  
  50.             this.fileList = fileList;  
  51.         }  
  52.         @Override  
  53.         public int getCount() {  
  54.             return fileList == null ? 0 : fileList.length;  
  55.         }  
  56.         @Override  
  57.         public Fragment getItem(int position) {  
  58.             String url = fileList[position];  
  59.             return ImageDetailFragment.newInstance(url);  
  60.         }  
  61.     }  
2 查看大图界面
转载请注明出处: http://blog.csdn.net/sk719887916/article/details/40348873 作者skay:      
[java] view plain copy print ?
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
  1. public class ImageDetailFragment extends Fragment {  
  2.     private String mImageUrl;  
  3.     private ImageView mImageView;  
  4.     private ProgressBar progressBar;  
  5.     private PhotoViewAttacher mAttacher;  
  6.     public static ImageDetailFragment newInstance(String imageUrl) {  
  7.         final ImageDetailFragment f = new ImageDetailFragment();  
  8.         final Bundle args = new Bundle();  
  9.         args.putString("url", imageUrl);  
  10.         f.setArguments(args);  
  11.         return f;  
  12.     }  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         mImageUrl = getArguments() != null ? getArguments().getString("url") : null;  
  17.     }  
  18.     @Override  
  19.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  20.         final View v = inflater.inflate(R.layout.image_detail_fragment, container, false);  
  21.         mImageView = (ImageView) v.findViewById(R.id.image);  
  22.         mAttacher = new PhotoViewAttacher(mImageView);  
  23.         mAttacher.setOnPhotoTapListener(new OnPhotoTapListener() {  
  24.             @Override  
  25.             public void onPhotoTap(View arg0, float arg1, float arg2) {  
  26.                 getActivity().finish();  
  27.             }  
  28.         });  
  29.         progressBar = (ProgressBar) v.findViewById(R.id.loading);  
  30.         return v;  
  31.     }  
  32.     @Override  
  33.     public void onActivityCreated(Bundle savedInstanceState) {  
  34.         super.onActivityCreated(savedInstanceState);  
  35.         ImageLoader.getInstance().displayImage(mImageUrl, mImageView, new SimpleImageLoadingListener() {  
  36.             @Override  
  37.             public void onLoadingStarted(String imageUri, View view) {  
  38.                 progressBar.setVisibility(View.VISIBLE);  
  39.             }  
  40.             @Override  
  41.             public void onLoadingFailed(String imageUri, View view, FailReason failReason) {  
  42.                 String message = null;  
  43.                 switch (failReason.getType()) {  
  44.                 case IO_ERROR:  
  45.                     message = "下载错误";  
  46.                     break;  
  47.                 case DECODING_ERROR:  
  48.                     message = "图片无法显示";  
  49.                     break;  
  50.                 case NETWORK_DENIED:  
  51.                     message = "网络有问题,无法下载";  
  52.                     break;  
  53.                 case OUT_OF_MEMORY:  
  54.                     message = "图片太大无法显示";  
  55.                     break;  
  56.                 case UNKNOWN:  
  57.                     message = "未知的错误";  
  58.                     break;  
  59.                 }  
  60.                 Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();  
  61.                 progressBar.setVisibility(View.GONE);  
  62.             }  
  63.             @Override  
  64.             public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {  
  65.                 progressBar.setVisibility(View.GONE);  
  66.                 mAttacher.update();  
  67.             }  
  68.         });  
  69.     }  
四  界面的头像圆形      
圆形头像用主流的circleimageview.jar的框架,但是有兴趣的朋友也可以自定义Imagview采用重写onDrawI()画圆形的方式将bitmap画上去,由于此demo整体功能较复杂,因此使用第三方的东西,ListView条目布局如下:      
[html] 
    view plain
     copy
     print
    ?
    
        
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:padding="6dp" >  
  6.     <de.hdodenhof.circleimageview.CircleImageView  
  7.         android:id="@+id/avator"  
  8.         android:layout_width="48dp"  
  9.         android:layout_height="48dp"  
  10.         android:src="@drawable/empty_photo" />  
  11.     <TextView  
  12.         android:id="@+id/name"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:layout_marginLeft="10dp"  
  16.         android:layout_toRightOf="@id/avator"  
  17.         android:textColor="#576B95"  
  18.         android:textSize="16sp"  
  19.         android:text="name" />  
  20.     <TextView  
  21.         android:id="@+id/content"  
  22.         android:layout_width="match_parent"  
  23.         android:layout_height="wrap_content"  
  24.         android:layout_below="@+id/name"  
  25.         android:layout_marginLeft="10dp"  
  26.         android:textSize="12sp"  
  27.         android:layout_toRightOf="@id/avator"  
  28.         android:text="content" />  
  29.     <com.loveplusplus.demo.image.NoScrollGridView  
  30.         android:id="@+id/gridView"  
  31.         android:layout_width="wrap_content"  
  32.         android:layout_height="wrap_content"  
  33.         android:paddingTop="5dp"  
  34.         android:layout_below="@id/content"  
  35.         android:layout_marginLeft="10dp"  
  36.         android:layout_toRightOf="@id/avator"  
  37.         android:horizontalSpacing="1dp"  
  38.         android:numColumns="3"  
  39.         android:visibility="gone"  
  40.         android:verticalSpacing="1dp" />  
  41. </RelativeLayout>  
接下来我们还需要将主流的photoView.jar加入到工程中,      
总结一下实现以上功能我们使用了第三的imagloader,支持手势缩放的PhotoView,圆形图像的circleimageView,熟悉安卓view绘制机制加载过程,事件传递和分发的朋友是不需要第三方开源项目的支持的,但是对于入门不久的同学,学会怎样使用开源框架就可以,但是想要提高开源项目的的核心还是需要了解的,欢迎阅读      
运行效果图:      
Android 高仿微信朋友圈动态, 支持双击手势放大并滑动查看图片。 demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo
有兴趣的朋友建议阅读下:      
安卓事件机制(一)和上篇关于View的博文。谢谢交流和分享。
      

demo源码下载地址:https://github.com/Tamicer/CHatMomentDemo