博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android L 之 RecyclerView 、CardView 、Palette
阅读量:5843 次
发布时间:2019-06-18

本文共 4878 字,大约阅读时间需要 16 分钟。

转:

http://blog.csdn.net/xyz_lmn/article/details/38735117

提到,Android L版本中新增了RecyclerView、CardView 、Palette。RecyclerView、CardView为用于显示复杂视图的新增Widget。Palette作为调色板类,可以让你从图像中提取突出的颜色。

 

 

RecyclerView

 

    RecyclerView作为替代ListView使用,RecyclerView标准化了ViewHolder,ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,假设没有屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。 ViewHolder更适合多种子布局的列表,尤其IM的对话列表。RecyclerView不提供setOnItemClickListener方法,你可以在ViewHolder中添加事件。RecyclerView的使用可以参考。

RecyclerView可以实现横向、纵向滑动视图:

 

                 

RecyclerView 1                                    RecyclerView 2

 

设置横向:

 

[java] 
 
  1. @Override  
  2.    protected void onCreate(Bundle savedInstanceState) {  
  3.        super.onCreate(savedInstanceState);  
  4.        setContentView(R.layout.activity_recycler_view_horizontal);  
  5.   
  6.        // specify an adapter (see also next example)  
  7.        List<MyAdapter.Item> itemList = new ArrayList<MyAdapter.Item>();  
  8.        for (int i = 0; i < 100; i++)  
  9.            itemList.add(new MyAdapter.Item("Item " + i, "world"));  
  10.        mAdapter = new MyAdapter(itemList);  
  11.   
  12.   
  13.        mRecyclerViewHorizontal = (RecyclerView) findViewById(R.id.my_recycler_view_horizontal);  
  14.        mRecyclerViewHorizontal.setHasFixedSize(true);  
  15.   
  16.        // use a linear layout manager  
  17.        LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);  
  18.        mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);  
  19.        mRecyclerViewHorizontal.setLayoutManager(mLayoutManager);  
  20.        mRecyclerViewHorizontal.setAdapter(mAdapter);  
  21.   
  22.   
  23.    }  

 

CardView 

    CardView继承自FrameLayout类,可以在一个卡片布局中一致性的显示内容,卡片可以包含圆角和阴影。CardView是一个Layout,可以布局其他View。CardView 的使用可以参考。文章最后会给出这篇文章示例代码。

 

                    

CardView                                         Palette

 

Palette

 

如果你试过android Lollipop的sdk,你可能注意到了Palette。Palette从图像中提取突出的颜色,这样可以把色值赋给ActionBar、或者其他,可以让界面整个色调统一。

 

创建Palette实例

有四种创建实例的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Synchronous methods.
// --------------------------------
// These should be used when you have access to the underlying image loading thread.
// Picasso allows this through a Transformation. For other libraries, YMMV.
// Uses the default palette size (16).
Palette p = Palette.generate(bitmap);
// Allows you to specify the maximum palette size, in this case 24.
Palette p = Palette.generate(bitmap, 24);
// Asynchronous methods
// --------------------------------
// This is the quick and easy integration path. Internally uses an AsyncTask so
// this may not be optimal (since you're dipping in and out of threads)
// Uses the default palette size (16).
Palette.generateAsync(bitmap,
new
Palette.PaletteAsyncListener() {
    
@Override
    
public void onGenerated(Palette palette) {
       
// Here's your generated palette
    
}
});
// Allows you to specify the maximum palette size, in this case 24.
Palette.generateAsync(bitmap, 24,
new
Palette.PaletteAsyncListener() {
    
@Override
    
public void onGenerated(Palette palette) {
       
// Here's your generated palette
    
}
});

创建完一个实例之后,我们还需要得到一种采集的样本(swatch),有6中样本(swatch):

