1. 程式人生 > >Andorid-Tint使用與原理解析

Andorid-Tint使用與原理解析

Android Tint使用

Tint 屬性

  Tint 是 Android5.0 引入的一個屬性,它可以在Android5.0 系統上,對檢視進行顏色渲染。 
下面是網上一個使用tint屬性給背景調整不同顏色的例子:

 <LinearLayout  
        android:orientation="horizontal"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_gravity="center_horizontal">  
        <ImageView  
            ...  
            android:src="@drawable/xamarin_white"  
            android:background="@drawable/mycircle"/>  
        <ImageView  
            ...  
            android:src="@drawable/xamarin_white"  
            android:background="@drawable/mycircle"  
            android:tint="#2C3E50"/>  
        <ImageView  
            ...  
            android:src="@drawable/xamarin_white"  
            android:background="@drawable/mycircle"  
            android:tint="#B4BCBC"/>  
    </LinearLayout>  

效果圖: 
此處輸入圖片的描述

  tint這個屬性,是ImageView有的,它可以給ImageView的src設定,除了tint 之外,還有backgroundTint,foregroundTint,drawableTint,它們分別對應對背景、前景、drawable進行著色處理。 如果,我們給上面的例子設定 backgroundTint,那麼藍色背景就會被著色,替換成你設定的顏色。

原理

  在5.0以上,View類中增加了對tint屬性的獲取

  case R.styleable.View_backgroundTint:
                    // This will get applied later during setBackground().
                    if (mBackgroundTint == null) {
                        mBackgroundTint = new TintInfo();
                    }
                    mBackgroundTint.mTintList = a.getColorStateList(
                            R.styleable.View_backgroundTint);
                    mBackgroundTint.mHasTintList = true;
                    break;
case R.styleable.View_backgroundTintMode:
    // This will get applied later during setBackground().
    if (mBackgroundTint == null) {
        mBackgroundTint = new TintInfo();
    }
    mBackgroundTint.mTintMode = Drawable.parseTintMode(a.getInt(
            R.styleable.View_backgroundTintMode, -1), null);
    mBackgroundTint.mHasTintMode = true;
    break;

以具體的 ImageView 為例

//在建構函式中呼叫了這個方法
private void applyImageTint() {
        if (mDrawable != null && (mHasDrawableTint || mHasDrawableTintMode)) {
            mDrawable = mDrawable.mutate();

            if (mHasDrawableTint) {
                mDrawable.setTintList(mDrawableTintList);
            }

            if (mHasDrawableTintMode) {
                mDrawable.setTintMode(mDrawableTintMode);
            }

            // The drawable (or one of its children) may not have been
            // stateful before applying the tint, so let's try again.
            if (mDrawable.isStateful()) {
                mDrawable.setState(getDrawableState());
            }
        }

setTintList 方法的實現

public void setTintList(ColorStateList tint) {
        mBitmapState.mTint = tint;
        mTintFilter = updateTintFilter(mTintFilter, tint, mBitmapState.mTintMode);
        invalidateSelf();
    }

當追蹤到 updateTintFilter()這個方法的時候,我們就無法繼續向下追蹤了,不過研究引數也可以得出它實現的方式(PorterDuffColorFilter,BitmapDrawable.BitmapState,PorterDuff.Mode), 很明顯,還是利用的PorterDuff那些相關類來實現的操作,ProterDuff 網上也有很多說明的例子,最重要的還是下圖: 有關這些Mode的詳細解釋,大家自行查閱 
此處輸入圖片的描述

版本問題

Tint在預設只在Android5.0以上的系統生效,為了向下支援,系統提供了相應的Compact類,包括 
AppCompatTextView、AppCompatImageView等。我們使用 ViewCompat.setBackgroundTintMode 在懂嗎中動態的為 View 進行tint 操作,觀察 這些Compat類發現都實現了 TintableBackgroundView 這個介面,如果需要讓自定義的 View實現tint功能,我們可以仿照系統的實現類來實現。

/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.support.v4.view;

import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
import android.support.annotation.Nullable;

/**
 * Interface which allows a {@link android.view.View} to receive background tinting calls from
 * {@code ViewCompat} when running on API v20 devices or lower.
 */
public interface TintableBackgroundView {

    /**
     * Applies a tint to the background drawable. Does not modify the current tint
     * mode, which is {@link PorterDuff.Mode#SRC_IN} by default.
     * <p>
     * Subsequent calls to {@code View.setBackground(Drawable)} will automatically
     * mutate the drawable and apply the specified tint and tint mode.
     *
     * @param tint the tint to apply, may be {@code null} to clear tint
     *
     * @see #getSupportBackgroundTintList()
     */
    void setSupportBackgroundTintList(@Nullable ColorStateList tint);

    /**
     * Return the tint applied to the background drawable, if specified.
     *
     * @return the tint applied to the background drawable
     */
    @Nullable
    ColorStateList getSupportBackgroundTintList();

    /**
     * Specifies the blending mode used to apply the tint specified by
     * {@link #setSupportBackgroundTintList(ColorStateList)}} to the background
     * drawable. The default mode is {@link PorterDuff.Mode#SRC_IN}.
     *
     * @param tintMode the blending mode used to apply the tint, may be
     *                 {@code null} to clear tint
     * @see #getSupportBackgroundTintMode()
     */
    void setSupportBackgroundTintMode(@Nullable PorterDuff.Mode tintMode);

    /**
     * Return the blending mode used to apply the tint to the background
     * drawable, if specified.
     *
     * @return the blending mode used to apply the tint to the background
     *         drawable
     */
    @Nullable
    PorterDuff.Mode getSupportBackgroundTintMode();
}

相關推薦

Andorid-Tint使用原理解析

Android Tint使用 Tint 屬性   Tint 是 Android5.0 引入的一個屬性,它可以在Android5.0 系統上,對檢視進行顏色渲染。  下面是網上一個使用tint屬性給背景調整不同顏色的例子: <LinearLayout

【數據壓縮】JPEG標準原理解析

round 高頻 切割 基於 大小 image 生成 p s pan 轉載請註明出處:http://blog.csdn.net/luoshixian099/article/details/50392230 CSDN-勿在浮沙築高臺 為了滿足不同應用的需求,J

《RockeMQ實戰原理解析》 學習筆記

第一章 1.1 訊息佇列的功能介紹 1.1.1 應用解耦 1.1.2 流量消峰 大部分應用系統在高峰時間段流量會猛增, 這個時候如果沒有緩衝機制,不可能短時間內承受住大流量的衝擊。利用訊息佇列,把大量的請求快取起來,分散到相對長的一個時間段內處理,能大大提高系統的穩定性和使用

讀KVM虛擬化技術實戰原理解析

1、軟體虛擬化和硬體虛擬化:實現虛擬化的重要一步在於:虛擬化層必須能夠截獲計算元件對物理資源的直接訪問,並將其重定向到虛擬資源池中。硬體虛擬化,就是物理平臺本身提供了對特殊指令的截獲和重定向的硬體支援 2、準虛擬化與全虛擬化:改動客戶作業系統,使他以為自己執行在虛擬環境下,能夠與虛擬機器監控

RocketMQ 實戰原理解析

內容簡介 本書由雲棲社群官方出品。 本書作者是阿里資深資料專家,對 RocketMQ 有深入的研究,並有大量的實踐經驗。在寫這本書之前,作者不僅系統、深入地閱讀了 RocketMQ 的原始碼,而且還向 RocketMQ 的官方開發團隊深入瞭解了它的諸多設計細節。作者結合自己多年使用 Rocket

PHP 底層的執行機制原理解析(轉載)

我的另一篇文章:PHP底層工作原理  兩篇結合起來看,會更加好理解。 由於本人資料結構方面知識,淺薄,後面的尚未研究 關於 hash table ,這有個文章可以學習:HashTable原理和底層實現 關於 zval 可以研讀這個:入理解PHP7核心之zval  

分享《Flask Web開發實戰:入門、進階原理解析》PDF+源代碼

1.0 baidu rip 更多 aid size log fff web 下載:https://pan.baidu.com/s/1gbC5uhh_vjVbDk55_p7SOA 更多資料分享:http://blog.51cto.com/3215120 《Flask Web開

《Flask Web開發實戰:入門、進階原理解析》PDF+原始碼

下載:https://pan.baidu.com/s/1gbC5uhh_vjVbDk55_p7SOA 更多資料分享:http://blog.51cto.com/3215120 《Flask Web開發實戰:入門、進階與原理解析》PDF,帶目錄書籤,文字可以複製貼上;配套原始碼。 一本面向Python程式

iOS KVO crash 自修復技術實現原理解析

摘要: 【前言】KVO API設計非常不合理,於是有很多的KVO三方庫,比如 KVOController 用更優的API來規避這些crash,但是侵入性比較大,必須編碼規範來約束所有人都要使用該方式。有沒有什麼更優雅,無感知的接入方式?KVO crash 自修復

List詳細用法原理解析

List是Collection介面的子介面,他可以定義一個允許重複的線性集合,即允許存放相同的元素,但是存放的位置不同。與collection不同的是,List新增了列表迭代器ListInterator。 與Collection介面相比,List介面新增瞭如下方法: a

KVM虛擬化技術實戰原理解析——讀書筆記

入門級書籍——一種KVM,Qemu的使用手冊 轉載請說明出處。 全書一共9章:         第1章介紹了雲端計算和虛擬化的概念,並對KVM等幾種流行的虛擬化技術做了比較;         第2章介紹了KVM的基本架構、QEMU的作用以 及Intel的硬體虛

Linux裝置驅動模組自載入示例原理解析

本文介紹Linux裝置驅動模組在設備註冊時如何實現自動載入和建立裝置節點。 在Linux系統中,基於sysfs檔案系統、裝置驅動模型和udev工具可以實現在裝置模組“冷、熱”載入時自動載入裝置對應的驅動程式,同時可以按需在/dev目錄下建立裝置節點。 本文中我搭建好環

Android Bitmap變遷原理解析(4.x-8.x)

App開發不可避免的要和圖片打交道,由於其佔用記憶體非常大,管理不當很容易導致記憶體不足,最後OOM,圖片的背後其實是Bitmap,它是Android中最能吃記憶體的物件之一,也是很多OOM的元凶,不過,在不同的Android版本中,Bitmap或多或少都存在差

《Flask Web開發實戰:入門、進階原理解析(李輝著 )》PDF+源代碼

同時 下載 第一部分 ebs 提取 項目 程序開發 圖片 bubuko 一句話評價: 這可能是市面上(包括國外出版的)你能找到最好的講Flask的書了 下載:鏈接: https://pan.baidu.com/s/1ioEfLc7Hc15jFpC-DmEYBA 提取碼:

遊戲外掛原理解析制作 - [內存數值修改類 篇一]

tle lin 篩選 分享 自己的 src 但我 以及 先來   本章旨在講解外掛實現原理,未深入涉及至代碼層面。希望能與對這方面感興趣的朋友多多交流,畢竟理論是死的,套路是固定的,只有破解經驗是花大量時間和心血積累的。 對於單機遊戲而言,遊戲中絕大部分的參數(比如血、藍

遊戲外掛原理解析制作 - [內存數值修改類 篇二]

物理內存 one 很難 byte array private src 所有 計算   本章旨在講解如何利用高級語言根據變量數值尋找內存地址。涉及代碼以C#為例。   我用C#寫了一個WinForm形式的Demo,界面如下:      源代碼: //血量初始

下載ASP.NET MVC5框架剖析案例解析(MVC5原理剖析、漏洞及運維安全、設計模式)

mvc5框架剖析與案例解析 運維安全 mvc5原理剖析 地址:http://pan.baidu.com/s/1dFhBu2d 密碼:peas轉一播放碼,200多課!本課程針對MVC5版本的ASP.NET MVC,同時涉及太多底層實現的內容,所以大部分是找不到現成參考資料的,這些內容大都來自講師對源

vue.js響應式原理解析實現

github 遞歸 val 實現 mode 最新 中比 ava 新頁面 從很久之前就已經接觸過了angularjs了,當時就已經了解到,angularjs是通過臟檢查來實現數據監測以及頁面更新渲染。之後,再接觸了vue.js,當時也一度很好奇vue.js是如何監測數據更新並

React 伺服器渲染原理解析實踐(同步更新)

第1章 伺服器端渲染基礎本章主要講解客戶端與伺服器端渲染的概念,分析客戶端渲染和伺服器端渲染的利弊,帶大家對伺服器端渲染有一個粗淺認識。 1-1 課程導學1-2 什麼是伺服器端渲染1-3 什麼是客戶端渲染1-4 React 客戶端渲染的優勢與弊端 第2章 React中的伺服器端渲染本章將藉助Node.js

vue.js響應式原理解析實現—實現v-model{{}}指令

只需要 spl foreach 形式 pen for 元素節點 目標 @param 離線瀏覽器軟件 服務器遠程連接 1、可多站同時下載、多站同時扒 2、可單頁扒 3、可自定義, 重寫JS\圖片\CSS路徑 4、執行全站下載後,會下載到本程序根目錄下的html文件夾下。