Determining where someone touches on an image - android

This is a basic question that leads into others down the line.
I am looking at expanding my app to have a image of a target (3 circles) and I want the user to be able to touch on the target image where they hit. Then the app determines where the user clicked.
Not progressed down this line of development yet and do not know where the best place to start / learn. Has anyone got any tips / websites / examples that I can be pointed at to get the ball rolling
Thanks
UPDATED
What I am trying to do and I have no knowledge on where to start
Draw a target on a canvas, 3 circles
draw a cross depending where the user clicks on the target
record a score depending on which circle the user clicked in
thanks

You can use an OnTouchListener on your View. That will give you touch events and pass you the coordinates where the finger was at inside of a MotionEvent
Something like this ought to work:
img.setOnTouchListener(new OnTouchListener() {
public void onTouch(View v, MotionEvent me){
Log.i("TAG", "x: " + me.getX() + " y: " + me.getY());
}
});

Related

How to find touch area for android devices?

Im trying to find touch area for android screen like how much area is covered by any finger,i know about event.getSize() method but its always gives me 0 output and pointerIndex is also 0. how can i find touch area for all android devices as further i also need to calculate touch pressure?
TRY THIS
final View view= findViewById(R.id.view);
view.setOnTouchListener(new View.OnTouchListener() {
#Override
public boolean onTouch(View v, MotionEvent event) {
Toast.makeText(context, "\"Touch coordinates : \" +\n" +
" String.valueOf(event.getX()) + \"x\" + String.valueOf(event.getY()", Toast.LENGTH_SHORT).show();
return true;
}
});
For your question regarding touch pressure. MotionEvent().getPressure(i) should return a value between 0 and 1 based on the "pressure" placed on the screen. In reality for capacitive screens it is the size of the capacitive object rather than literal pressure, but the concept is almost the same for fingers (fingers are squishy). Ranges higher than one may be returned depending on the calibration of the touchscreen.
If your screen is only returning 0 or 1, try testing on another device. Perhaps your screens driver simply does not return those values.Below link can be helpful for you
https://developer.android.com/reference/android/view/MotionEvent.html#getPressure(int)
http://android-er.blogspot.com/2014/05/get-touch-pressure.html

Android How to detect swipe between two touch points on image view

I have an Imageview with different number of touch points on them. It basically an app which is detecting the swipe between 2 touch points and not allowing the user to swipe any other point or in or out of other direction. It should constrict user to just swipe between two touch points.
Just take a look at following picture:
Now the user should start swiping from point 1 to point 2. if the swipe is not started from starting point 1, it should not color the path between point 1 and point 2.
But if the user successfully swipe between the point 1 and point 2 now swipe between point 2 to 3 should be enabled. Thus user should go through Point 1 to 2, Point 2 to 3 , Point 3 to 4 , point 4 to point 5 to complete round 1.
Please tell me how to achieve this functionality . I know about gestures, gesture overlay etc but none of them fits to my condition as they uses general touch events and gesture directions.
Please suggest me the way to achieve this and keep in mind I want to make this app to be able to run on all type of devices , so I can simply give the hard coded x,y values.
Edit : on Demand
I am posting the link of the app on play store who has same functionality , But I do not know How they are achieving this functionality .
https://play.google.com/store/apps/details?id=al.trigonom.writeletters
If each touch point can be created as individual views(e.g. ImageView), then you can create an inViewInBounds() function.
I used code from here to create code where I needed to detect finger press movement over multiple imageViews:
Rect outRect = new Rect();
int[] location = new int[2];
//Determine if a touch movement is currently over a given view.
private boolean inViewInBounds(View view, int x, int y){
view.getDrawingRect(outRect);
view.getLocationOnScreen(location);
outRect.offset(location[0], location[1]);
return outRect.contains(x, y);
}
To use this function, on a parent view to all those child touch points, set the Click and Touch Listeners:
//This might look redundant but is actually required: "The empty OnClickListener is required to keep OnTouchListener active until ACTION_UP"
parentView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {}
});
//All the work gets done in this function:
parentView.setOnTouchListener(new View.OnTouchListener() {
#Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int)event.getRawX();
int y = (int)event.getRawY();
// ** myTouchPoint might be an array that you loop through here...
if ( inViewInBounds(myTouchPoint, x, y) ) doLogic(myTouchPoint);
return false;
}
});
The code above only shows detecting when one of your views are 'touched'.
if none are 'touched' but a view is 'active' (e.g. When a touch is detected, set a variable like: viewLastTouched = myTouchPoint) then you would call something like drawingLine(viewLastTouched, x, y) function - for whatever it needed to do to draw the line and/or detect boundaries etc.
They are not using android native java code to build this app.
The app is running with this code
import Runtime.MMFRuntime;
public class Main extends MMFRuntime {
}
This in turn is from https://github.com/ClickteamLLC/android/blob/master/docs/index.md
This is used to package apps / games written using - http://www.clickteam.com/clickteam-fusion-2-5

