對Canvas和Matrix的理解

2021-06-06 14:25:36 字數 1732 閱讀 4636

我們看到的view檢視其實最終都是在canvas這個畫板上畫出來的,可以想象這個canvas有無限大,只是view元件在繪製時,即父元件呼叫dispatchdraw(canvas c)分發給各個子元件繪製時,根據子元件的大小和位置,分別呼叫canvas的translate(int dx, int dy)和cliprect(int l, int t, int r, int b)方法來設定canvas的當前原點座標和繪製的可見範圍。所以當我們在view元件通過ondraw(canvas c)方法繪製時,往往因為超過元件大小範圍而看不到繪製的一部分內容。

我們通過animation來實現view元件的動畫效果時候, 實際上是改變canvas的matrix, matrix矩陣的作用主要是對每個座標點(x, y)轉換為另外的(x', y'),必要的時候canvas還會通過cliprect()方法改變它的繪製可見範圍,這樣不至於做移動的時候看不到view元件。我們看到view的動畫效果時,其實它的大小和布局都沒有變化,所以會看到比較搞笑的現象,就是乙個button通過translate偏離原來位置後,它的touch事件響應還是在原來位置上,而不是所看到的眼前位置。

matrix的posttranslate(int dx, int dy),pretranslate(int dx, int dy)方法是設定matrix的增量,而set系列的方法是直接設值。具體如下:

matrix的posttranslate(int dx, int dy),pretranslate(int dx, int dy)的呼叫順序對座標變換的影響不一樣。抽象的說pre方法是向前"生長",post方法是向後"生長",具體拿個例子來說,比如乙個matrix呼叫了下列一系列的方法:

matrix.prescale(0.5f, 1);  matrix.pretranslate(10, 0); matrix.postscale(0.7f, 1);  matrix.posttranslate(15, 0); 則座標變換經過的4個變換過程依次是:translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0), 所以對matrix方法的呼叫順序是很重要的,不同的順序往往會產生不同的變換效果。pre方法的呼叫順序和post方法的互不影響,即以下的方法呼叫和前者在真實座標變換順序裡是一致的,matrix.postscale(0.7f, 1); matrix.prescale(0.5f, 1);  matrix.pretranslate(10, 0); matrix.posttranslate(15, 0);

從數學上來說,設對給定的物件依次進行了基本變化f1、f2、f3…..、fn,它們的變化矩陣分別為t1、t2、t3…..、tn,復合變化的矩陣t可以表示為:t = tntn-1…t1,所以preconcats matrix相當於右乘矩陣,postconcats  matrix相當於左乘矩陣。

matrix的set方法則會對先前的pre和post操作進行刷除,而後再設定它的值,比如下列的方法呼叫: matrix.prescale(0.5f, 1);  matrix.posttranslate(10, 0); matrix.setscale(1, 0.6f); matrix.postscale(0.7f, 1); matrix.pretranslate(15, 0); 其座標變換順序是translate(15, 0) -> scale(1, 0.6f) ->  scale(0.7f, 1)

canvas裡scale, translate, rotate, concat方法都是pre方法,如果要進行更多的變換可以先從canvas獲得matrix, 變換後再設定回canvas.

對Canvas和Matrix的理解

我們看到的view檢視其實最終都是在canvas這個畫板上畫出來的,可以想象這個canvas有無限大,只是view元件在繪製時,即父元件呼叫dispatchdraw canvas c 分發給各個子元件繪製時,根據子元件的大小和位置,分別呼叫canvas的translate int dx,int dy...

NumPy中ndarray和matrix的四則運算

numpy中最重要的類是ndarray,顧名思義,即多維陣列。import numpy as np行向量 a np.array 1,2,3 a.shape 3l,列向量 b np.array 1 2 3 b.shape 3l,1l 二維矩陣 m np.array 1,2,3 4,5,6 7,8,9 ...

論numpy中matrix 和 array的區別

論numpy中matrix 和 array的區別 csdn部落格 2014年03月07日 16 26 55 numpy matrices必須是2維的,但是 numpy arrays ndarrays 可以是多維的 1d,2d,3d nd matrix是array的乙個小的分支,包含於array。所以...