一直想学学android5.0的新特性,但是由于模拟器的原因,一直没有了却这个心愿。
今天是个悲剧的一天,但不是有那么一句老话吗“塞翁失马,焉知非福”。先说说今天吧, 不知道咋回事,genymotion数据全丢失了,没办法,只能重新下载新的数据,就是在选择版本的过程中,突然发现了5.0, 好激动,赶快下载下来体验一把。
UI是不是特别爽,感觉可以秒杀iOS好几条街了, 好了,不扯淡了,进入今天的主题Palette。
Palette,中文名:调色板,也就是android允许我们动态的获取颜色,至于这些颜色怎么处理,就看你个人的爱好和需求了。
那么怎么获取颜色呢? 从哪获取颜色?
先来回答第二个问题,一般情况,我们是从图片抓取颜色,然后设置到该图片的介绍(文本颜色和背景颜色)。 这样做有什么好处? 可以保证图片和文字介绍在同一个色调上。是不是很爽?
再来看看第一个问题如何获取? 答案也很简单,就是我们今天要用的Palette。
依照惯例,先上代码, 哦,不对,上代码之前,还得说一下Palette怎么使用,好,找到你的android5 sdk的下来目录,依次定位到sdk\extras\android\support\v7\palette目录下,再打开libs目录,可以看到里面有一个android-support-v7-palette.jar文件,将这个文件copy到你项目的libs目录下,这样你的项目才可以使用Palette。
准备工作完成了,来看看具体实现代码吧。
先看看布局文件:
<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="org.loader.palette.MainActivity" > <ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <TextView android:layout_below="@id/iv" android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout>
很简单,一个ImageView和一个TextView,过会,我们就通过代码,根据ImageView上的图片的主色调来调整TextView的色调。
public class MainActivity extends Activity { private ImageView mImageView; private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mImageView = (ImageView) findViewById(R.id.iv); mTextView = (TextView) findViewById(R.id.tv); Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); Palette.generateAsync(bmp, new Palette.PaletteAsyncListener() { @Override public void onGenerated(Palette palette) { Palette.Swatch swatch = palette.getVibrantSwatch(); if(null != swatch) { mTextView.setBackgroundColor(swatch.getRgb()); mTextView.setTextColor(swatch.getTitleTextColor()); } } }); } }
在介绍代码之前,首先说一下Palette这个类,看一下文档,这个类并没有提供可用的构造方法,而且提供了一系列的静态generate和generateAsync方法,很好理解,就是生成的意思,来说说generate和generateAsync的区别,不管什么代码,要操作一个图片,肯定是很浪费时间的,因为代码要去扫描每一个像素点,所以我们不可能再ui线程中去这么做,所以generate方法一般是在线程中去用,并等待返回结果;如何是在ui线程中,我们可以使用generateAsync方法,该方法的任何一个重载都有一个回调的参数,而且它的返回值是一个AsyncTask。
好,开始看咱们的代码吧。
12行,我们获取了一个Bitmap,这个没什么好说的,这个bitmap就是ImageView上显示的那个图片。
14~23行是关键,可以看到,我们使用了Palette的静态方法generateAsync。第一个参数是一个Bitmap对象,正好,我们把12行获取的bitmap传给它,第二个参数是一个回调接口,在这个接口中有一个onGenerated方法,参数是一个Palette对象。这样曲折的一个过程,我们终于获取了Palette对象。
如果,你看过文档,你会发现Palette提供了一系列的get方法,这里我们使用的是getDarkVibrantSwatch,该方法返回一个Swatch(色板)对象,然后我们就可以通过Swatch获取需要的颜色了。swatch,getRgb()返回的是该色板上的一个rbg颜色,swatch.getTitleTextColor()返回的android建议的一个用于任何标题的颜色,另外还有一个getBodyTextColor()返回的是android建议的一个用于任何body的颜色,哈,是不是很智能?
代码很简单,但是实现的效果却是令人激动的,最后来看一下效果吧:
是不是根据图片的色调,动态的改变了TextView的色调。
更多实用功能,还需要我们在日常开发中去挖掘,我们完全可以做一个美食的APP,文字介绍的颜色和该美食的图片的颜色相关,这样用户体验将更好。