android左侧RecylerViewjs单选点击显示相应的右侧相应的列表如何实现

Android开发之RecyclerView的使用全解
我的图书馆
Android开发之RecyclerView的使用全解
http://blog.csdn.net/dmk877/article/details/
自&5.0之后,谷歌公司推出了RecylerView控件,RecylerView,我想看到一个新名词后大部分人会首先发出一个疑问,recylerview是什么?为什么会有recylerview也就是说recylerview的优点是什么?recylerview怎么用?接下来就对这几个问题来一起讨论一下recylerview,如有谬误欢迎批评指正,如有疑问请留言。
通过本篇博客,你将学到以下知识点
①RecyclerView与ListView相比它的优点
②RecyclerView的初步用法
③RecyclerView增加分隔线
④RecyclerView更改分隔线的样式
⑤RecyclerView的Adapter的用法
⑥RecyclerView.Adapter中刷新的几个方法的对比
⑦给RecyclerView增加条目点击事件
1.RecyclerView是什么?
&&&&& RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字recylerview即回收view也可以看出。看到这也许有人会问,不是已经有ListView了吗,为什么还要RecylerView呢?这就牵扯到第二个问题了。
2.RecyclerView的优点是什么?
&&&& 根据官方的介绍RecylerView是ListView的升级版,既然如此那RecylerView必然有它的优点,现就RecylerView相对于ListView的优点罗列如下:
①RecylerView封装了viewholder的回收复用,也就是说RecylerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的 & 逻辑被封装了,写起来更加简单。
②提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecylerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还有StaggeredGridLayoutManager等),也就是说RecylerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。你想控制Item的分隔线,可以通过继承RecylerView的ItemDecoration这个类,然后针对自己的业务需求去抒写代码。
③可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecylerView有其自己默认的实现。
3.RecyclerView的用法
&3.1 RecyclerView的初步用法(包括RecyclerView.Adapter用法)
& & &说了这么多,可能大家最关心的就是RecylerView应该怎么用,我们先来讨论讨论RecylerView的用法的理论知识,然后结合一个实例来体验一下RecylerView的优势首先我们需要明白的一点是使用RecylerView必须导入support-v7包,在上面我提到过RecylerView高度的解耦,异常的灵活谷歌给我们提供了多个类来控制Item的显示。
可以看到对RecylerView的设置过程,比ListView要复杂一些,这也是RecylerView高度解耦的表现,虽然代码抒写上有点复杂,但它的扩展性是极高的。
在了解了RecyclerView的一些控制之后,紧接着来看看它的Adapter的写法,RecyclerView的Adapter与ListView的Adapter还是有点区别的,RecyclerView.Adapter,需要实现3个方法:
①onCreateViewHolder()
& & 这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。
②onBindViewHolder()
& & &这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。
③getItemCount()
& & & 这个方法就类似于BaseAdapter的getCount方法了,即总共有多少个条目。
实例:接着来几个小的实例帮助大家更深入的了解RecyclerView的用法,首先来实现一个最简单的列表,效果如下
这种效果的MainAcitivity的代码如下
RecyclerView的Adapter的代码如下:
可以看到RecyclerView标准化了ViewHolder,编写 Adapter面向的是ViewHoder而不在是View了,复用的逻辑被封装了,写起来更加简单。其实它的写法与BaseAdapter的写法是差不多的,大家可以对比下它与getView方法写法的区别,在onCreateViewHolder方法中初始化了一个View,然后返回一个ViewHolder,这个返回的ViewHolder类似于之前在getView中的convertView.getTag(),然后在onBindViewHolder方法中去给这个ViewHolder中的控件填充值。其实它的原理跟getView是差不多的,只是做了封装,我们写起来比较简洁。到这里,看到上述运行效果可能有很多人会说,这效果太丑了,连个分隔线都没有,不要急,我们一步一步来。
& 3.2&RecyclerView增加分隔线
& & &&前面我们说到可以通过RecyclerView.addItemDecoration(ItemDecoration&decoration)这个方法进行设置,其中它需要的参数就是我们自己定义的继承自ItemDecoration的一个对象。我们可以创建一个继承RecyclerView.ItemDecoration类来绘制分隔线,通过ItemDecoration可以让我们每一个Item从视觉上面相互分开来,例如ListView的divider非常相似的效果。当然像我们上面的例子ItemDecoration我们没有设置也没有报错,那说明ItemDecoration我们并不是强制需要使用,作为我们开发者可以设置或者不设置Decoration的。实现一个ItemDecoration,系统提供的ItemDecoration是一个抽象类,内部除去已经废弃的方法以外,我们主要实现以下三个方法:
又因为当我们RecyclerView在进行绘制的时候会进行绘制Decoration,那么会去调用onDraw和onDrawOver方法,那么这边我们其实只要去重写onDraw和getItemOffsets这两个方法就可以实现啦。然后LayoutManager会进行Item布局的时候,会去调用getItemOffset方法来计算每个Item的Decoration合适的尺寸,下面我们来具体实现一个Decoration,DividerItemDecoration.java
在这里我们采用系统主题(android.R.attr.listDivider)来设置成分隔线的,然后来获取尺寸,位置进行setBound(),绘制,接着通过outRect.set()来设置绘制整个区域范围,当然了它是有两种情况的一种LinearLayoutManager.HORIZONTAL另外一种LinearLayoutManager.VERTICAL需要分别对其进行处理,最后不要忘记往RecyclerView中设置该自定义的分割线,然后在MainActivity中加上一句recyclerView&.addItemDecoration(new&DividerItemDecoration(MainActivity.this,LinearLayoutManager.VERTICAL))即给RecyclerView增加分隔线。然后运行,效果如下:
可以看到已经有了分隔线,跟ListView的效果基本一致了。当然了,既然谷歌给我们提供了这个专门添加分隔线的方法,那它肯定会允许我们自定义分隔线的样式,不然把这个方法抽取出来也没有任何意义。
& 3.3 改变分隔线样式
& & &那么怎么更改分隔线的样式呢?在上面的DividerItemDecoration这个类中可以看到这个分隔线是跟ListView一样的,即系统的默认的样式,因此我们可以在styles的xml文件中进行更改,更改如下:
divider的内容如下:
修改之后运行效果如下:
可以看到分隔线的颜色变了,当然了这只是一个小例子,我们可以按照业务需求去更改,这样就基本实现了ListView的效果,看到这肯定会有人说,这尼玛,好麻烦,还不如ListView简单呢,从上面的代码量看来确实是使用起来很复杂,但是如果此时你想将这个列表以GridView的形式展示出来,用RecylerView仅仅是换一行代码的事情,
在上面的代码中我们使用了
RecyclerView.LayoutManager是一个抽象类,系统为我们提供了三个实现类
①LinearLayoutManager即线性布局,这个是在上面的例子中我们用到的布局
②GridLayoutManager即表格布局
③StaggeredGridLayoutManager即流式布局,如瀑布流效果
假如将上述例子换成GridView的效果,那么相应的代码应该这样改
除此之外上述的分隔线也要做相应的更改,因为在上述DividerItemDecoration这个方法中从
这两行我们可以看出来,它是绘制了一条线这条线就是从RecyclerView去掉左右边距后,剩余的部分,因为当显示成ListView时每一行就一个Item所以整体效果看上去就跟ListView差不多,而当展示成GridView那样的效果时,每一行就不止一个条目了,而有可能是多个,所以这个类就不再适用了,我们需要重新写一个,这里我就直接用鸿洋大神写的了,它的博客地址:
别忘了更改分隔线recyclerView&.addItemDecoration(new&DividerGridItemDecoration(this&));之后运行发现效果如下
可以看到如果你准备好了分隔线的这个类,从ListView效果到GridView效果,只需要几行代码,是不是瞬间感觉高大上了?还有更让人瞠目结舌的效果,将上述代码做如下更改
这里需要注意的是StaggeredGridLayoutManager构造的第二个参数传一个orientation,如果传入的是StaggeredGridLayoutManager.VERTICAL那么前面那个参数就代表有多少列;如果传是StaggeredGridLayoutManager.HORIZONTAL那么前面那个参数就代表有多少行
运行效果如下
& & 这效果是不是有点逆天?可以看到,固定为4行,变成了左右滑动。有一点需要注意,如果是横向的时候,item的宽度需要注意去设置,毕竟横向的宽度没有约束了,因为控件可以横向滚动了,另外它还可以实现瀑布流的效果,关于瀑布流我准备后面专门写一篇博客。
& 3.4 RecyclerView增加和删除的动画(包括RecyclerView.Adapter中刷新的几个方法的对比)
在上面也提到了控制RecyclerView增加和删除的动画是通过ItemAnimator这个类来实现的,ItemAnimator这类也是个抽象的类,系统默认给我们提供了一种增加和删除的动画,下面我们就来看看这种动画的效果,我们需要做的修改如下:
然后重写ActionBar的
关于R.menu.&main中的main.xml这个文件代码就不贴了,在最后的一个汇总的例子里会有
recyclerViewAdapter中增加的两个方法:
public&void&addData(&int&position)
&&&&&&&&&&mDatas.add(position,&"Insert
&&&&&&&&& notifyItemInserted(position);
& & & & & notifyItemRangeChanged(position,&mDatas.size());
&&&&&public&void&removeData(&int&position)
&&&&&&&&&&mDatas.remove(position);
& & & & & notifyItemRemoved(position);
& & & & &&notifyItemRangeChanged(position,&mDatas.size());
这里需要说一下RecyclerView.Adapter中刷新数据的几个方法,一共有这么几个方法
notifyDataSetChanged()这个方法跟我们平时用到的ListView的Adapter的方法一样,这里就不多做描述了。
notifyItemChanged(int position),当position位置的数据发生了改变时就会调用这个方法,就会回调对应position的onBindViewHolder()方法了,当然,因为ViewHolder是复用的,所以如果position在当前屏幕以外,也就不会回调了,因为没有意义,下次position滚动会当前屏幕以内的时候同样会调用onBindViewHolder()方法刷新数据了。其他的方法也是同样的道理。public
final void notifyItemRangeChanged(int positionStart, int itemCount),顾名思义,可以刷新从positionStart开始itemCount数量的item了(这里的刷新指回调onBindViewHolder()方法)。
public final void notifyItemInserted(int position),这个方法是在第position位置被插入了一条数据的时候可以使用这个方法刷新,注意这个方法调用后会有插入的动画,这个动画可以使用默认的,也可以自己定义。
public final void notifyItemMoved(int fromPosition, int toPosition),这个方法是从fromPosition移动到toPosition为止的时候可以使用这个方法刷新
public final void notifyItemRangeInserted(int positionStart, int itemCount),显然是批量添加。
public final void notifyItemRemoved(int position),第position个被删除的时候刷新,同样会有动画。
将上述更改运行,点击添加和删除按钮效果图如下:
public final void notifyItemRangeRemoved(int positionStart, int itemCount),批量删除。
可以看到系统给提供的动画效果还不错,当然我们也可以按照业务需求去自己定义动画效果。
& 3.5 给RecyclerView的Item添加点击事件
& & 到这里还有一点从文章开头到现在我们都没有提及,就是Item的点击事件RecyclerView监听事件处理在ListView使用的时候,该控件给我们提供一个onItemClickListener监听器,这样当我们点击Item的时候,会回调相关的方法,以便我们方便处理Item点击事件。对于RecyclerView来讲,非常可惜的是,该控件没有给我们提供这样的内置监听器方法,不过我们可以进行改造实现,可以这样实现Item的点击事件的监听,在我们的adapter中增加这两个方法
public&interface&OnItemClickListener{
&&&&&&&&void&onClick(&int&position);
&&&&&&&&void&onLongClick(&int&position);
public&void&setOnItemClickListener(OnItemClickListener
onItemClickListener ){
&&&&&&&&this.&mOnItemClickListener=onItemClickL
然后onBindViewHolder方法要做如下更改
在MainAcitivity中增加
然后运行,效果如下:
可以看到Item的onClick和onLongClick事件都触发了。到此关于RecyclerView的基本用法就介绍的差不多了,当然,还有几个点没有提到,比方说瀑布流、下拉刷新、上拉加载等,由于篇幅原因这些在后面的更新中都会给大家呈现。最后将本篇博客所提到的知识点做一个整合,写到Demo中,大家可以参考,Demo进行学习。好了,这一篇就到这里了,如果发现什么错误,或者有什么疑问请留言,感谢您的观看,谢谢各位的支持。。。
转载请注明出处:
参考博客:
TA的最新馆藏
喜欢该文的人也喜欢&|&&|&&|&&|&&
当前位置: >
Android学习之RecylerView实习仿支付宝充值界面
作者:qq_ & 来源:转载 &
摘要: 今天周末,闲来无事,做了一个仿支付宝充值界面,主要知识点用RecylerView的GridlayoutManager布局管理器,实现不同数据类型,填充不同布局,功能包括单击选中,双击取消,支持可输入金额等。首先来看一下设计图ok,首先我们来分析一下功能主体部分实现是由recylerview来实现,因为考虑到扩展性,所以一般都不会用xml来实现主体界面,支持点击选中,再次点击取消选中。采用Recyl
今天周末,闲来无事,做了一个仿支付宝充值界面,主要知识点用RecylerView的GridlayoutManager布局管理器,实现不同数据类型,填充不同布局,功能包括单击选中,双击取消,支持可输入金额等。
首先来看一下设计图
ok,首先我们来分析一下功能
主体部分实现是由recylerview来实现,因为考虑到扩展性,所以一般都不会用xml来实现主体界面,支持点击选中,再次点击取消选中。
采用RecylerView的GridlayoutManager布局管理器,分三列,这些都类似于GridView,不作解释,难点在于(adapter如何实现两种布局),因为还包含了可输入的EditText。
哈哈,其实RecylerView早就解决了这个问题
分析完毕,下面来看实现方式吧。
compile 'com.android.support:recyclerview-v7:24.0.0-alpha1'
这个根据自己SDK的版本号进行选择。
RecylerView的初始化
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
recyclerView.setAdapter(adapter = new DemoAdapter());
adapter.replaceAll(getData());
这里采用GridLayoutManager布局管理器,分三列。
public ArrayList&ItemModel& getData() {
ArrayList&ItemModel& list = new ArrayList&&();
for (int i = 0; i & 8; i++) {
String count = i + "元";
list.add(new ItemModel(ItemModel.ONE, count));
list.add(new ItemModel(ItemModel.TWO, null));
return list;
这里是很有意思的地方,大家可以看出来集合里包含了两种不同类型的数据,ItemModel.ONE,ItemModel.TWO,通过不同的数据类型,我们可以选用不同的布局
public DemoAdapter.BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case ItemModel.ONE:
return new OneViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.one, parent, false));
case ItemModel.TWO:
return new TWoViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.two, parent, false));
return null;
这里对不同的viewType,采用不同的ViewHolder,这里是重点,大家揣摩一下。
adapter布局则是一个TextView,跟EditText。
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"&
android:id="@+id/tv" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:layout_margin="8dp" android:padding="12dp" android:background="@drawable/tv_bg" android:textColor="@color/blue_500" /&
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"&
android:id="@+id/et" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="8dp" android:gravity="center" android:hint="输入价格" android:inputType="number" android:background="@drawable/bg_et" android:padding="12dp" android:textSize="12sp" /&
然后如何实现点击选中状态呢?这需要看我们的Selecor啦
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="http://schemas.android.com/apk/res/android"&
android:state_selected="true"&
android:radius="4dp" /&
android:color="@color/blue_500" /&
android:color="@color/blue_500" android:width="1dp"/&
android:state_selected="false"&
android:radius="4dp" /&
android:color="@color/white" /&
android:color="@color/blue_500" android:width="1dp"/&
这里可以看出,对于不同的select,设置对应的shape,就能轻松实现选中效果。
那么如何实现只能单选的功能呢?因为我们充值只能选择一种金额。
这里我们需要分析一下。我们在点击一种金额,需要取消其他金额的选中状态。该怎么实现呢?
我们需要设置一个过去选中的位置(int),记为lastSelectIndex,暂且设置为-1.
private int lastPressIndex = -1;
获取当前选中的位置
int position = getAdapterPosition();
当我们再选中时,需要进行判断,当lastPressIndex==position时,就是双击取消选中状态,将lastPressIndex设置为-1.反之,将lastPressIndex==position。
很好理解吧,因为集合从0开始,设置完之后,我们需要
notifyDataSetChanged();
没错,这句话很重要,如果不刷新的话,下面的viewholder就不会重新赋值。
itemView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.e("TAG", "OneViewHolder: ");
int position = getAdapterPosition();
if (lastPressIndex == position) {
lastPressIndex = -1;
lastPressIndex =
notifyDataSetChanged();
根据lastPressIndex改变select的状态。
if (getAdapterPosition() == lastPressIndex) {
tv.setSelected(true)
tv.setTextColor(ContextCompat.getColor(itemView.getContext(), R.color.white))
tv.setSelected(false)
tv.setTextColor(ContextCompat.getColor(itemView.getContext(), R.color.blue_500))
嗯关键点就这么哆啦。效果图
这里主要解释实现的难点,重点,就不一一贴代码啦。
另外在可能有人会问,当我点击充值的时候如何将选中状态的值从adapter传过来呢?
这里我就分析一下实现方法。
1,用广播的方式,选中的时候就发送广播,在主页面进行接收即可
2,用eventBus来实现传值。详情可以看我的博客
使用EvnetBus进行消息传递解析
使用EventBus进行数据传递解析
就这么多啦,附上代码下载链接
http://pan.baidu.com/s/1nvpeorR
版权所有 IT知识库 CopyRight (C)
IT知识库 IT610.com , All Rights Reserved.Android 5.0+(RecycleView、CardView、Palette)
来源:open开发经验库
Android L 开发者预览支持库提供两个新的Widgets,RecyclerView和CardView。使用这两个Widgets可以显示复杂的Listview和卡片布局,这两个Widgets默认使用Material design。 
RecyclerView 
RecyclerView是一个更高级柔性版本的Listview,RecyclerView是一个能包含很多视图的容器,它能完美的处理循环和滚动。在item动态变化的Listview使用RecyclerView。 
RecyclerView使用很简单,因为它提供了: 
1、定位item的布局管理器 
2、常见的item操作默认动画 
你能够灵活的为RecyclerView自定义布局管理器和动画。 
使用RecyclerView,必须使用指定一个adapter、定义一个布局管理器。创建adapter必须继承自RecyclerView.Adapter。实施的细节需要看数据类型和需要的视图。 
RecyclerView widget 
RecyclerView 提供了 LayoutManager,RecylerView 不负责子 View 的布局 
目前提供了 
LinearLayoutManager(显示垂直或水平滚动列表中的条目。) 
GridLayoutManager(在一个网格显示项) 
StaggeredGridLayoutManager(在交错网格显示项。) 
以上如果不满足要求,那么你可以继承RecyclerView.LayoutManager 
Animations 
动画添加和删除项目在RecyclerView默认启用。自定义动画只需要继承RecyclerView.ItemAnimator类并使用RecyclerView.setItemAnimator()方法。 
使用: 
studio build.gradle
添加 
dependencies {
compile 'com.android.support:recyclerview-v7:22.2.0’
RecyclerView Demo: 
1、布局文件 
&!-- A RecyclerView with some commonly used attributes --&
&android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/& 2、Activity文件 
public class MyActivity extends Activity {
private RecyclerView mRecyclerV
private RecyclerView.Adapter mA
private RecyclerView.LayoutManager mLayoutM
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
// improve performance if you know that changes in content
// do not change the size of the RecyclerView
mRecyclerView.setHasFixedSize(true);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
// specify an adapter (see also next example)
mAdapter = new MyAdapter(myDataset);
mRecyclerView.setAdapter(mAdapter);
To create a simple adapter:
public class MyAdapter extends RecyclerView.Adapter&MyAdapter.ViewHolder& {
private String[] mD
// Provide a reference to the type of views that you are using
// (custom viewholder)
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextV
public ViewHolder(TextView v) {
super(v);
mTextView =
// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(String[] myDataset) {
mDataset = myD
// Create new views (invoked by the layout manager)
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.my_text_view, null);
// set the view's size, margins, paddings and layout parameters
ViewHolder vh = new ViewHolder(v);
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.mTextView.setText(mDataset[position]);
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataset.
} 3、Recycler adapter 
public class MyAdapter extends RecyclerView.Adapter&MyAdapter.ViewHolder& {
private String[] mD
// Provide a reference to the type of views that you are using
// (custom viewholder)
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextV
public ViewHolder(TextView v) {
super(v);
mTextView =
// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(String[] myDataset) {
mDataset = myD
// Create new views (invoked by the layout manager)
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.my_text_view, null);
// set the view's size, margins, paddings and layout parameters
ViewHolder vh = new ViewHolder(v);
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.mTextView.setText(mDataset[position]);
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataset.
} RecyclerView 的标准化了 ViewHolder, 编写 Adapter 面向的是 ViewHoder 而不在是View 了, 复用的逻辑被封装了, 写起来更加简单。 
CardView 
CardView继承自FrameLayout类,可以在一个卡片布局中一致性的显示内容,卡片可以包含圆角和阴影。 
可以使用android:elevation属性,创建一个阴影的卡片。 
怎样指定CardView的属性: 
1、使用android:cardCornerRadius属性指定圆角半径 
2、使用CardView.setRadius 设置圆角半径。 
3、使用 android:cardBackgroundColor属性设置卡片颜色 
studio build.gradle
添加 
dependencies {
compile 'com.android.support:cardview-v7:22.2.0’
} 在创建布局文件中创建CardView: 
&!-- A CardView that contains a TextView --&
&android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_gravity="center"
android:layout_width="200dp"
android:layout_height="200dp"
card_view:cardCornerRadius="4dp"&
&TextView
android:id="@+id/info_text"
android:layout_width="match_parent"
android:layout_height="match_parent" /&
&/android.support.v7.widget.CardView& 官方文档可参看: 
Palette 
根据图片来决定标题的颜色和标题栏的背景色,这样视觉上更具有冲击力和新鲜感,而不像统一色调那样呆板。 
大家想知道这个效果如何实现的吗? 
学习Palette轻轻松松搞定此效果哦~! 
Palette是什么? 
它能让你从图像中提取突出的颜色。这个类能提取以下突出的颜色: 
Vibrant(充满活力的) 
Vibrant dark(充满活力的黑) 
Vibrant light(充满活力的亮) 
Muted(柔和的) 
Muted dark(柔和的黑) 
Muted lighr(柔和的亮) 
如何使用? 
Android Studio 要在你的项目中使用Palette类,增加下面的到你的程序的模块(module)中: 
dependencies {
compile 'com.android.support:palette-v7:22.2.0'
} 相关代码 
//获取一张位图
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img_test);
//获取一个Builder
Palette.Builder from = Palette.from(bitmap);
//生成颜色 Builder.generate().getter方法 这里简单演示
int color =from.generate().getDarkVibrantColor(getResources().getColor(android.R.color.transparent));
mHead.setBackgroundColor(color); 如果是Eclipse首先我们找到sdk/extras/android/support/v7/palette/libs/android-support-v7-palette.jar导入我们的工程。 
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动

我要回帖

更多关于 android 点击显示图片 的文章

 

随机推荐