關於Android的徑向漸變高階程式設計的實現

2021-09-14 06:43:29 字數 1466 閱讀 6763

在midipad的文章,我說我喜歡如何呈現的乙個軟體層的徑向漸變,所以讓我們開始比較同一徑向出現時所採用的硬體和軟體層。讓我們先定義乙個簡單的自定義檢視是viewpad中midipad文章大大簡化版。

它使用相同的技術–我們建立乙個新的徑向尺寸變化時的觀點,但徑向本身是在padview使用的使用非常相似。shade***ctory的使用是一種機制,我們將使用後在不同的徑向廠替代。

class gradientview @jvmoverloads constructor(

context: context,

attrs: attributeset? = null,

defstyleattr: int = 0,

defstyleres: int = 0,

private val bounds: rectf = rectf()

) : view(context, attrs, defstyleattr, defstyleres)

private val paint: paint =

isantialias = true

style = paint.style.fill

}var shade***ctory: (width: float, height: float) -> shader =

override fun onsizechanged(newwidth: int, newheight: int, oldwidth: int, oldheight: int) =

super.onsizechanged(newwidth, newheight, oldwidth, oldheight).run

private fun adjustbounds(width: float, height: float)

override fun ondraw(canvas: canvas?)

我們現在可以建立乙個布局,其中包含4個檢視,其中兩個在乙個黑暗的背景下,兩個在乙個光的背景下。相同背景的每一對都由乙個使用硬體層渲染,乙個使用軟體層渲染:
<?xml version="1.0" encoding="utf-8"?>

使用軟體層呈現的是右邊,而這乙個看起來更適合我想要達到的目標。它褪得稍微快一點,看起來更漂亮。但是,如果我選擇使用乙個光的背景,我肯定我會選擇使用硬體層渲染的那個:

再一次,使用軟體層呈現的是右邊的乙個,現在有乙個暗暈,看起來不太好。

為了理解為什麼會出現這種差異,讓我們先退一步,了解一下硬體和軟體層實際上做了什麼。

canvas中的線性漸變和徑向漸變

var b a.getcontext 2d var grd b.createradialgradient 75,50,5,90,60,100 徑向漸變,引數值引數 描述 x0 漸變開始點的 x 座標 y0 漸變開始點的 y 座標 x1 漸變結束點的 x 座標 y1 漸變結束點的 y 座標 同上 ad...

Qt 漸變(三) 徑向漸變的定義和建構函式的詳解

不同於線性漸變,徑向漸變比較複雜,先從基礎的部分開始。徑向漸變型別 如果建構函式中 無焦點圓的半徑,那就是簡單徑向,否則就是擴充套件徑向漸變,擴充套件徑向中焦點圓的半徑可以設定為0 徑向漸變的說明 這是最基礎的說明,看的真是雲裡霧裡,配上圖就能清晰起來。徑向漸變的定義是由兩個圓組成的,所以徑向漸變也...

android 漸變蒙版 iOS關於蒙版漸變的實現

有個需求,檢視的右邊需要漸隱,如下圖 這裡只是隨便拿個介面做下測試 paste image.png 要求整個view漸漸alpha變透明,包括view上的子view,需要一起變透明。拿起鍵盤就是幹 void testalpha self.view layoutifneeded uicolor col...