3つの入力ボックスと「生成」ボタンがあるxmlレイアウトがあります。ユーザーがそこに値を入力したら、その下に三角形を描きたいと思います
新しいビューを作成してそこに移動する方法は知っていますが、xmlビューで作業しているため、同じビューに描画する方法がわかりません。
以下は私がやりたいことのスクリーンショットです。ありがとうございました
3つの入力ボックスと「生成」ボタンがあるxmlレイアウトがあります。ユーザーがそこに値を入力したら、その下に三角形を描きたいと思います
新しいビューを作成してそこに移動する方法は知っていますが、xmlビューで作業しているため、同じビューに描画する方法がわかりません。
以下は私がやりたいことのスクリーンショットです。ありがとうございました
カスタムビュークラスを作成できます。
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()を呼び出す必要があります。aとbのみを使用していますが、3つの側面すべてを追加しました。必要に応じてcを削除できます。
これはコードのコピー/貼り付けではないことに注意してください。あなたはそれを適応させる必要があるでしょう、しかしそれはあなたに有利なスタートを与えるはずです。幸運を。
ボタンの下のレイアウトにカスタムビューを配置するだけです。使用する正確なxmlは、トップレベルのビューコンテナのタイプ(おそらくはRelativeLayout
)によって異なります。
最初に非表示にするには、可視性をに設定できますINVISIBLE
。表示されるタイミングをに設定しVISIBLE
ます。