2011-05-15 78 views
0

我正在創建一個自定義視圖,該視圖將具有一個位圖,以便用戶可以在其中繪製底部的一些常規Android按鈕以供用戶進行交互。Android:使用按鈕實現自定義視圖

大小我的位圖(畫圖區高度應爲50%),我重寫

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int parentHeight = MeasureSpec.getSize(heightMeasureSpec); 
    this.setMeasuredDimension(widthMeasureSpec, (int)(parentHeight * 0.50)); 
super.onMeasure(widthMeasureSpec, (int)(parentHeight * 0.50)); 
} 

這讓我異常 「java.lang.IllegalArgumentException異常:寬度和高度必須> 0」

如果我設置super.onMeasure(widthMeasureSpec,heightMeasureSpec); 我無法在底部看到我的按鈕位置。

如果我不寫super.onMeasure()我繪製的任何東西,我沒有看到一旦我釋放鼠標。

我使用佈局的xml文件:

<view class="com.my.CustomView" android:id="@+id/myView" 
    android:layout_width="fill_parent" android:layout_height="wrap_content"/> 
<LinearLayout android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:orientation="horizontal"> 
    <Button android:layout_height="wrap_content" 
     android:text="B1" android:layout_width="wrap_content"/> 
    <Button android:layout_height="wrap_content" 
     android:layout_width="wrap_content" android:text="B2"/> 
</LinearLayout> 

還有什麼應該怎麼辦?

回答

1

在dp中給您的自定義視圖尺寸並不容易。然後您可以在設計模式下看到您的佈局。然後使用onSizeChanged來找出畫布的大小。

onMeasure通常使用時畫布的大小取決於運行時的值,如遊戲或加載的項等

這裏的數目的結果是,工作的例子:

@Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
     super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
     int parentWidth = MeasureSpec.getSize(widthMeasureSpec);  
     int parentHeight = MeasureSpec.getSize(heightMeasureSpec);  
     int newH = (int) (parentHeight/1.5f); 
     this.setMeasuredDimension(parentWidth, newH); 
    } 

還爲您定製vuew必須包含屬性構造方法設置:

public CustomView(Context context, AttributeSet attrs) {  
    super(context, attrs); 
} 
+0

這工作!謝謝 ! – ABC 2011-05-15 17:05:13

1

onMeasure()是不完整的,它應該考慮到還是模式(UNSPECIFIED,EXACTLY,AT_MOST)。 Docs表示,onMeasure()可能會多次調用,即使是未知的0-0大小,也可以查看視圖的大小。請參閱View,部分佈局。沒有必要撥打super.onMeasure()

我不明白,如果你的自定義視圖僅包括或你膨脹的按鈕太它(我的猜測是第一種情況)繪圖區域,但是儘量層次瀏覽器,它會幫助你理解如何佈置觀點(因此在某些情況下您會看到圖畫,有時甚至沒有)。