废话不多说,先上效果图


由于近期须要做朋友圈功能,所以在此记录一下,事实上非常多人不明确的一点应该是在图片的排列上面吧,不规则的排列,事实上非常easy的。就是一个GridView。然而你xml光光写GridView是不行的哦,你们会发现,图片仅仅显示一行,并且这个gridView还能够滑动,是吧,事实上我们得重写GridView的onMeasure方法,使其扩大至内容的最大状态。

  • 项目类图


内容不多,接下来就一一解说吧

  • PictureGridView.java

重写GridView的onMeasure方法

public class PictureGridView extends GridView {public PictureGridView(Context context) {super(context);// TODO Auto-generated constructor stub}public PictureGridView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}public PictureGridView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);// TODO Auto-generated constructor stub}//重写onMeasure里面方法,使界面撑到最大@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, heightMeasureSpec);}}
  • WindowSize.java 用来获取当前屏幕的宽度
public class WindowSize {public static int getWidth(Context context) {WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);int width = manager.getDefaultDisplay().getWidth();return width;}}
  • MainActivity.java
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView listview = (ListView) findViewById(R.id.listview);listview.setAdapter(new MyListViewAdapter(this));}}
  • main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.qq.MainActivity" ><ListView
        android:id="@+id/listview"android:layout_width="match_parent"android:layout_height="match_parent" ></ListView></RelativeLayout>
  • MyListViewAdapter.java

class MyListViewAdapter extends BaseAdapter {private Context context;List<String> data;public MyListViewAdapter(Context context) {this.context = context;//生成9条数据data = new ArrayList<String>();for (int i = 0; i < 9; i++) {data.add("");}}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn 10;// 返回10条数据}@Overridepublic Object getItem(int arg0) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if (convertView == null) {holder = new ViewHolder();convertView = LayoutInflater.from(context).inflate(R.layout.item,parent, false);holder.gridview = (PictureGridView) convertView.findViewById(R.id.gridView);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}int num = position % data.size() + 1;//获取当前的图片数目int col = 1;//默认列数Log.i("tag", "num" + num);if (num == 1) {holder.gridview.setNumColumns(1);col = 1;} else if (num == 2 || num == 4) {holder.gridview.setNumColumns(2);col = 2;} else {holder.gridview.setNumColumns(3);col = 3;}holder.gridview.setAdapter(new MyGridViewAdapter(context, num, col));holder.gridview.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?

> arg0, View arg1, int position, long arg3) { Toast.makeText(context, "" + position, 0).show(); } }); return convertView; } private class ViewHolder { PictureGridView gridview; } }

  • item.xml
<?

xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:layout_width="30dp" android:layout_height="30dp" android:layout_margin="10dp" android:src="@drawable/ic_launcher" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="center_vertical" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="信奇哥得永生" android:textSize="15dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="17:66" android:textColor="#777" android:textSize="13dp" /> </LinearLayout> </LinearLayout> <com.example.qq.PictureGridView android:verticalSpacing="5dp" android:horizontalSpacing="5dp" android:id="@+id/gridView" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>

  • MyGridViewAdapter.java

public class MyGridViewAdapter extends BaseAdapter {Context context;int num;int col;public MyGridViewAdapter(Context context, int num, int col) {this.context = context;this.num = num;this.col = col;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn num;}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ImageView img = new ImageView(context);img.setScaleType(ImageView.ScaleType.CENTER_CROP);int width = WindowSize.getWidth(context);// 获取屏幕宽度Log.i("tag", "width" + width);int height = 0;width = width / col;// 对当前的列数进行设置imgView的宽度height = width;img.setLayoutParams(new AbsListView.LayoutParams(width, height));img.setImageResource(R.drawable.user_photo);img.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(context, "" + position, 0).show();}});return img;}

好了,代码已经展示出了,技巧大家应该也明确了吧。非常easy的,尽管我这做的潦草
但思想还是存在的。即便是载入网络图片,也是这样。先获取图片的url数量,然后来推断该怎么设置GridView的列,设置好列后把列数传给GridViewAdapter,让adapter去设置图片的宽度,为了适应屏幕,我们获取了屏幕的宽度然后除以列数。图片的填充样式也设置了ImageView.ScaleType.CENTER_CROP。为了使图片看起来更美观一点,事实上我之前还想到了一点,不知道是不是这样做的,就是我们上传图片的时候。服务端应该生成了两种图片。一种是缩略图。一种是原图,我们qq空间中显示的应该是缩略图。然后点击查看显示原图。那么这个缩略图的宽高依照当前最流行的机型的宽度来设置的话。应该屏幕适应会更好点吧,再加上ImageView设置了ImageView.ScaleType.CENTER_CROP。这样就绝不会产生图片上下带空白的效果了。

create by 2016/3/6 15:51
author wangqi

再啰嗦两句,今天星期天。天气晴。我在淮南师范图书馆6楼写程序=.=

转载于:https://www.cnblogs.com/gccbuaa/p/7145986.html

android仿qq空间、微信朋友圈图片展示相关推荐

