Android PorterDuffColorFilter 颜色混合滤镜

Android 颜色混合滤镜 (PorterDuffColorFilter) ,顾名思义,就是一种颜色过滤器,可使用单一颜色和特定的 Porter-Duff 复合模式为源像素着色

PorterDuffColorFilter(int color, PorterDuff.Mode mode)
参数 说明
color 颜色
mode 模式

范例

下面我们来写个简单的例子,我们取 6 种不同的颜色,对 18 种模式进行测试


  1. 创建一个 空的 Android 项目 cn.twle.android.DuffColor

  2. 新建一个包 cn.twle.android.common 然后下载 /static/i/android/MsAdapter.java 放到该目录下

  3. 下载 /static/i/android/avatar_girl.png 放到 res/drawable 目录

  4. 因为我们使用的是 GridView 排列这 18 种模式,所以需要创建一个 view_item.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">
    
        <ImageView
            android:id="@+id/img_show"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/avatar_girl" />
    
        <TextView
            android:id="@+id/tv_color"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:textSize="12sp"
            android:text="颜色"
            android:textColor="#FFFFFFFF" />
    
        <TextView
            android:id="@+id/tv_mode"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#FFD9ECFF"
            android:text="模式"/>
    
    </LinearLayout>
    
  5. 创建一个业务 POJO 业务类: DataBean.java

    package cn.twle.android.duffcolor;
    
    import android.graphics.PorterDuff;
    
    public class DataBean {
        private int color;
        private PorterDuff.Mode mode;
    
        public DataBean() {
        }
    
        public DataBean(int color, PorterDuff.Mode mode) {
            this.color = color;
            this.mode = mode;
        }
    
        public int getColor() {
            return color;
        }
    
        public PorterDuff.Mode getMode() {
            return mode;
        }
    
        public void setColor(int color) {
            this.color = color;
        }
    
        public void setMode(PorterDuff.Mode mode) {
            this.mode = mode;
        }
    }
    
  6. 修改主布局文件 activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <GridView
            android:id="@+id/ms_show"
            android:background="#FF333333"
            android:numColumns="6"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    
    </LinearLayout>
    
  7. 修改 MainActivity.java 填充数据,设置 Adapter

    package cn.twle.android.duffcolor;
    
    import android.graphics.PorterDuff;
    import android.graphics.PorterDuffColorFilter;
    import android.graphics.drawable.Drawable;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.GridView;
    import android.widget.ImageView;
    
    import cn.twle.android.common.MsAdapter;
    
    import java.util.ArrayList;
    
    public class MainActivity extends AppCompatActivity {
    
        private GridView gd_show;
        private ArrayList<DataBean> items = null;
        private MsAdapter<DataBean> msAdapter = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            gd_show = (GridView) findViewById(R.id.ms_show);
    
            //填充数据,遍历Mode模式
            items = new ArrayList<DataBean>();
            for (PorterDuff.Mode mode : PorterDuff.Mode.class.getEnumConstants()) {
                items.add(new DataBean(0x77E50961, mode));
                items.add(new DataBean(0xFFE50961, mode));
                items.add(new DataBean(0x77FFFFFF, mode));
                items.add(new DataBean(0xFFFFFFFF, mode));
                items.add(new DataBean(0x77000000, mode));
                items.add(new DataBean(0xFF000000, mode));
            }
            msAdapter = new MsAdapter<DataBean>(items, R.layout.view_item) {
                @Override
                public void bindView(MsAdapter.ViewHolder holder, DataBean obj) {
    
                    holder.setText(R.id.tv_color, String.format("%08X", obj.getColor()));
                    holder.setText(R.id.tv_mode, obj.getMode().toString());
                    ((ImageView)holder.getView(R.id.img_show)).setColorFilter(new PorterDuffColorFilter(obj.getColor(), obj.getMode()));
                }
            };
            gd_show.setAdapter(msAdapter);
        }
    }
    

参考文档

官方API文档: PorterDuffColorFilter

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.