Android5.0之Palette简单实用

一直想学学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的颜色,哈,是不是很智能?

代码很简单,但是实现的效果却是令人激动的,最后来看一下效果吧:

Android5.0之Palette简单实用_第1张图片

是不是根据图片的色调,动态的改变了TextView的色调。

更多实用功能,还需要我们在日常开发中去挖掘,我们完全可以做一个美食的APP,文字介绍的颜色和该美食的图片的颜色相关,这样用户体验将更好。

你可能感兴趣的:(android,Palette,android5)