2013-01-23 84 views
2

我已經刪除了舊的代碼,因爲它沒有按照我的意圖工作。我試圖在屏幕的某個部分使用onDraw畫布功能,這樣我的繪圖周圍仍然可以有按鈕和其他文字。Android:定義onDraw畫布大小

***編輯* **

我已經成功,現在解決這個問題。很多建議是有幫助的,但我無法讓它與我想要的一起工作。這可能比我的錯更重要,所以感謝所有提供建議的人。以下是我解決問題的方法。

* 1。首先在佈局文件中定義一個視圖。

<view 
class="com.project.MainActivity.Drawing" 
android:id="@+id/drawing_area" 
android:layout_width="700dp" 
android:layout_height="900dp" 
android:layout_centerInParent="true"/> 

* 2。然後用下面的代碼創建一個單獨的java類文件:

public class Drawing extends View { 
Paint paint = new Paint(); 

public Drawing(Context context) { 
super(context); 
} 

public Drawing(Context context, AttributeSet attrs) { 
super(context, attrs); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
super.onDraw(canvas); 

//Draw Image Here// 

} 

* 3。然後從主要活動調用繪圖:

public class MainActivity extends Activity { 

private Drawing mDrawingArea; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.percentage_count_layout); 
    mDrawingArea = (Drawing)findViewById(R.id.drawing_area); 
} 

回答

2

在您的View類中,您需要重寫onMeasure()方法。這是你要求特定視圖大小的地方。有一些關於這個主題的官方Android教程,一旦我在我的電腦上看到鏈接,我將編輯這篇文章。

編輯:

看看這個Android article about creating custom components.。具體看一下標題爲「擴展onDraw()和onMeasure()」的部分。引用:

onMeasure()有點牽扯。 onMeasure()是您的組件與其容器之間的呈現合約的一個關鍵 容器。應有效覆蓋onMeasure(),並準確報告其包含部分的測量結果。這是 通過從母體 (其在給onMeasure()方法通過)並且由 要求限制的要求稍微更復雜的由調用setMeasuredDimension()方法與 測量的寬度和高度一旦被計算出。如果 未能通過重寫的onMeasure()方法調用此方法,則 結果將在測量時間例外。

此外在本文中:

你的組件的方法onMeasure()應計算的測定寬度和高度將被需要用於呈現組件。它 應儘量留在通過的規範之內,雖然它 可以選擇超過他們(在這種情況下,家長可以選擇要 做,包括剪裁,滾動,拋出一個異常,或詢問 的onMeasure()到再試一次,或許用不同的尺寸 規格)。

有一個CustomView示例可用作演示,但不幸的是開發人員網站已更改(更糟糕!),以至於除非通過SDK Manager下載,否則它不可用。有關更多說明,請參閱頁面here

0

您正在使用的setContentView(),這本身就意味着整個看法是全屏。如果你想要將圖像設置爲特定大小,則需要以此方式繪製圖像。

onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas) 
    //This code is for straight centering 
    //Also please do math outside of onDraw 
    //also below math is pseudocode not actual android code 
    canvas.drawBitmap(yourImageBitmap, 
     (screenSize.width/2) - yourImageBitmap.width/2, 
     (screenSize.height/2) - yourImageBitmap.height/2), 
     yourPaintObject) 

    //The above code should draw your bitmap image in the center of the canvas 

} 

也像上面和下面我回答說,如果你想改變畫布大小,那麼你需要使用onMeasure和設置這些正常。你最好的選擇是看看ImageView類的源代碼http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/widget/ImageView.java ,看看他們是怎麼做的

+0

將圖像尺寸讀取一次並將其存儲在Rect中,而不是每次onDraw調用時都是一個好主意。 – PrplRugby

+0

的確如此,那會更好。 – Raigex

+0

感謝您關注此事。你有這樣一個例子,你可以告訴我嗎?如果我刪除了setContentView,那麼沒有圖像會加載,所以我不確定如何定義大小並在沒有包含這行代碼的情況下顯示它。作爲例子的幾行代碼將非常有幫助。 – AndrewLugs

0

在Android中,像你想要做的佈局東西通常在xml中指定。這個想法是,你在xml中設置你的佈局(你的項目的res /目錄中應該有一個佈局目錄),然後將你的代碼連接到這個佈局。

看看this頁面。如果向下滾動,則會出現佈局位置,大小和填充的部分。

1

從你的描述,似乎問題是,你沒有指定你的DemoView的大小,你只是將它設置爲內容查看,這將是默認的填充父。

當您創建DemoView,或創建一個ViewGroup給它一個大小指定一些LayoutParams

你也可以定義佈局/通過XML大小,和那膨脹。 (您應該使它成爲一個單獨的類,或讓它在這種情況下,公共) EG。

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    ... 
    Specify container measurements 
    ... 
    > 
    <com.yourpackagename.MainActivity.DemoView 
    ... 
    Specify layout height/width, etc. 
    ... 
    /> 
</LinearLayout> 
+0

感謝您關注此事。你有這樣一個例子,你可以告訴我嗎?如果我刪除了setContentView,那麼沒有圖像會加載,所以我不確定如何定義大小並在沒有包含這行代碼的情況下顯示它。 – AndrewLugs

0

這是可以考慮重寫,以獲得屏幕設備的信息的方法,去每一次設備

@Override 
public void onSizeChanged (int w, int h, int oldw, int oldh) 
{ 
    super.onSizeChanged(w, h, oldw, oldh); 
    screenW = w; 
    screenH = h; 

    scaledCardW = (int) (screenW/8); //or whatever scale you need for bitmaps 
    scaledCardH = (int) (scaledCardW*1.28); 
    bitmap = // load your bitmaps 

} 
0

例如,寬度200,150的高度。在視圖中覆蓋onMeasure方法。

@Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     setMeasuredDimension(200, 150); 
    }