Android根据用户输入创建三角形

时间:2013-01-01 18:43:31

标签: android

我有一个xml布局,有3个输入框和一个'生成'按钮。 当用户输入值时,我想在其下面画一个三角形

我知道如何创建一个新视图并转到它,但我不知道如何在同一个视图上绘制它,因为我正在使用xml视图。

下面是我想要做的截图。 谢谢

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

2 个答案:

答案 0 :(得分: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);

     } 

}

请注意,我已对原点(左下角 - 直角)进行了硬编码,并且只绘制了两条边,因为斜边是由闭合路径绘制的(这可以节省任何额外的数学运算)。您将需要使用onMeasure并根据需要缩放三角形。像这样:

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

你的活动应该检查3个值是否确实代表了直角三角形的边,然后调用setSides()。虽然我们只使用a和b,但我添加了所有3个边。如果您愿意,可以删除c。

请注意,这不是复制/粘贴代码。你需要调整它,但它应该给你一个良好的开端。祝你好运。

答案 1 :(得分:0)

只需将自定义视图放入按钮下方的布局中即可。要使用的确切xml取决于顶级视图容器的类型(可能是RelativeLayout)。

首先,要使其不可见,您可以将其可见性设置为INVISIBLE。应该出现时,将可见性设置为VISIBLE