2016-10-18 63 views
0

我有一個文件layers.xml中的某一層列表:Android的:如何在層列表中更改GradientDrawable的大小編程

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:id="@+id/outer_rect"> 
    <shape android:shape="rectangle"> 
     <stroke 
       android:width="3dp" 
       android:color="@color/gray4"/> 
     <solid android:color="@color/white"/> 
    </shape> 
</item> 
<item android:top="10dp" android:bottom="10dp" android:left="10dp" android:right="10dp" 
     android:drawable="@drawable/dot_pattern_bitmap"/> 
</layer-list> 

這是在自定義的FrameLayout customView.xml使用:

<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:src="@drawable/layers"/> 
</merge> 

它本身被用於例如在

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="@dimen/space_m" 
    android:orientation="vertical"> 

<my.namespace.customView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

</FrameLayout> 

此外,我有CustomView.java類來編輯自定義視圖(特別是圖層)的行爲。

在那裏,我試圖根據customView的大小(和參數'ratio')實現層列表大小的更新。我試過這樣:

// ... 
@Override 
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    layoutWidth = MeasureSpec.getSize(widthMeasureSpec); 
    layoutHeight = MeasureSpec.getSize(heightMeasureSpec); 

    readjustSize(ratio); 
} 

private void readjustSize(final double ratio) { 
    if (layoutHeight != 0 && layoutWidth != 0) { 
     // determine desired width and height using the layout width 
     int desiredWidth = layoutWidth; 
     int desiredHeight = (int) (layoutWidth/ratio); 

     // if it does not fit, adjust using the layout height 
     if (desiredHeight > layoutHeight) { 
      desiredHeight = layoutHeight; 
      desiredWidth = (int) (layoutHeight * ratio); 
     } 

     // get the basic layer 
     final LayerDrawable ld = 
      (LayerDrawable) ContextCompat.getDrawable(getContext(), R.layers); 
     final GradientDrawable outerRectShape = 
      (GradientDrawable) ld.findDrawableByLayerId(R.id.outer_rect); 

     // and adapt the size 
     outerRectShape.setSize(desiredWidth, desiredHeight); 
     outerRectShape.setBounds(0, 0, desiredWidth, desiredHeight); 

     // redraw 
     invalidate(); 
     requestLayout(); 
    } 
} 

所以,那是很多代碼...不幸的是,這不能正常工作。如果第一次加載框架佈局,我只能看到一個非常小的矩形。

是否有人有想法:

只有當我來回切換這個觀點,因爲我想規模應用?

+0

將ImageView設置爲match_parent的寬度。 –

+0

ImageView本身的寬度上有match_parent。包含視圖不會,但我已經嘗試了寬度和高度的match_parent,僅限寬度或沒有(如發佈)。這沒有任何改變。 – Caro

+0

在FrameLayout中,它是wrap_content。 –

回答

0

最後,我自己找到了答案。 :) 其實,它很簡單。當我掌握可繪製的圖層

final LayerDrawable ld = 
    (LayerDrawable) ContextCompat.getDrawable(getContext(), R.layers); 

我只是獲取資源的一般,而不是我的具體src圖像可繪製。當我在CustomView初始化適應代碼

final View root = inflate(getContext(), R.layout.custom_view, this); 
final ImageView imageView = (ImageView) root.findViewById(R.id.layers); 
final LayerDrawable ld = (LayerDrawable) imageView.getDrawable(); 

,並給予ImageView的id爲「層」,它的工作如預期。

此外,我不得不改變在onMeasure的調用方法的順序:

@Override 
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { 
    layoutWidth = MeasureSpec.getSize(widthMeasureSpec); 
    layoutHeight = MeasureSpec.getSize(heightMeasureSpec); 

    readjustSize(ratio); 

    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 

編輯:這隻適用於Android的版本> = 6.0。對於舊版本,我仍然遇到與問題中所述相同的問題。

相關問題