creating a random circle that can be clicked on like a button

坚强是说给别人听的谎言 提交于 2019-12-31 06:42:05

问题


so here is my predicament i cannot seem to find this anywhere on the internet. My question is simple. I am creating a game app for android. The game will generate random circles on the screen that a user can click on then once the user does click on one of these random circles an action will occur. This is just like the function of the button, but different because the whole circle will be able to be clicked. i will post the random number generator that generates the circles this is not the main class this is a seperate class that extends view.

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(getWidth()-radius/2) + radius/2f);
int randomHeight = (random.nextInt((int) (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);
        int xOfRedCircle = if(redColor == lastColor){

        };
        int yOfRedCircle = if(redColor == lastColor){

        };
        int xOfGreenCircle = if(greenColor == lastColor){

        };
        int yOfGreenCircle = 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;

    }


}

}

tell me if this can even be done or if im going to have to completely change my code thank you here is my main class if that helps any this is the only other code i have so here it is please disregard the comments i was trying to learn this on my own and horribly failed each time

public class Main extends Activity {
    DrawingView v;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);


        LinearLayout layout1 = new LinearLayout (this);
        FrameLayout game = new FrameLayout(this);
        DrawingView v = new DrawingView (this);

        TextView myText = new TextView(this);

        //int w = getResources().getInteger(DrawingView.redColor);
        //Button redCircle = (Button) findViewById(w);



         //redCircle.setWidth(300);
         //redCircle.setText("Start Game");


        layout1.addView(myText);
       // layout1.addView(redCircle); 
        //redCircle.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        //game.addView(myText);
        game.addView(v);
        game.addView(layout1);
        setContentView(game);
        //redCircle.setOnClickListener((OnClickListener) this);
    }
    public void onClick(View v) {
        Intent intent = new Intent(this, Main.class);
            startActivity(intent);

        // re-starts this activity from game-view. add this.finish(); to remove from stack
   }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

i get these errors now in the log cat

03-31 01:48:52.594: E/AndroidRuntime(2395): FATAL EXCEPTION: main
03-31 01:48:52.594: E/AndroidRuntime(2395): Process: com.Tripps.thesimplegame, PID: 2395
03-31 01:48:52.594: E/AndroidRuntime(2395): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Tripps.thesimplegame/com.Tripps.thesimplegame.Main}: java.lang.IllegalArgumentException: n <= 0: -115
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.ActivityThread.access$800(ActivityThread.java:144)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.os.Handler.dispatchMessage(Handler.java:102)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.os.Looper.loop(Looper.java:135)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.ActivityThread.main(ActivityThread.java:5221)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at java.lang.reflect.Method.invoke(Native Method)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at java.lang.reflect.Method.invoke(Method.java:372)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
03-31 01:48:52.594: E/AndroidRuntime(2395): Caused by: java.lang.IllegalArgumentException: n <= 0: -115
03-31 01:48:52.594: E/AndroidRuntime(2395):     at java.util.Random.nextInt(Random.java:182)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at com.Tripps.thesimplegame.DrawingView.<init>(DrawingView.java:37)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at com.Tripps.thesimplegame.Main.onCreate(Main.java:30)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.Activity.performCreate(Activity.java:5933)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
03-31 01:48:52.594: E/AndroidRuntime(2395):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
03-31 01:48:52.594: E/AndroidRuntime(2395):     ... 10 more

回答1:


from what i've understood you are trying to make circles that you are drawing randomly clickable by the user, well this is pretty easy actually first you have to save the random position of the new circle in an integer variable then make a condition that will be controlled through an onToutchEvent

@Override
    public boolean onTouchEvent (MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN : 
                xPos = event.getX();
                yPos = event.getY();
                invalidate(); 
                break;
        }

        return true;

    }



回答2:


Conceptually, you do not have a difficult problem. You are drawing a circle on a screen. You want to know if the user "touched" it.

You need to capture the touch event (i.e. "onTouchEvent") and then get the X,Y coordinates of the event. It looks like you know where the circle is on the screen, which has a center and radius. You just need to determine if the touch event occurred within the circle.

The only odd thing here is that usually when an object is "touched" it processes the touch event. In your case, you have a drawing inside the container that is an indicator to the user of what will "process" the event. And you have to do the calculation to determine if the event was successful.

This is a high-level explanation because you have asked a fairly high level question. You need to post more code and ask more specific questions to get a lower level answer at this point.

EDIT:

You've modified your code to include your onTouchEvent - that tells you where the user touched the screen. You need to do the math in that function to determine if the touch event occurred "inside" the circle.

Since you have the location and radius of the circle, you should be able to use algebra to determine the border (like you know the center, so you can see if the touch event occurred with an X,Y position that is inside the radius)

First, think in quadrants. Is the touch event X value greater than or less than the center X. And then the same with the Y axis. Then determine if the touch event occurred inside the radius by calculating the greatest/least X value and Y value in that quadrant.

That should help ... sorry it wasn't sooner.

EDIT 2:

Radius is the distance from the center - so, if you know the center, then you can determine the radius. To determine if the X.Y of the touch event is "inside" the radius, then calculate the Y value from the X, and the X value from the Y...

In other words, you should know that r = sqrt(x^2 + y^2) right? So, if the center of the circle is at (XX, YY) then remember that MAX(X value) = XX + r and MIN(X value) = XX - r (accounting for the edge of the screen).

So, if Ye (Y value of the event) is greater than YY-r but less than YY+r, then it could be within the radius of the circle. You can check the X values to see if they are also within the circle...

Is that enough guidance? I'm trying to help you understand - but this is a very complex (yet "basic") concept. If you can get this, then a lot of other things will become more intuitive..



来源:https://stackoverflow.com/questions/29361612/creating-a-random-circle-that-can-be-clicked-on-like-a-button

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!