我有一個xml佈局,有3個輸入框和一個'生成'按鈕。 當用戶放在那裏的值我想畫一個三角形下面它Android根據用戶輸入創建一個三角形
我知道如何創建一個新的視圖,並去它,但我不知道如何繪製它在同一視圖因爲我正在使用xml視圖。
下面是我想要做的截圖。 謝謝
http://i.stack.imgur.com/9oBJV.png
我有一個xml佈局,有3個輸入框和一個'生成'按鈕。 當用戶放在那裏的值我想畫一個三角形下面它Android根據用戶輸入創建一個三角形
我知道如何創建一個新的視圖,並去它,但我不知道如何繪製它在同一視圖因爲我正在使用xml視圖。
下面是我想要做的截圖。 謝謝
http://i.stack.imgur.com/9oBJV.png
您可以創建自定義視圖類。
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.
請注意,這不是複製/粘貼代碼。你需要適應它,但它應該給你一個良好的開端。祝你好運。
謝謝。這對我來說是一個很好的開始。當你有頂點B和C時,你的意思是那三個邊長?如果是的話,如果它不是一個正確的三角形並且第二個長度以一個角度結束,會發生什麼? – Shmuel
好,我現在已經完成了課程。如何將它添加到gui文本視圖下?亨利說:「把你的自定義視圖放到按鈕下方的佈局中。」我該怎麼做......我現在有點迷路了。謝謝 – Shmuel
我用最簡單的方法繪製了一個直角三角形的示例,但您現在已經掌握了基本知識。一個小三角將給你你所需要的任何三角形。網上有很多樣本。要在佈局XML中添加視圖,只需使用完全限定的類名稱(package.class),例如com.david.myapp.triangle,請參閱http://jeffreysambells.com/2010/10/28/custom-views-and-layouts-in-android-os-sdk – Simon
只要把你的自定義視圖到下面的按鈕佈局。要使用的確切xml取決於頂級視圖容器的類型(可能是RelativeLayout
)。
要讓它首先隱形,您可以將其可見性設置爲INVISIBLE
。當它應該出現設置爲VISIBLE
的可見性。
我是一個總共noob在這。你能否給我一個這個XML片斷的例子?謝謝 – Shmuel
您應該創建一個自定義的'View'類。這個文檔將引導你= http://developer.android.com/training/custom-views/custom-drawing.html(然而,你必須知道在笛卡爾系統中繪製一個三角形的數學) –