一直很喜欢使用知乎日报, 也一直很钟情于知乎日报的卡片式设计,不过基于某种原因,一直在项目中没怎么使用到,恰好今天在弄毕设的时候,想到确实可以再自己listView的美化下一些功夫,于是自然就想到了卡片式,便着手研究了下,实现了这种效果。效果图如下:
首先先写好我们的布局,既然是listView,当然就少不了两个基本的布局啦,一个就是大家熟悉的listView(我这里使用的是开源的XlistVIew),另一个就是listView的item布局啦。
ListView.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<me.maxwin.view.XListView
android:id="@+id/xlistView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="@android:color/transparent"
android:divider="@null"
android:dividerHeight="@dimen/item_height"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:fadingEdge="none" >
</me.maxwin.view.XListView>
</RelativeLayout>
相应的其Item布局如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:descendantFocusability="beforeDescendants">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="8dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingTop="8dp"
android:background="@drawable/item_card_background_seletor"
android:descendantFocusability="afterDescendants" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="哀家就是这么美!火了!"
android:textColor="@color/black"
android:textSize="15sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="top"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top"
android:maxLines="2"
android:text="今天在深圳地铁上发生的一件颇有争议的撕逼大战,内容火爆,引爆新一年流行网络流行语"
android:textColor="@color/font_gray"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_date"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical|left"
android:text="22小时前|100次阅读"
android:textColor="@color/font_gray"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/img_news"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginRight="5dp"
android:src="@drawable/default_image" />
</LinearLayout>
</LinearLayout>
</FrameLayout>注意:这里要注意的是因为是卡片式的风格,最外层必须使用FrameLayout。
当然为了实现每个item的点击的效果以及实现更为卡片式的3D效果,在其底部实现阴影效果,此时我们加入了一个背景和点击时显示的背景,代码如下:
item_card_background_selector.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/item_card_state_pressed" android:state_focused="true"></item>
<item android:drawable="@drawable/item_card_state_pressed" android:state_pressed="true"></item>
<item android:drawable="@drawable/item_card_background"></item>
</selector>item_card_state_pressed.xml:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item >
<shape android:shape="rectangle">
<solid android:color="#2989D4"/>
<corners android:radius="2dp"/>
</shape>
</item>
<item
android:bottom="2dp"
android:left="0dp"
android:right="0dp"
android:top="0dp">
<shape android:shape="rectangle">
<solid android:color="#E7E7E7"/>
<corners android:radius="2dp"/>
</shape>
</item>
</layer-list>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape android:shape="rectangle">
<solid android:color="#CABBBBBB"/>
<corners android:radius="2dp"/>
</shape>
</item>
<item
android:bottom="2dp"
android:left="0dp"
android:right="0dp"
android:top="0dp">
<shape android:shape="rectangle">
<solid android:color="@color/white"/>
<corners android:radius="2dp"/>
</shape>
</item>
</layer-list>
原文:http://blog.csdn.net/longshanaa/article/details/44967165