  1. Android仿微信朋友圈图片展示效果,图片查看器

    现在越来越多的APP都会有图片展示,这里是模仿微信朋友圈图片展示效果,图片查看器. 主要分为4部分: 1.透明Activity 2.计算gridView下iamgeView Item所在位置 3.一张 ...

  2. php mysql仿微信朋友圈评论表设计_PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)...

    我们大部分人都发过动态,想必都知道发动态.回复评论.删除动态的整个过程,那么作为初学者,要模仿这些功能有点复杂的,最起码表的关系得弄清楚~~ 先把思路理一下: (1)用户登录,用session读取当前 ...

  3. php 朋友圈留言,php实例-PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)...

    我们大部分人都发过动态,想必都知道发动态.回复评论.删除动态的整个过程,那么这个功能是如何实现的呢?下面小编给大家带来了实例代码,对PHP仿qq空间或朋友圈发布动态.评论动态.回复评论.删除动态或评论 ...

  4. android 仿QQ,微信群组里的@功能,支持@多人,并能一键删除,能获取上传对应的id(修改版)

    首先注明该文章是借签别人的博客,原文博文地址点击打开链接 android 仿QQ,微信群组里的@功能,支持@多人,并能一键删除,能获取上传对应的id 这个需求来源:本人做集成环信聊天时,项目需要@功能 ...

  5. Android仿QQ空间底部菜单

    之前曾经在网上看到Android仿QQ空间底部菜单的Demo,发现这个Demo有很多Bug,布局用了很多神秘数字.于是研究了一下QQ空间底部菜单的实现,自己写了一个,供大家参考.效果如下图所示:  点 ...

  6. Android仿QQ空间底栏

    继上一篇仿新浪微博底栏,我们在写个仿QQ空间底栏的效果. 先看主布局文件: <RelativeLayout xmlns:android="http://schemas.android. ...

  7. android仿qq动态,Android仿QQ空间主页面的实现

    今天模仿安卓QQ空间,效果如下: 打开程序的启动画面和导航页面我就不做了,大家可以模仿微信的那个做一下,很简单.这次主要做一下主页面的实现,下面是主页面的布局: android:layout_widt ...

  8. Android仿QQ空间二级评论列表

    之前项目中产品需求带二级的评论列表,首先想到是QQ空间评论列表. 先上效果图 下面我们来分析一下布局结构,首先一级列表是listview,然后二级列表也可以有多条,为了省事我只添加了一条,第一反应是l ...

  9. Android仿QQ、微信聊天界面长按提示框效果

    最近在工作项目中要实现一个长按提示 "复制" 的功能,类似于QQ.微信聊天界面长按提示框效果,本来想偷懒在网上找个开源的项目用,但是看了好几个都不是很满意,所以就打算按照自己的思路 ...

  10. 高仿微信朋友圈图片展示效果 ImageWatcher

    ImageWatcher 大图查看,它能够 * 动画顺畅切换到查看状态,同样动画顺畅退出查看界面 * 左右滑动多图查看 * 仿微信下拽退出 示例下载 在 previews文件夹下 app-debug. ...

最新文章

  1. 柳传志大声对iphone说:这是在中国!
  2. acu风格是什么意思_“高街风格”是什么意思?
  3. Android Application 之 allowBackup 属性浅析
  4. Scala range reverse debug
  5. android callmanager.java,如何使用Mobile-SDK-Android正确注销DJISDKManager和SDKManagerCallback应用程序?...
  6. 城建坐标与经纬度转换工具
  7. amp;#9733;色盲悖论正解!
  8. 百度在北京和深圳主攻腾讯 新浪等一些IM公司,大力挖人,甚至爆出15w-20w年薪,有人士对百度的行为做出以下分析:
  9. 服务器端编程心得(二)—— Reactor模式
  10. 学人工智能数学要好吗?
  11. Python爬虫+数据分析,2019年你想看的A股牛市都在这里了!
  12. ESXi系统U盘做存储
  13. 成都大数据Hadoop与Spark技术培训班
  14. 自动驾驶巨头们的数据“竞速赛”
  15. sqlserver分页
  16. 仿真软件GCKontorl之软件在环(SiL)仿真
  17. Jetty、Netty、Tomcat、Undertow
  18. 【旋转摆正验证码】移动积分兑换影视会员活动旋转摆正验证码识别——识别解绝方法
  19. IOS状态栏和导航栏的控制问题
  20. 作业调度和进程调度的辨析

热门文章

  1. 中国老工业基地吉林对外贸易重回历史高水平
  2. MySql添加外键报错:Cannot add foreign key constraint
  3. jdk,jre,tommcat配置问题
  4. java垃圾回收机制GC
  5. Spring思维导图(AOP篇)
  6. 饿了么的架构设计及演进之路
  7. [Angular Tutorial] 3-Components
  8. 实现两个N*N矩阵的乘法,矩阵由一维数组表示
  9. auth php rbac,php中比rbac更好的权限认证的方式auth认证类
  10. python基础算法面试_【归纳】面试中常见的python基础知识