1
2
3
4
5
6
Vibrant. Palette.getVibrantSwatch()
Vibrant dark. Palette.getDarkVibrantSwatch()
Vibrant light. Palette.getLightVibrantSwatch()
Muted. Palette.getMutedSwatch()
Muted dark. Palette.getDarkMutedSwatch()
Muted light. Palette.getLightMutedSwatch()

具体选择哪一种取决于你自己,大多数情况下我们都使用Vibrant and Dark Vibrant。

使用样本(swatch)

swatch有以下方法:

1
2
3
4
5
getPopulation(): the amount of pixels which
this
swatch represents.
getRgb(): the RGB value of
this
color.
getHsl(): the HSL value of
this
color.
getBodyTextColor(): the RGB value of a text color which can be displayed on top of
this
color.
getTitleTextColor(): the RGB value of a text color which can be displayed on top of
this
color.

比如如果你的TextView 有个背景图片,要想让字体颜色能够和背景图片匹配,则使用getBodyTextColor()比较合适,getTitleTextColor()其实应该和getBodyTextColor()差不多。

下面的代码则是展示了如何从一张图片中提取颜色将textView的背景色设置成图片的主色调,然后再使用getTitleTextColor()来设置一个匹配的文字颜色。

1
2
3
4
5
6
Palette.Swatch swatch = palette.getVibrantSwatch();
TextView titleView = ...;
if
(swatch !=
null
) {
    
titleView.setBackgroundColor(swatch.getRgb());
    
titleView.setTextColor(swatch.getTitleTextColor());
}

需要注意的是getVibrantSwatch()可能会返回一个null值,所以检查一下是必须的。

size的问题

你还可以使用如下方法一次性获得所有的swatch:

1
List<Palette.Swatch> swatches = palette.getSwatches();

在上面的代码中,你可能注意到了可以设置palette的size。size越大,花费的时间越长,而越小,可以选择的色彩也越小。最佳的选择是根据image的用途:

头像之类的,size最好在24-32之间;

风景大图之类的 size差不多在8-16;

默认是16.

===================================================================================================

    Palette从图像中提取突出的颜色,这样可以把色值赋给ActionBar、或者其他,可以让界面整个色调统一。

Palette这个类中提取以下突出的颜色:

Vibrant  (有活力)

Vibrant dark(有活力 暗色)

Vibrant light(有活力 亮色)

Muted  (柔和)

Muted dark(柔和 暗色)

Muted light(柔和 亮色)

 

提取色值代码如下:

 

 

[java] 
 
  1. Bitmap bm = BitmapFactory.decodeResource(getResources(), item.image);  
  2.           Palette palette = Palette.generate(bm);  
  3.           if (palette.getLightVibrantColor() != null) {  
  4.               name.setBackgroundColor(palette.getLightVibrantColor().getRgb());  
  5.               getSupportActionBar().setBackgroundDrawable(new ColorDrawable(palette.getLightVibrantColor().getRgb()));  
  6.               // getSupportActionBar().  
  7.   
  8.           }  

 

你可能感兴趣的文章
Openstack之路(四)计算服务Nova
查看>>
linux学习入门之Linux系统目录结构
查看>>
远程服务器不能复制粘贴解决方法
查看>>
UVALive2953 POJ1775 ZOJ2358 Sum of Factorials【打表+穷尽搜索】
查看>>
码农们:完美主义也是一种错
查看>>
[BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
查看>>
把UltraEdit改造成VC
查看>>
(个人)Linux基本指令收集
查看>>
switch与ifelse的效率问题
查看>>
【开源】C#信息抽取系统【招募C#队友】
查看>>
angular 表单操作
查看>>
站内消息弹出层简单实现
查看>>
HDU - Pseudoforest
查看>>
Nexus杂
查看>>
android提权
查看>>
Android --- GreenDao的实现(ORM框架)
查看>>
正则3
查看>>
HUT-XXXX The window of the dazzling 模拟
查看>>
用Java发起HTTP请求与获取状态码(含状态码列表)
查看>>
virtualbox + vagrant
查看>>