4

我正在爲棒棒糖和以前的版本開發Android應用程序。CardView cardUseCompatPadding

我正在使用CardView(此cardView沒有任何孩子,它只是放置在我的視圖後面)來創建陰影。

但是,當它運行在前棒棒糖設備上時會出現問題。

所以我將cardUseCompatPadding設置爲true。我想知道如果我能得到這個compat填充的價值?

有什麼地方可以找到對該值的引用嗎?

回答

3

添加到CardView中的compat填充取決於您設置的角的高程和半徑。您可以在支持庫的RoundRectDrawableWithShadow類中找到實際計算。

您可以使用像在運行時計算的話:

float elevation = cardView.getMaxCardElevation(); 
    float radius = cardView.getRadius(); 
    double cos45 = Math.cos(Math.toRadians(45)); 

    int horizontalPadding = (int) (elevation + (1 - cos45) * radius); 
    int verticalPadding = (int) (elevation * 1.5 + (1 - cos45) * radius); 
+0

當仰角爲0且半徑爲0時,我不認爲這一定是正確的。當這兩個屬性都設置爲'0dp'時仍然會設置一些非零填充,所以此公式不會'在這種情況下不會受阻。建議? – w3bshark

-1

更新的向後兼容最大CardView提升。

如果設備操作系統版本是棒棒糖,或者 newer和getUseCompatPadding()爲false,則調用此方法不起作用。 使用此代碼

android:elevation="3dp"app:elevation="3dp"您cardview

CardView使用棒棒糖上海拔財產陰影和下降 回的舊平臺的自定義仿真陰影實施。

由於圓角切割的昂貴特性,在棒棒糖之前的平臺 上,CardView不會裁剪其與圓角相交的 的子項。相反,它會添加填充以避免這種交集(請參閱setPreventCornerOverlap(布爾值)以更改此行爲) 。

在棒棒糖之前,CardView將填充添加到其內容並將 陰影繪製到該區域。此填充量等於maxCardElevation +(1 - cos45)* cornerRadius的兩側和maxCardElevation * 1.5 +(1 - cos45)* cornerRadius的頂部和底部。

由於填充用於抵消陰影的內容,因此無法在CardView上設置 填充。相反,您可以使用XML中的內容填充屬性 或代碼中的setContentPadding(int,int,int,int)在CardView的邊緣和CardView的子節點之間設置 填充。

需要注意的是,如果你的CardView指定精確尺寸,因爲陰影 ,其內容區域將棒棒糖前和後棒棒糖平臺 不同。通過使用特定版本的 資源值,可以避免這些更改。或者,如果你想讓CardView在平臺上添加內部填充棒棒糖,以及 之後,你可以調用setUseCompatPadding(boolean)並傳遞true。

要以向下兼容的方式更改CardView的仰角,請使用 setCardElevation(float)。 CardView將使用Lollipop 和Lollipop之前的高程API,它將更改陰影大小。爲了避免移動 ,影子大小變化時,影子大小被 getMaxCardElevation()限制。如果要動態更改高程,則應在初始化CardView 時調用setMaxCardElevation(float)。