2013-01-01 52 views
0

我有一個xml佈局,有3個輸入框和一個'生成'按鈕。 當用戶放在那裏的值我想畫一個三角形下面它Android根據用戶輸入創建一個三角形

我知道如何創建一個新的視圖,並去它,但我不知道如何繪製它在同一視圖因爲我正在使用xml視圖。

下面是我想要做的截圖。 謝謝

http://i.stack.imgur.com/9oBJV.png

+0

您應該創建一個自定義的'View'類。這個文檔將引導你= http://developer.android.com/training/custom-views/custom-drawing.html(然而,你必須知道在笛卡爾系統中繪製一個三角形的數學) –

回答

1

您可以創建自定義視圖類。

class Triangle extends View { 

     private int vertexA, vertexB, vertexC; 

     public Triangle(Context ctx){ 
      this(ctx,null); 
     } 

     public Triangle(Context ctx, AttributeSet attrs){ 
      this(ctx,attrs,0); 
     } 


     public Triangle(Context ctx, AttributeSet attrs, int defStyle){ 
      super(ctx,attrs,defStyle); 
     } 


     public void setSides(int a, int b, int c){ 
      this.vertexA = a; 
      this.vertexB = b; 
      this.vertexC = c; 
      this.invalidate(); 
     } 

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

      // Try for a width based on our minimum 
      int minw = getPaddingLeft() + getPaddingRight() + getSuggestedMinimumWidth(); 
      int w = resolveSizeAndState(minw, widthMeasureSpec, 1); 

      // Whatever the width ends up being, ask for a height that would let the triangle 
     // get as big as it can 
      int minh = MeasureSpec.getSize(w) - (int)mTextWidth + getPaddingBottom() + getPaddingTop(); 
      int h = resolveSizeAndState(MeasureSpec.getSize(w) - (int)mTextWidth, heightMeasureSpec, 0); 

      setMeasuredDimension(w, h); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) { 

      super.onDraw(canvas); 

      Paint paint = new Paint(); 
      Path path = new Path(); 

      paint.setStyle(Paint.Style.FILL); 
      paint.setColor(Color.TRANSPARENT); 

      c.drawPaint(paint); 

      // start the path at the "origin" 
      path.MoveTo(10,10); // origin 
      // add a line for side A 
      path.lineTo(10,this.vertexA); 
      // add a line for side B 
      path.lineTo(this.vertexB,10); 
      // close the path to draw the hypotenuse 
      path.close(); 

      paint.setStrokeWidth(3); 
      paint.setPathEffect(null); 
      paint.setColor(Color.BLACK); 
      paint.setStyle(Paint.Style.STROKE); 

      c.drawPath(path, paint); 

    } 

} 

請注意,我已經硬編碼的原點(左下角 - 直角),只有2分畫出兩邊,因爲斜邊被關閉的路徑繪製(這樣可以節省做任何額外的數學)。你會想要玩onMeasure並根據需要縮放你的三角形。事情是這樣的:

path.lineTo(10, this.vertexA * yScale); 
path.lineTo(this.vertexB * xScale ,10); 

你的活動應該檢查3個值確實代表了一個直角三角形的兩側,然後調用setSides()。我已經添加了所有3面,雖然我們只使用a和b。如果你願意,你可以刪除C.

請注意,這不是複製/粘貼代碼。你需要適應它,但它應該給你一個良好的開端。祝你好運。

+0

謝謝。這對我來說是一個很好的開始。當你有頂點B和C時,你的意思是那三個邊長?如果是的話,如果它不是一個正確的三角形並且第二個長度以一個角度結束,會發生什麼? – Shmuel

+0

好,我現在已經完成了課程。如何將它添加到gui文本視圖下?亨利說:「把你的自定義視圖放到按鈕下方的佈局中。」我該怎麼做......我現在有點迷路了。謝謝 – Shmuel

+0

我用最簡單的方法繪製了一個直角三角形的示例,但您現在已經掌握了基本知識。一個小三角將給你你所需要的任何三角形。網上有很多樣本。要在佈局XML中添加視圖,只需使用完全限定的類名稱(package.class),例如com.david.myapp.triangle,請參閱http://jeffreysambells.com/2010/10/28/custom-views-and-layouts-in-android-os-sdk – Simon

0

只要把你的自定義視圖到下面的按鈕佈局。要使用的確切xml取決於頂級視圖容器的類型(可能是RelativeLayout)。

要讓它首先隱形,您可以將其可見性設置爲INVISIBLE。當它應該出現設置爲VISIBLE的可見性。

+0

我是一個總共noob在這。你能否給我一個這個XML片斷的例子?謝謝 – Shmuel