您的位置:首页 > 移动开发 > Android开发

Android5.0之Palette简单实用

2016-01-26 10:11 519 查看
一直想学学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。

准备工作完成了,来看看具体实现代码吧。

先看看布局文件:

 

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context="org.loader.palette.MainActivity"
>

   

        android:id="@+id/iv"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:src="@drawable/ic_launcher"
/>

    <<a href="http://code.662p.com/list/2943_1.html"
target="_blank" class="relatedlink" style="word-wrap: break-word; outline: none; color: rgb(51, 102, 153); border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: blue;">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"
/>

复制代码
很简单,一个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,文字介绍的颜色和该美食的图片的颜色相关
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: