Paint API - Penjelasan terperinci tentang Xfermode dan PorterDuff (1)


Pengenalan kepada bahagian ini:

Saya tidak tahu sama ada anda biasa dengan dua perkara ini dalam tajuk Jika anda telah melaksanakan sudut bulat atau imej bulat, saya percaya anda biasa dengan dua istilah ini. Ia bukan corak Adakah anda tidak mengingatinya untuk seketika? Tidak mengapa, adakah anda telah melihat gambar di bawah?

1.png

PS: Dikatakan di Internet: samplesandroid-XXlegacyApiDemossrccomexampleandroidapisgraphics Saya boleh menemui gambar ini - -, tetapi ia tidak ada di sana, saya tidak tahu sama ada ia adalah kerana sampel saya ialah android-22, saya hanya menemui fail Java Xfermodes.java di sini. Di sini saya akan menyiarkan secara langsung apa yang saya temui dalam talian~

Nah, bercakap mengenainya, saya percaya kebanyakan rakan saya telah melihat gambar ini membawa anda belajar sedikit. Perkara ini~, lihat kembali Tutorial pengenalan asas Android kami sebelum ini - 8.3.1 Penjelasan terperinci tentang tiga kelas alat lukisan

setXfermode(Xfermode xfermode): Tetapkan grafik Kaedah pemprosesan untuk bertindih, seperti penggabungan, persilangan atau kesatuan, Selalunya digunakan untuk mencipta kesan pemadam!

Kami sampai ke dokumen rasmi: Xfermode, dan kami dapati dia mempunyai tiga anak lelaki:

2.png

Dalam bahagian ini kita akan belajar tentang dua anak lelaki pertamanya ~


Anak sulung: AvoidXfermode

Nah, seperti dua subkelas MaskFilter yang dipelajari sebelum ini, ia tidak menyokong pecutan perkakasan, jadi jika ia adalah versi di atas API 14, Anda perlu mematikan pecutan perkakasan untuk mempunyai sebarang kesan! Bagaimana untuk menutup diri anda? Lihat bahagian sebelumnya~

Mari kita lihat kaedah pembinaan yang dia berikan kepada kita! Dokumen API rasmi: AvoidXfermode

3.png

mempunyai tiga parameter, mengikut urutan:

opColor: nilai heksadesimal dengan nilai warna ketelusan, seperti sebagai 0x00C4C4;

toleransi: Nilai toleransi Jika anda telah mempelajari PS, anda mungkin telah menggunakan alat tongkat ajaib, iaitu untuk menetapkan julat nilai warna yang dipilih, seperti. Toleransi ialah 0, dan anda memilih titik kecil hitam tulen Apabila toleransi dilaraskan kepada 40, julat telah berkembang ke kawasan hitam yang besar. jika Saya masih belum memahaminya, tetapi kita akan mengetahuinya kemudian apabila kita menulis kod itu!

mod: Mod AvoidXfermode, terdapat dua jenis: SASARAN dan ELAK


Mod 1 :AvoidXfermode.Mode.TARGET

Mod ini akan menentukan sama ada terdapat warna pada kanvas yang berbeza daripada nilai warna yang kita tetapkan Warnakan lapisan warna yang ditakrifkan oleh berus, dan biarkan kawasan lain tidak ternoda! Mari tulis kod untuk ditunjukkan di bawah, dan biarkan semua orang merasakannya. Nilai toleransi ini!

Contoh kod penggunaan:

Jalankan rendering:

Nah, mari kita mulakan dengan gambar asal, bahan datang daripada gank.io

4.jpg

Seterusnya, mari gunakan pemilih warna untuk mengalih keluar warna di suatu tempat di dinding, dan kemudian tulis Paparan ringkas!

PS: Anda perlu menambah pada nod aplikasi dalam AndroidManifest.xml untuk mematikan pecutan perkakasan: android:hardwareAccelerated="false"

/**
 * Created by Jay on 2015/10/22 0022.
 */
public class AvoidXfermodeView1 extends View {

    private Paint mPaint;
    private Bitmap mBitmap;
    private AvoidXfermode avoidXfermode;

    public AvoidXfermodeView1(Context context) {
        super(context);
        init();
    }

    public AvoidXfermodeView1(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public AvoidXfermodeView1(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  //抗锯齿
        avoidXfermode = new AvoidXfermode(0XFFCCD1D4, 0, AvoidXfermode.Mode.TARGET);
        mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.iv_meizi);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBitmap, 50, 50, mPaint);
        mPaint.setARGB(255, 222, 83, 71);
        mPaint.setXfermode(avoidXfermode);
        canvas.drawRect(50, 50, 690, 1010, mPaint);
    }
}

The kesan selepas berlari:

5.png

Tengok timbunan makcik-makcik kat dinding ni memang besar sangat nilai toleransi kita ni mengubahnya. Pakaian putih gadis itu bertukar menjadi merah auntie!

Kami menukar struktur AvoidXfermode di atas kepada:

avoidXfermode = new AvoidXfermode(0XFFD9E5F3, 25, AvoidXfermode.Mode.TARGET);

Kemudian, pakaian putih pada gadis itu bertukar menjadi merah auntie...6.jpg, penuh rasa bersalah... .

7.png


Mod 2: AvoidXfermode.Mode.AVOID

Bertentangan dengan mod TARGET di atas, warna ditukar hanya apabila warna adalah sama , di sini warna berbeza tetapi warna berubah. Nilai toleransi juga membawa hasil yang bertentangan Apabila nilai toleransi adalah 0, hanya apabila nilai warna piksel dalam gambar adalah berbeza sepenuhnya daripada nilai warna yang ditetapkan Ia akan dicelup apabila nilai toleransi mencapai nilai maksimum 255, dan ia akan dicelup jika warnanya sedikit berbeza! Kita hanya perlu mengubah suai contoh di atas Perkara yang sama ialah mengubah suai kandungan membina AvoidXfermode! Kami menukarnya kepada ayat berikut:

avoidXfermode = new AvoidXfermode(0XFFD9E5F3,230, AvoidXfermode.Mode.AVOID);

Menjalankan rendering :

8.png


Anak kedua: PixelXorXfermode< .

Analisis parameter:

hanyalah nilai warna heksadesimal dengan nilai telus Bagi peranan nilai ini, terdapat algoritma: PixelXorXfermode beroperasi secara dalaman mengikut algoritma XOR " opColor ^ src ^ dst ". Dapatkan nilai warna legap (alfa = 255) dan tetapkan pada imej! Okay, saya mencari ini dalam talian Saya tidak tahu butirannya, jadi saya akan menulis contoh untuk mencuba kesannya~

Contoh kod9.png:

Running effect diagram

:

10.png

Kod pelaksanaan:

/**
 * Created by Jay on 2015/10/22 0022.
 */
public class PixelXorXfermodeView1 extends View{

    private Paint mPaint;
    private Bitmap mBitmap;
    private PixelXorXfermode pixelxorXfermode;

    public PixelXorXfermodeView1(Context context) {
        super(context);
        init();

    }

    public PixelXorXfermodeView1(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public PixelXorXfermodeView1(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  //抗锯齿
        pixelxorXfermode = new PixelXorXfermode(0XFFD9E5F3);
        mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.iv_meizi);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBitmap, 50, 50, mPaint);
        mPaint.setARGB(255, 222, 83, 71);
        mPaint.setXfermode(pixelxorXfermode);
        canvas.drawRect(50, 50, 690, 1010, mPaint);
    }

}

Muat turun kod sampel dalam bahagian ini:

XfermodeDemo. zip


Ringkasan bahagian ini:

Baiklah, saya penuh rasa bersalah, seorang gadis yang sangat cantik, tetapi akhirnya menulis demo untuk saya seperti ini, jangan Salahkan saya, 11.gif Baiklah, saya terlupa untuk menyatakan bahawa anak sulung dan anak kedua Xfermode telah meninggal dunia (tamat tempoh dalam versi selepas API 16,). Ia telah tamat tempoh, yang bermaksud bahagian ini tidak berguna...

Tidak boleh dikatakan bahawa Apache telah dikebiri dalam versi selepas 4.4, tetapi sesetengah orang masih menggunakan HttpClient, atau Rangka kerja permintaan HTTP yang ditulis oleh perpustakaan ini ~ Sudah tentu, pada dasarnya terdapat sangat sedikit orang seperti itu! Tetapi tidak ada salahnya untuk belajar lebih banyak, bukan? Anak lelaki ketiga dalam bahagian seterusnya, PorterDuffXfermode, adalah abadi dan sangat penting, jangan risau, ia tidak akan merosakkan foto lagi. Baiklah, itu sahaja, terima kasih~