2013-08-17 85 views
0

我剛開始學習如何製作自定義視圖。我在屏幕底部創建了一個drawable,並在其中創建了一個小圓圈。佈局工作得很好,但有一個小問題,不同分辨率的drawable被裁剪掉。它在S3中的工作很好,但在其他設備中,情況有所不同。 enter image description here在android中的自定義視圖

enter image description here

這裏是我的代碼:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 


    int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
      MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY); 
    int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
      MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.EXACTLY); 


    setMeasuredDimension(childWidthMeasureSpec,childHeightMeasureSpec); 


} 


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

    Drawable outer_ring = getResources().getDrawable(R.drawable.outer_ring); 

    System.out.println("Height now is : "+(canvas.getHeight())); 

    Rect r1 = new Rect(); 
    r1.top = (canvas.getHeight()-outer_ring.getIntrinsicHeight()); 
    r1.bottom = canvas.getHeight(); 
    r1.left = (canvas.getWidth()-outer_ring.getIntrinsicWidth())/2; 
    r1.right = canvas.getWidth()/2 +outer_ring.getIntrinsicWidth()/2; 

    outer_ring.setBounds(r1); 
    outer_ring.draw(canvas); 

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    paint.setColor(Color.BLACK); 
    paint.setStyle(Style.STROKE); 
    paint.setStrokeWidth(10.0f); 

    canvas.drawCircle(canvas.getWidth()/2, ((canvas.getHeight()-outer_ring.getIntrinsicHeight()/2)), 20, paint); 
} 

應該是什麼,這種觀點出現在所有分辨率

這裏同樣的解決辦法是我的佈局:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 



    <com.example.testing.CustomMenu 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myView" 
     /> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:text="Button" /> 

</RelativeLayout> 
+0

您可以登錄兩個設備上r1.bottom值?它們與設備的高度相同嗎? –

+0

雅我做到了。在S3中它小於設備高度:1134然後是實際的1280.在其他設備的分辨率爲480×854其顯示確切的值 – baloo

+0

你可以把你的完整的onDraw(),有缺少的部分 –

回答

2

Edi t

原來,爲onDraw提供的畫布尺寸不能保證與View的實際瀏覽尺寸相同。它只是保證足夠大。在你的情況下,它太大了!

根據this question and answer,關鍵是要使用onSizeChanged返回的尺寸作爲View的當前顯示尺寸的確定。因此,您應該保留onSizeChanged的尺寸,並在onDraw中使用它們來了解您應該繪製的實際尺寸。 ,:

  • childWidthMeasureSpecchildHeightMeasureSpec應該成爲其在onSizeChanged設置類變量。
  • onDraw中,分別使用它們代替canvas.getWidth()canvas.getHeight()

雖然這種行爲乍看起來有點奇怪,它允許Android的降低分揀出尺寸時,它使得畫布重新分配的數量:如果View收縮了一下(與外觀。 )它所做的只是告訴所有有關人員,實際大小稍微小一些,而不是通過畫布發佈和重新創建循環。

可能不那麼重要,在您的java代碼中,您請求您繪製的View的尺寸。在xml中,您將這些尺寸設置爲wrap_content。這意味着沒有明確的設置View的大小。像這樣的視圖應該請求它的最大尺寸,並確定它希望得到多大,並將其設置爲它的大小。通過將CustomMenu的尺寸設置爲match_patent來確保尺寸是固定的,以便它們固定。

但是,如果沒有那個,父母View給了你一些界限。看起來這些界限可能會或可能不會考慮頂部欄,這很公平。

+0

感謝您的時間和解決方案。這真的很有幫助,解決了我的問題。你投入的所有努力終於成果豐碩。 – baloo

0

嘗試使用this.getHeight()而不是canvas.getHeight()this.getWidth()而不是canvas.getWidth()

this涉及View

+0

我也會嘗試你的selotion,但看到Neils的評論和解決方案。這解決了我的問題 – baloo