2016-04-11 22 views
0

Ich schreibe ein Programm, das einen Kreis an einem zufälligen Ort auf dem Telefonbildschirm zeichnet. Was es tun soll, ist, wenn der Kreis berührt wird, entfernt er diesen Kreis und verschiebt ihn an einen anderen zufälligen Ort.Android: Kreis bewegt sich an zufällige Position, wenn Sie darauf tippen

Wenn der Bildschirm angetippt wird, wird der alte Kreis entfernt und an einer anderen zufälligen Position auf dem Bildschirm neu gezeichnet. Es ist sehr nah, aber ich habe mich gefragt, wie ich über diese Hürde komme.

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


    // draws circle 
    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     mPaint.setStyle(Paint.Style.FILL); 
     mPaint.setColor(Color.RED); 
     canvas.drawCircle(x, y, r, mPaint); 
    } 

    // constructors 
    public Circle(Context context) { 
     super(context); 
     init(); 
    } 

    public Circle(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public Circle(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    void init() { 
     // might be used later for some data collection 
    } 


    // gets random number,, 
    void generateRandom() { 

     int w = getWidth() - r - 50; 
     int h = getHeight()- r - 50; 

     int border = r + 50; 

     this.x = border + random.nextInt(w-border); 
     this.y = border + random.nextInt(h-border); 
    } 



    // when screen is tapped, old circle removed, new circle drawn 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     generateRandom(); 
     invalidate(); 
     return super.onTouchEvent(event); 
    } 
} 

Antwort

1

Ändern Sie den Code wie folgt,

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (isInsideCircle(event.getX(), event.getY())) { 
      generateRandom(); 
      invalidate(); 
     } 
     return super.onTouchEvent(event); 
    } 


    boolean isInsideCircle(float xPoint, float yPoint) { 
     float dx = (x - xPoint); 
     float dxPow = (float) Math.pow(dx, 2); 
     float dy = (y - yPoint); 
     float dyPow = (float) Math.pow(dy, 2); 
     float radPow = (float) Math.pow(r, 2); 
     return (dxPow + dyPow) < radPow || (dxPow + dyPow == radPow); 
    }