2013-01-01 53 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