2014-12-19 190 views
0

我必须在屏幕上绘制圆圈并通过OnTouch方法获得交互。请帮助我。这是我尝试过的代码。这里的问题是,它不与用户交互intract但是这个代码成功绘制圆形在画布上绘制交互圆圈

public class DrawingView extends View implements OnTouchListener { 

    static int x, y, r = 255, g = 255, b = 255; 
    final static int radius = 30; 
    Paint paint; // using this ,we can draw on canvas 

    public DrawingView(Context context) { 
     super(context); 
     paint = new Paint(); 
     paint.setAntiAlias(true); // for smooth rendering 
     paint.setARGB(255, r, g, b); // setting the paint color 

     // to make it focusable so that it will receive touch events properly 
     setFocusable(true); 

     // adding touch listener to this view 
     this.setOnTouchListener(this); 
    } 

    // overriding the View's onDraw(..) method 
    public void onDraw(Canvas canvas) { 
     paint.setARGB(255, r, g, b); 

     super.onDraw(canvas); 
     // drawing the circle 

     canvas.drawCircle(x, y, radius, paint); 
     randColor(); // calls this method to generate a color before drawing 
     invalidate(); // calls onDraw method 

    } 

    // this is the interface method of "OnTouchListener" 
    public boolean onTouch(View view, MotionEvent event) { 
     x = (int) event.getX() - (radius/2); // some math logic to plot the 
               // circle in exact touch place 
     y = (int) event.getY() - (radius/2); 
     // System.out.println("X,Y:"+"x"+","+y); //see this output in "LogCat" 
     randColor(); // calls this method to generate a color before drawing 
     invalidate(); // calls onDraw method 
     return true; 
    } 

    // this method sets a random color using Math.random() 
    // Note: RGB color values ranges from 0 to 255.. 
    public void randColor() { 
     r = (int) (Math.random() * 255); 
     g = (int) (Math.random() * 255); 
     b = (int) (Math.random() * 255); 
     // Toast.makeText(c, "r,g,b="+r+","+g+","+b,Toast.LENGTH_SHORT).show(); 
    } 
} 

但问题是,它并没有得到用户的交互

+0

它,它制定出来的? – 2014-12-19 07:56:35

回答

0

动作只需使用此画圈子

public class Circle extends View { 
private final float x; 
    private final float y; 
    private final int r; 
    private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 

public Circle(Context context, float x, float y, int r) { 
    super(context); 
    mPaint.setColor(0xFFFF0000);     
    this.x = x; 
    this.y = y; 
    this.r = r; 
} 
@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawCircle(x, y, r, mPaint); 
} 

互动MainActivity类别是这里

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.circle); 
    FrameLayout main = (FrameLayout) findViewById(R.id.main_view); 
    main.addView(new Circle(this, 50, 50, 25)); 

    main.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent e) { 
      float x = e.getX(); 
      float y = e.getY(); 
      FrameLayout flView = (FrameLayout) v; 
      flView.addView(new Circle(flView.getContext(), x, y, 5)); 
      return true; 
     } 
    }); 
} 
0

至少几个问题:

您实际上没有测试过触摸x/y落在圆的半径内。您需要一个if子句。现在每次触摸都会调用invalidate()

事件顺序错误,某些操作被调用的次数太多。就在这里面ondDraw应该工作:

super.onDraw(canvas); 
paint.setARGB(255, r, g, b); // (and you don't need this in the method above) 
canvas.drawCircle(x, y, radius, paint); 
0

删除invalidate()onDraw()方法,并在onTouch()获得随机颜色。

您需要在每次触摸动作,触摸位置(或触摸位置)中使用不同的颜色,或者想要更改颜色,然后检查event.getAction()==MotionEvent.ACTION_DOWN中的动作。

0

删除onDraw()方法invalidate(),因为当你在invalidatingonDraw()它会调用onDraw Recursivly,并在onTouch()获得随机颜色。

你想不同的颜色在每一个触摸动作,将在onTouch()随机颜色的方法,或基于触摸下要更改的颜色,然后检查从event.getAction()==MotionEvent.ACTION_DOWN.