试图获取屏幕上绘制的每个随机圆的x,y坐标

时间:2015-04-01 05:18:29

标签: java android math button canvas

您好我制作的游戏将在屏幕上创建随机圆圈。随机创建的圆将具有红色或绿色值。我的问题是,我希望不仅可以确定用户何时点击其中一个圈子,还可以确定他们最终点击的圈子(红色或绿色)。这是我的代码如下。我的主要问题是试图找到将要绘制的圆的x和y

public class DrawingView extends View {



    public DrawingView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub

    }
    RectF rectf = new RectF(0, 0, 200, 0);

    private static final int w = 100;
    public static int lastColor = Color.BLACK;
    private final Random random = new Random();
    private final Paint paint = new Paint();
    private final int radius = 230;
    private final Handler handler = new Handler();
    public static int redColor = Color.RED;
    public static int greenColor = Color.GREEN;
    int randomWidth =(int) (random.nextInt(Math.abs(getWidth()-radius/2)) + radius/2f);
    int randomHeight = (random.nextInt((int) Math.abs((getHeight()-radius/2 + radius/2f))));


    private final Runnable updateCircle = new Runnable() {
        @Override 
        public void run() {
            lastColor = random.nextInt(2) == 1 ? redColor : greenColor;
            paint.setColor(lastColor);
            invalidate();
            handler.postDelayed(this, 1000);

        }
    };



    @Override 
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        handler.post(updateCircle);
    }

    @Override 
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        handler.removeCallbacks(updateCircle);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // your other stuff here

        canvas.drawCircle(randomWidth, randomHeight + radius/2f, radius, paint);
    }



    @Override
    public boolean onTouchEvent (MotionEvent event) {

        double r = Math.sqrt(((randomWidth^2)+(randomHeight^2)));
        int maxX = (int) (((randomWidth)*(randomWidth)) + r);
        int minX = (int) ((((randomWidth)*(randomWidth))) - r);
        int maxY = (int) (((randomHeight)*(randomHeight)) + r);
        int minY = (int) ((((randomHeight)*(randomHeight))) - r);

        public int xCoordinateOfRedColor(){
            if(redColor == lastColor){
                if(randomWidth > maxX && < minX){
                    event.getX();
                }
            };
        }
        public int yCoordinateOfRedColor(){
            if(redColor == lastColor){
                if(randomHeight > maxY && < minY){
                    event.getX();
                }
            };
        }
        if(redColor == lastColor){
            if(randomHeight > maxY && < minY){
                event.getY();
            }
        };
        if(greenColor == lastColor){

        };
        if(greenColor == lastColor){

        };

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN : 
                randomWidth = (int) event.getX();
                randomHeight = (int) event.getY();

                invalidate(); 
                break;
            case MotionEvent.ACTION_POINTER_UP :


                break;
        }

        return true;

    }


}

我不知道我是近亲还是真的很远。

2 个答案:

答案 0 :(得分:3)

有很多方法可以解决这类问题。你可以疯狂地试图将它们全部列出来。最强大的一个是在创建时为每个形状指定一种独特的颜色。使用该颜色来查找形状。换句话说......

当他们点击这个时:

enter image description here

从中采样颜色:

enter image description here

将这些独特颜色的hashmap保存到形状对象引用中。让所有形状在您从未放在屏幕上的隐藏位图上绘制其独特的颜色。当用户单击时,在隐藏位图上的x y处查找颜色。通过hashmap运行该颜色,并且您可以引用它们单击的形状。现在,您不必担心重叠甚至使用不同于圆形的形状。这不仅为您提供了形状的x和y,还提供了有关该形状的所有信息。

当然要做到这一点,你必须为形状制作自己的类。为了便于说明,我将独特的颜色制作得非常独特。实际上你可以只增加一个int。这可以通过构造函数递增,也可以更好地使用工厂方法注入它。

这足够强大,即使在渲染3D时也能正常工作。只需保持可见和隐藏的位图同步即可。由于您只是重复使用相同的渲染代码,因此结果很简单。循环每个形状,让它在你手上的位图上涂上它独特的颜色。只要没有可以改变颜色的其他效果(阴影,光照,光线追踪),就可以工作。一定要关掉它们。

顺便说一句,我不这么认为:

if(randomHeight > maxY && < minY){

做你认为它做的事。当我想测试某些东西介于两个值之间时,我使用:

if(minY <= randomHeight && randomHeight <= maxY){

因为它让我想起数学上的不等式,如3≤x≤15。

答案 1 :(得分:0)

我不确定我是否解决了您的问题,但是如何保留所绘制的圆圈列表(最后在列表的开头绘制)以及当用户点击某处时您遍历列表并每次检查点是否点击在屏幕上属于这个圈子?第一次发生这种情况将对应于包含点击点的最后一个圆圈。