当前位置:K88软件开发文章中心编程语言APP编程Android01 → 文章内容

8.3.9 Paint API之—— ColorFilter(颜色过滤器)(1/3)

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:27:27

本节引言:上节我们学习了MaskFilter(面具),用它的两个子类BlurMaskFilter弄了下模糊效果,EmbossMaskFilter弄了下浮雕效果,而本节我们来学习的是另一个API——ColorFilter(颜色过滤器),和MaskFilter一样,我们并不直接使用该类,而是使用该类的三个子类:颜色矩阵颜色过滤器:ColorMatrixColorFilter光照色彩过滤器:LightingColorFilter混排颜色过滤器滤器PorterDuffColorFilter本节我们就来学习下第一个ColorMatrixColorFilter的使用吧,打开ColorMatrixColorFilter的文档,大概说的是:通过一个4 x 5的颜色矩阵来变换颜色,可以修改像素的饱和度,将YUV转换成RGB等!而构造方法中的ColorMatrix就是颜色矩阵,也是我们学习的核心,下面听我一一道来!PS:ColorMatrix的API文档1.相关常识的普及:RGBA模型:RGBA不知道你听过没,黄绿蓝知道了吧,光的三基色,而RAGB则是在此的基础上多了一个透明度!R(Red红色),G(Green绿色),B(Blue蓝色),A(Alpha透明度);另外要和颜料的三原色区分开来哦,最明显的区别就是颜料的三原色中用黄色替换了光三基色中的绿色!知道下就好,有兴趣的可自行百度~一些名词:色调/色相——物体传递的颜色饱和度——颜色的纯度,从0(灰)到100%(饱和)来进行描述亮度/明度——颜色的相对明暗程度2.ColorMatrix的解读如题,颜色矩阵(4 * 5),我们可以修改矩阵中的值,来实现黑白照,泛黄老照片,高对比度等效果!手撕颜色矩阵解释图如下:不知道你看懂上图没,如果你学过高数的话,肯定对此很熟悉,无非是矩阵的叉乘而已,没学过也没关系计算方法就是右下角那个,拿颜色矩阵的每一行来 * 颜色矩阵分量的每一列!很典型的一个例子,处理前后的结果比较,我们还可以让某个颜色值 * 一个常数,比如让第三行(蓝)乘以2,效果就变成泛蓝色了,当然,我们肯定要写代码来验证验证上面的结果!3.写代码来验证ColorMatrix所起的作用这里来写烂大街的例子,一个ImageView,4 * 5个EditText,一个重置按钮和一个生成按钮,我们来看下效果图:依次是原图,泛黄,泛绿,泛红,高对比度,色相变换,以及黄色复古 接下来我们来写代码,完成上述的效果:代码实现:首先是布局文件activity_main.xml:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp"> <ImageView android:id="@+id/img_show" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" /> <GridLayout android:id="@+id/gp_matrix" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="3" android:columnCount="5" android:rowCount="4"></GridLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_reset" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="重置" /> <Button android:id="@+id/btn_Change" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="变换" /> </LinearLayout></LinearLayout>接着是MainActivity.java:public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ImageView img_show; private GridLayout gp_matrix; private Button btn_reset; private Button btn_Change; private Bitmap mBitmap; private int mEtWidth, mEtHeight; private EditText[] mEts = new EditText[20]; private float[] mColorMatrix = new float[20]; private Context mContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = MainActivity.this; bindViews(); gp_matrix.post(new Runnable() { @Override public void run() { mEtWidth = gp_matrix.getWidth() / 5; mEtHeight = gp_matrix.getHeight() / 4; //添加5 * 4个EditText for (int i = 0; i < 20; i++) { EditText editText = new EditText(mContext); mEts[i] = editText; gp_matrix.addView(editText, mEtWidth, mEtHeight); } initMatrix(); } }); } private void bindViews() { img_show = (ImageView) findViewById(R.id.img_show); gp_matrix = (GridLayout) findViewById(R.id.gp_matrix); btn_reset = (Button) findViewById(R.id.btn_reset); btn_Change = (Button) findViewById(R.id.btn_Change); mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.img_meizi); img_show.setImageBitmap(mBitmap); btn_reset.setOnClickListener(this); btn_Change.setOnClickListener(this); } //定义一个初始化颜色矩阵的方法 private void initMatrix() { for (int i = 0; i < 20; i++) { if (i % 6 == 0) { mEts[i].setText(String.valueOf(1)); } else { mEts[i].setText(String.valueOf(0)); } } } //定义一个获取矩阵值得方法 private void getMatrix() { f

[1] [2] [3]  下一页


8.3.9 Paint API之—— ColorFilter(颜色过滤器)(1/3)