2013-08-06 12 views
0

我需要在按下按钮后进入“createCircles”方法的另一个项目。因为我从这个ArrayList中通过画布画圆圈。所以我做了以下。但是当它运行时,所以当你按下按钮时什么都不会发生。我的问题是,如果它正确地注册我的附加项目到框中。在程序过程中在ArrayList中添加项目

public class krouzky extends View { 
    final Paint mMalovani; 
    ArrayList<Circle> mCircles; 

    private boolean KontrolerVykreslovani = true; 

    public krouzky(Context context, AttributeSet atrs) { 
     super(context, atrs); 

     mMalovani = new Paint(); 
     mMalovani.setColor(Color.RED); 
     mMalovani.setAntiAlias(true); 

     createCircles(); 

    } 

    private void createCircles() { 
     mCircles = new ArrayList<Circle>(); 
     mCircles.add(new Circle(120, 30, 7)); 

    } 

    public void Pridani_kruhu() { 
     Button btn2 = (Button) findViewById(R.id.button3); 
     btn2.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       createCircles(v); 
      } 
     }); 
    }  

    private void createCircles(View v) { 
     mCircles.add(new Circle(120, 30, 15)); 
    } 

如果有程序开始前增加一个项目,一个方法是这样的,所以他按照计划绘制了两个圆圈。

private void createCircles() { 
    mCircles = new ArrayList<Circle>(); 
    mCircles.add(new Circle(120, 30, 7)); 
    mCircles.add(new Circle(130, 30, 12)); 
} 

谢谢您的建议

完整actvivity在这里。

public class krouzky extends View { 

final Paint mMalovani; 


ArrayList<Circle> mCircles; 

private boolean KontrolerVykreslovani = true; 

public krouzky(Context context, AttributeSet atrs) { 
    super(context, atrs); 

    mMalovani = new Paint(); 
    mMalovani.setColor(Color.RED); 
    mMalovani.setAntiAlias(true); 

    createCircles(); 
} 

private void createCircles() { 
    mCircles = new ArrayList<Circle>(); 

    mCircles.add(new Circle(120, 30, 7)); 
} 



public void Pridani_kruhu() { 

    Button btn2 = (Button) findViewById(R.id.button3); 

    btn2.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      createCircles(v); 
     } 
    }); 
    }   

private void createCircles(View v) {  
    mCircles.add(new Circle(120, 30, 15)); 
} 


public void draw(Canvas canvas) { 
    // pokud je mDrawinEnabled "true" tak udělá ..... 
    if (KontrolerVykreslovani) { 
     //přiřazení hodnot do proměnných width a height 
     final int width = canvas.getWidth(); 
     final int height = canvas.getHeight(); 

     kresleníKruhu(canvas); 



     invalidate(); 
    } 
} 

public boolean onTouchEvent(MotionEvent event) { 

    float x = event.getX(); 
    float y = event.getY(); 

    Circle cr = findCircleClosestToTouchEvent(x, y); 



    float dtcr = euclidDist(cr.getCurrentX(), cr.getCurrentY(), x, y); 

     handleTouchedCircle(event, cr); 

    return true; 
} 

private void kresleníKruhu(Canvas canvas) { 
    for (Circle c : mCircles) { 

     canvas.drawCircle(c.getCurrentX(), c.getCurrentY(), c.getRadius(), 
       mMalovani); 
    } 
} 



private static float euclidDist(float x1, float y1, float x2, float y2) { 
    return android.util.FloatMath.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) 
      * (y2 - y1)); 
} 


private Circle findCircleClosestToTouchEvent(float x, float y) { 

    Circle c = mCircles.get(0); 

    float dist = euclidDist(c.getCurrentX(), c.getCurrentY(), x, y);   
    float tempdist = 0; 
    for (Circle cr : mCircles) { 
     tempdist = euclidDist(cr.getCurrentX(), cr.getCurrentY(), x, y); 
     if (tempdist < dist) { 
      c = cr; 
      dist = tempdist; 
     } 
    } 
    return c; 
} 

private void handleTouchedCircle(MotionEvent me, Circle c) { 

    final float me_x = me.getX(); 
    final float me_y = me.getY(); 
    final int action = me.getAction(); 

    switch (action) { 
    case MotionEvent.ACTION_DOWN: 
     c.setActionDownX(c.getCurrentX()); 
     c.setActionDownY(c.getCurrentY()); 
     c.setActionMoveOffsetX(me_x); 
     c.setActionMoveOffsetY(me_y); 
     break; 
    case MotionEvent.ACTION_MOVE: 
    case MotionEvent.ACTION_UP: 
     c.setCurrentX(c.getActionDownX() + me_x - c.getActionMoveOffsetX()); 
     c.setCurrentY(c.getActionDownY() + me_y - c.getActionMoveOffsetY()); 
     break; 
    case MotionEvent.ACTION_CANCEL: 
     c.restoreStartPosition(); 
     break; 
    } 
} 


final void MuzemeVykreslovat() { KontrolerVykreslovani = true; } 

final void NemuzemeVykreslovat() { KontrolerVykreslovani = false; } 

}

+2

您正在向ArrayList正确添加。但是,您将视图传递给createCircles(),但您无需执行任何操作。此外,您不会向我们展示View是什么。在某些时候,你必须画圆圈。我没有看到你实际上在任何地方画圆圈。你有这个Paint对象,但似乎没有使用它。我认为你需要发布更多信息。 –

回答

0
private void createCircles() { 
    mCircles = new ArrayList<Circle>(); 

    mCircles.add(new Circle(120, 30, 7)); 
} 

这将创建的叫法,写什么圈子里拥有一个新的ArrayList<Circle>每次。如果您的意思是实例化ArrayList而不是擦除它,请尝试以下操作:

private void createCircles(){mCircles == null} {mCircles = new ArrayList(); }

mCircles.add(new Circle(120, 30, 7)); 

}

这应该实例ArrayList中时,它仅是空的。

此外,如果您通过查看此GUI的GUI来测试此功能,则圆圈可能会堆叠。这意味着它可能会让这些圈子很好,但同时也不会显示它们,因为它们都具有(120, 30, 7)的属性。考虑将它们随机放置,或者设置具有不同属性的不同位置,以便您知道它们不是堆叠。

+0

我是这样做的,但结果是一样的。每个圈子都应该可见,因为所有圈子都是可移动的。 –

+0

你在JPanel中的按钮还是你正在绘制的任何东西?另外,你测试了你的Button的功能吗? http://stackoverflow.com/questions/7300135/java-action-listener那里有更多我习惯的类型的ActionListener,但是你可能会使用我不熟悉的东西(它已经有一段时间了我做了非J2EE GUI工作) – sparks

+0

是的,我的按钮是确定的。我用吐司文本进行了测试。 (请注意您的提示) –

相关问题