What is the use of MotionEvent.offsetLocation and how it works

i am working on google map. in which i want to perform some click operation on button available on info window. but we can't perform click directly on info window. so i got the link in which we can perform the click on info window. but i am not able to understand how things are happening on this example. and i am not able to understand the how
MotionEvent copyEv = MotionEvent.obtain(ev);
copyEv.offsetLocation(-point.x + (infoWindow.getWidth() / 2),
-point.y + infoWindow.getHeight() + offPXL);
is woking. please any one help me. thanks in advance.
//this line obtains a copy of the MotionEvent that is happening on the screen
MotionEvent copyEv = MotionEvent.obtain(ev);
/*this line transposes the main motionEvent
to the infoWindow's dimensions
It does this by adding an offset to the original motionEvent data
but it saves it into the copy of the MotionEvent
The algorithm is pretty self explanatory but whatever, here we go:
It subtracts the X coordinate of the point of the MotionEvent
from the infoWindow width which is firstly divided by 2,
and it does the same for the y coordinate
*/
copyEv.offsetLocation(-point.x + (infoWindow.getWidth() / 2),
-point.y + infoWindow.getHeight() + offPXL);

Andengine with Trial Effect

Currently I am developing a game using andengine. In my game I have to bring trial effect which follows finger like fruit ninja. I have tried Rendering with BaseGameActivity and LayoutGameActivity with xml file.
But while combining opengl Rendering with andengine RendererSurfaceView it shows some delay as well as sprite in RendererSurfaceView doesn't listen to the onAreaTouched().
I am in confusion. could you please help in what manner I have to bring Trial Effect like Fruit Ninja in my game?
Well, I'm not sure if I totally understand, but I may be able to start you off...
In your BaseGameActivity's onCreateScene method, after you create your scene, set a touch listener. In your listener check if it's a move event, so you can get the x and y coordinates.
scene.setOnSceneTouchListener(new IOnSceneTouchListener() {
#Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
if (pSceneTouchEvent.isActionMove()) {
Log.d(App.LOG_TAG, "x: " + pSceneTouchEvent.getX() + " y: " + pSceneTouchEvent.getY());
return true;
}
return false;
}
});
You'll need to keep track of the coordinates and probably do a smoothing algorithm on them, then draw some graphic over that path.
I created something similar a while ago [wasn't intended but somehow I made it] but I kind of lost the code so I'll just explain the process to you
To create a trial effect all what you have to do is use particle systems and attach it on touch , move it with the finger [change it's location when isActionMove()] and detach [or have it fade out first so you get nice effect] it on isActionUp()
I used this process to create a flame effect that follows your finger, the rest is up to you and how you mess around with the particle emitter to make the particles appear as a slash

how to know the coordinates of image when touch

How to get image coordinates at mouse hover position.
Please let me know
Thank you
Quoted from the "android-porting" mailing list (end of August 2010):
Android currently doesn't support mouse input, so has no concept of mouse hover.
You set an onTouchListener for the image, and in the onTouch event, you can pull the x,y coordinates out of the MotionEvent. getX and getY will get you the x and y coordinates in relation to the image, and getRawX and getRawY will get the x,y coordinates of the screen.
public boolean onTouch(View arg0, MotionEvent arg1) {
System.out.println("X: "+arg1.getX());
System.out.println("Y: "+arg1.getY());
System.out.println("Raw X: "+arg1.getRawX());
System.out.println("Raw Y: "+arg1.getRawY());
return true;
}
As stakx said, Android doesn't support the mouse. However, if you are referring to the image that currently has focus, try this:
Image focusedImg = getViewById(R.id.YourMainLayout).findFocus();
int[] relativeToParentPixels = { focusedImg.getLeft(), focusedImg.getTop(),
focusedImg.getRight(), focusedImg.getBottom() };
Now you'll have the boundary positions of the image in an array.
Try this
http://developer.android.com/reference/android/view/View.OnHoverListener.html
Available from api 14.

Categories

Resources