废话不多说,先上效果图


由于近期须要做朋友圈功能,所以在此记录一下,事实上非常多人不明确的一点应该是在图片的排列上面吧,不规则的排列,事实上非常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里面方法,使界面撑到最大
@Override
protected 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 {

    @Override
protected 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("");
}
} @Override
public int getCount() {
// TODO Auto-generated method stub
return 10;// 返回10条数据
} @Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
return position;
} @Override
public 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() {
@Override
public 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;
} @Override
public int getCount() {
// TODO Auto-generated method stub
return num;
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public 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() {
@Override
public 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楼写程序=.=

android仿qq空间、微信朋友圈图片展示的更多相关文章

  1. Android仿QQ空间发表动态

    效果展示图: 功能描述:用户点击+会进入发表动态的界面,发表成功后跳转到个人首页. 后续完善:增加个人头像的上传,对界面进行优化,增加点赞和评论的功能. 主要采用listview对内容进行展示,对sq ...

  2. 仿QQ空间和微信朋友圈,高解耦高复用高灵活

    先看看效果: 用极少的代码实现了 动态详情 及 二级评论 的 数据获取与处理 和 UI显示与交互,并且高解耦.高复用.高灵活. 动态列表界面MomentListFragment支持 下拉刷新与上拉加载 ...

  3. Android高仿qq及微信底部菜单的几种实现方式

    最近项目没那么忙,想着开发app的话,有很多都是重复,既然是重复的,那就没有必要每次都去写,所以就想着写一个app通用的基本框架,这里说的框架不是什么MVC,MVP,MVVM这种,而是app开发的通用 ...

  4. 仿QQ空间动态界面分享

    先看看效果: 用极少的代码实现了 动态详情 及 二级评论 的 数据获取与处理 和 UI显示与交互,并且高解耦.高复用.高灵活. 动态列表界面MomentListFragment支持 下拉刷新与上拉加载 ...

  5. Android项目实战(十六):QQ空间实现(一)—— 展示说说中的评论内容并有相应点击事件

    大家都玩QQ空间客户端,对于每一个说说,我们都可以评论,那么,对于某一条评论: 白雪公主 回复 小矮人 : 你们好啊~ 我们来分析一下: .QQ空间允许我们 点击 回复人和被回复人的名字就可以进入对于 ...

  6. Fragment,仿QQ空间

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9023451          在今天的这篇文章当中,我依然会以实战加理论结合 ...

  7. Html - 仿QQ空间右下角工具浮动块

    仿QQ空间右下角工具浮动块 <style type="text/css"> .cy-tp-area>.cy-tp-fixbtn>.cy-tp-text { ...

  8. JS仿QQ空间鼠标停在长图片时候图片自动上下滚动效果

    JS仿QQ空间鼠标停在长图片时候图片自动上下滚动效果 今天是2014年第一篇博客是关于类似于我们的qq空间长图片展示效果,因为一张很长的图片不可能全部把他展示出来,所以外层用了一个容器给他一个高度,超 ...

  9. Android仿QQ ios dialog,仿QQ退出向上菜单

    Android仿QQ ios dialog,仿QQ退出向上菜单 EasyDialog两种模式 仿QQ退出向上菜单,自己定义向上菜单              github地址:https://gith ...

随机推荐

  1. 迅为嵌入式开发板iTOP-6818开发板八核Cortex-A53架构,满足各种产品需求

    性价比更高 内存:1G(可选2G);存储:16G;4418:四核 Cortex-A9;6818:八核Cortex-A53. 功能更强 板载4G(全网通),GPS,WIFI,千兆以太网,重力加速度计等, ...

  2. sysbench下载安装

    涉及到sysbench源码的配置和编译,首先确认系统安装了gcc gcc-c++编译器:确认安装了autoconf .automake.libtool等:[root@PC download]# rpm ...

  3. C# 获取U盘ID序列号及U盘信息

    C# 获取U盘ID序列号及U盘信息 2011-05-20 上传大小:35KB c#VS2005U盘IDU盘信息   获取U盘ID序列号 VS2005编译通过,源码源自CSDN.已经测试好用. 可以获得 ...

  4. 签名mobileconfig 重签ipa

    .mobileconfig文件的签名 生成Apache专用的三个证书 双击[2331135_zgp.ink_chain.crt]可以看到它是个根证书,在mac上,双击它,导入到证书中心,然后再导出为p ...

  5. CGContextAddArc

    这个函数让我在纸上画了半天才搞明白,把我的理解给大家分享下. void CGContextAddArc(CGContextRef c, CGFloat x, CGFloat y, CGFloat ra ...

  6. 诊断:ORA-16188: LOG_ARCHIVE_CONFIG settings inconsistent with previously started instance

    11g数据库里面一个套RAC环境,之前搭建过DG,后来拆除掉.某次演练重启的时候,碰到数据库无法open的情况.日志显示 WARNING: The 'LOG_ARCHIVE_CONFIG' init. ...

  7. 【design pattern】工厂方法模式和抽象工厂模式

    前言 设计模式分为三大类: 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式: 结构型模式:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式: 行为型模式 ...

  8. 零基础入门学习Python(27)--集合:在我的世界里,你就是唯一

    知识点 集合:set set和dict类似,也是一组key的集合,但不存储value.由于key不能重复,所以,在set中,没有重复的key. 集合中的元素的三个特征: 1)确定性(元素必须可hash ...

  9. 零基础入门学习Python(14)--字符串:各种奇葩的内置方法

    前言 这节课我们回过头来,再谈一下字符串,或许我们现在再来谈字符串,有些朋友可能觉得没必要了,甚至有些朋友就会觉得,不就是字符串吗,哥闭着眼也能写出来,那其实关于字符串还有很多你不知道的秘密哦.由于字 ...

  10. linux与linux之间共享目录

    1.安装必要的包 nfs-utils           rpcbind (nfs是基于sun公司的rpc通信实现的,所以要装rpcbind) 这2包,在服务端和客户端都需要安装,并启动服务. 启动 ...