`

PorterDuffColorFilter 在项目中的基本使用

 
阅读更多
有时候标题栏会浮在内容之上,而内容会有颜色的变化,这时候就要求标题栏能够变化透明度,标题栏中的图片能够变化颜色。看下效果,如下图:


描述
当界面往下划的时候,我们需要做的是

将标题栏是从全透明往全不透明转变
将标题栏中的图片从白色往主题色转变
当界面往上时,就反过来转变界面。

编写步骤
我们的demo的布局是标题栏在recyclerView的上方,布局如下

我们只需要3个步骤:

1.监听recyclerView的滑动
2.滑动时计算出位移的百分比
3.根据百分比来操作标题栏背景和图片
准备工作

在Activity的onCreate里初始化下视图,获取view对象,获取标题栏的背景图,图片的drawble对象等

public class MainActivity extends AppCompatActivity {

    Drawable headBg ;
    Drawable iv1Drawable ;
    Drawable iv2Drawable  ;

    RecyclerView rv;
    RelativeLayout  rlHead;



    private int scrollY;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**
         * 初始化工作
         */
        rv = (RecyclerView) findViewById(R.id.rv);
        rv.setLayoutManager(new LinearLayoutManager(this));
        rv.setAdapter(new SimpleAdapter());

        rlHead = (RelativeLayout) findViewById(R.id.rl_head);

        headBg = rlHead.getBackground().mutate();//获取head的背景drawable
        iv1Drawable = ((ImageView)findViewById(R.id.iv1)).getDrawable().mutate();//获取图片的drawable
        iv2Drawable = ((ImageView)findViewById(R.id.iv2)).getDrawable().mutate();//获取图片的drawable
    }
}


重点说明下mutate这个方法。一开始我修改标题栏的透明度时没有调用mutate方法,导致所有界面的标题栏都透明度都改变了。

Drawable mutate ()

Make this drawable mutable. This operation cannot be reversed. A mutable drawable is guaranteed to not share its state with any other drawable. This is especially useful when you need to modify properties of drawables loaded from resources. By default, all drawables instances loaded from the same resource share a common state; if you modify the state of one instance, all the other instances will receive the same modification. Calling this method on a mutable Drawable will have no effect.

大意就是使当前这个drawable变为易变的,一个易变的drawable被授权不去与其他的drawable共享状态。从资源载入的所有drawble都是共享一个状态实例,只要有一个修改了,其他的使用到该drawable的实例也会被修改。调用了这个方法后我们对drawable的修改就不会影响到其他实例了。

监听recyclerView的滑动

然后对RecyclerView设置滑动监听
//给recyclerView一个滚动监听
        rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
              //我们这里是竖向滑动,只需要关注dy即可
              //dy是每次滑动事件触发后,跟上次y位置的差值
            }
        });

计算位移百分比
/**
     * @param dy
     * @return   0~1 ,滑动距离越大,值越大
     */
    private float calcFraction(int dy){
        //这里的300是图片的高度,图片滚完后就是100%
        float imgHeight = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());
        float toolbarHeight = rlHead.getHeight();
        float maxHeight = imgHeight - toolbarHeight; //图片从头到尾移动的距离

        scrollY += dy; //dy是这次移动的距离,每次移动的距离加起来就是总移动的距离,dy是有正有负的.scrollY是Activiy的成员对象

        if (scrollY >= maxHeight) {
            return 1.0f;

        } else if (scrollY <= 0) {
            return 0f;
        } else {
            return scrollY/maxHeight;
        }
    }


根据百分比来操作标题栏背景和图片
private void setUI(float fraction){
        //背景只需要设置透明度,255是全不透明
        headBg.setAlpha((int) (fraction*255)); //这个headBg是标题栏

        //This evaluator can be used to perform type interpolation between integer values that represent ARGB colors.
        //这个求值器用来执行计算用整形表示的颜色的差值
        ArgbEvaluator argbEvaluator = new ArgbEvaluator();
        int   startColor = ActivityCompat.getColor(MainActivity.this,R.color.colorPrimary);
        int   endColor   = Color.WHITE;

        //根据fraction计算出开始和结束中间的色值
        int calcColor = (int) argbEvaluator.evaluate(fraction, startColor, endColor);

        ColorFilter colorFilter = new PorterDuffColorFilter(calcColor, PorterDuff.Mode.SRC_IN);


        //应用颜色过滤器
        iv1Drawable.setColorFilter(colorFilter);
        iv2Drawable.setColorFilter(colorFilter);
    }

argbEvaluator是用来计算开始颜色和结束颜色的中间颜色的

ColorFilter是对Drawable设置一个色彩过滤器。这是一个抽象类不能直接使用,他有三个子类:ColorMatrixColorFilter, LightingColorFilter, PorterDuffColorFilter 。我们先看下描述

ColorMatrixColorFilter 一个通过4*5的颜色矩阵来改变颜色的颜色过滤器

A color filter that transforms colors through a 4x5 color matrix. This filter can be used to change the saturation of pixels, convert from YUV to RGB, etc.

LightingColorFilter 一个可以模拟简单的灯光效果的颜色过滤器

A color filter that can be used to simulate simple lighting effects. A LightingColorFilter is defined by two parameters, one used to multiply the source color (called colorMultiply) and one used to add to the source color (called colorAdd). The alpha channel is left untouched by this color filter. Given a source color RGB, the resulting R'G'B' color is computed thusly:

PorterDuffColorFilter 一个可以使用单个颜色和指定Porter-Duff模式来对源像素进行染色颜色过滤器

A color filter that can be used to tint the source pixels using a single color and a specific Porter-Duff composite mode.

我们就是需要根据位移百分比来对drawable进行颜色变化,就选用PorterDuffColorFilter(为啥说的这么简单?因为ColorMatrixColorFilter,LightingColorFilter我看的有点懵逼)

Porter-Duff模式

说明文档 ,这个没啥好的中文翻译,我看到一句:Porter-Duff 操作是 1 组 12 项用于描述数字图像合成的基本手法。用人话讲就是:2张图要放在一张画板上,这两张图需要融合在一起,融合的方法有12个,他们统称Porter-Duff。具体的融合方法请仔细看下图



我们需要保持原来图片的形状,而切换图片的颜色,选择PorterDuff.Mode.SRC_IN就可以了,如果理解不了,自己按照图片多跑几个模式就知道了。

最后将colorFilter应用到对应的drawable上.图片颜色的变换就完成啦


http://www.jianshu.com/p/b974a2c88cd9
  • 大小: 2.8 MB
  • 大小: 23.9 KB
分享到:
评论

相关推荐

    Canvas特效之Filter.zip

    在项目实践中,通常会将这些特效封装到自定义View或者Drawable中,以便在多个地方复用。同时,为了保持性能,需要注意合理使用滤镜,避免在大量动态绘制或者频繁更新的场景下使用过于复杂的滤镜效果,以免影响应用的...

    Android图像处理技术(实现Android中的PS)(五)

    在Android中,通常使用BitmapFactory.decodeXXX系列方法从资源、文件或流中加载Bitmap。为了优化内存使用,可以使用BitmapFactory.Options对象设置解码参数,如缩放比例和格式。 三、图像裁剪与旋转 Bitmap提供了...

    相册-滤镜描边.rar

    图片滤镜在Android中可以通过多种方式实现,其中最常用的是使用`BitmapShader`和`PorterDuffColorFilter`。`BitmapShader`可将Bitmap应用为Shader,改变图片的渲染效果。而`PorterDuffColorFilter`则可以改变图像的...

    Android遮罩层高亮显示

    在项目中,"透明指示层_高亮"这个文件很可能是包含了高亮形状的图片资源,可能是一个PNG或者XML矢量图。如果是PNG,你可以在ImageView中加载它,并根据需要调整位置和大小;如果是XML矢量图,你可以使用...

    pm_java_

    开发者可能使用ColorMatrixColorFilter或者PorterDuffColorFilter来实现颜色的变化效果。 “改变屏幕的亮度”涉及到Android系统的电源管理和DisplayManager服务。开发者可以通过Settings.System类来读取和修改设备...

    Android源码——常用图片特效处理源码.zip

    综上所述,这个压缩包可能涵盖了上述的一些或所有知识点,通过研究这些源码,开发者不仅可以了解Android图像处理的基本原理,还能学习到如何在实际项目中高效、优化地实现图片特效。对于提升Android应用的用户体验和...

    Android中实现蒙板效果的代码实现

    本教程将深入讲解如何在Android中使用Bitmap进行位图操作,以实现一个具有蒙板效果的类进度条程序。 首先,我们需要了解Bitmap对象在Android中的基本用法。Bitmap是Android系统中处理图像的主要类,它提供了对像素...

    安卓Android源码——屏幕颜色的变换源码.zip

    1. **颜色过滤器**:在Android中,可以使用颜色过滤器(ColorFilter)来改变View或Bitmap的颜色。它可以通过多种方式创建,如MatrixColorFilter、PorterDuffColorFilter等。源码中可能包含了如何设置和应用颜色过滤...

    Android 防ios毛玻璃效果

    在Android开发中,"防iOS毛玻璃效果"通常是指避免或模仿iOS系统中的"模糊效果",也称为"毛玻璃效果"(Blur Effect)。这种效果在iOS中常见于背景视图,...在实际项目中,应根据目标用户群和应用的风格选择合适的方法。

    android常用图片特效处理.zip

    在Android开发中,图片特效处理是一项重要的技能,它涉及到用户界面的美观度和用户体验的提升。这个"android常用图片特效...在实际项目中,开发者可以根据需求选择合适的技术,结合第三方库,高效地实现各种图片特效。

    Android-轻松从你的代码改变vectordrawables的颜色

    对于Vector Drawables,你可以通过设置`app:tint`属性在XML布局中或在代码中使用`setTint()`方法来改变颜色: ```xml android:src="@drawable/your_vector_drawable" android:tint="@color/your_color" /&gt; ```...

    Android自定义进度条样式

    在"myViewdemo"这个项目中,我们可以找到具体的代码实现。开发者可能已经创建了一个自定义View类,覆盖了onDraw()方法,用以绘制无锯齿的进度条,并且可能已经使用了颜色过滤或自定义Drawable来改变进度条的颜色。...

    android之Paint

    "customviewdemo"可能是一个包含自定义View的示例项目,开发者可能在此项目中展示了如何使用`Paint`进行图形绘制。通常,这样的项目会包含自定义的View类,其中`onDraw()`方法利用`Paint`对象进行各种图形的绘制,...

    安卓进度条loadingprogress相关-这是一款android进度条自定义的控件用到了混合模式进度条覆盖到文字的时候覆盖到哪里哪里变成白色.rar

    在Android中,我们可以通过Canvas对象的drawARGB()方法或者PorterDuffColorFilter来实现混合模式。这个自定义控件可能利用了这些技术,使进度条在移动时改变其下方文字的颜色。 其次,Android中的自定义控件通常...

    Android 图片阴影效果和影子效果.zip

    这个项目源码提供了关于如何在Android中添加这些效果的实例。以下是一些关键知识点: 1. **LayerDrawable**: Android中的`LayerDrawable`允许你将多个`Drawable`对象叠加在一起,可以用来创建具有阴影效果的图片。...

    imageHandle.rar

    在Android中,我们可以使用多种方法来修改图像的HSB属性。一种常见的方式是使用`ColorMatrix`类。这个类允许我们创建一个5x4的矩阵,通过矩阵运算改变颜色的各个属性。例如,要改变图像的色调,我们可以调整色相分量...

    cOLORfILTER_dELEGATE.RAR_android

    1. **JNI注册**:在Java类中使用 `@Override` 注解的方法,这些方法会在JNI初始化时自动注册。 2. **JNI头文件生成**:使用 `javah` 工具或Android Studio的Gradle插件自动生成C/C++头文件,其中包含了Java方法的C/...

    自定义圆形头像

    以上代码展示了如何将图片裁剪成圆形的基本思路,通过在`onDraw()`方法中先绘制一个圆形遮罩,然后将图片绘制在这个遮罩之上。通过`PorterDuff`模式,我们可以使图片仅在圆形区域内显示,从而达到裁剪效果。 除了...

    android中对颜色RGB颜色处理,实现PS效果

    - **颜色创建**:在Android中,可以使用`Color`类的静态方法`rgb()`或`argb()`来创建颜色。`rgb()`接收红、绿、蓝三个参数,`argb()`则额外包含一个透明度(Alpha)参数。 - **颜色转换**:除了RGB,Android还支持...

    android特效GaussPager高斯模糊渐变的滑动效果.rar

    在实际使用中,开发者可能需要花费时间调试和优化代码,使其能够适应特定的环境和需求。 通过理解以上关键概念和技术,开发者可以创建出独特的高斯模糊渐变滑动效果,提高Android应用的视觉吸引力和用户体验。对于...

Global site tag (gtag.js) - Google Analytics