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

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);

Related

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

How to enable drawing with in the bitmap on canvas android

This is my requirement in my project,I am developing an application in android on canvas.The canvas covers the entire screen,I am drawing a bitmap on the canvas depends upon the aspect ration with the canvas.How to make restrict drawing outside of bitmap,Could any one help in this.
Your onTouch should look something like this, yes?
public boolean onTouch(View v, MotionEvent event) {
x = (int) event.getRawX();
y = (int) event.getRawY();
/* other code */
}
Well, what you can do is restrict the onTouch method from doing anything when X and Y are not on the bitmap.
onTouch also returns a boolean if an onTouch has "really" consumed an event. In this case, you want to return true when the X, Y values are on the bitmap, but false when X, Y values are off the bitmap.
Also, if you want the event to act like they are lifting their finger up when they are off the bitmap, you can even call onTouch again passing in an event like:
this.onTouch(v, MotionEvent.ACTION_UP);
I hope this helps!

Determining where someone touches on an image

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());
}
});

Android images and buttons

What should I use if I want to have buttons on an image? I mean, being able to click on certain points of an image and see some info.
What if I want to display text on that points? Imagine I am having a map of my neighbor for example, and I want some info to be displayed (for example my home). And if someone press on my home he could see further details, like my name, my phone and so on. The image(aka the map) will be stable, it wont change, like a background.
You'll have to implement the method onTouch from the interface OnTouchListener. For example:
OnTouchListener listener = new OnTouchListener() {
#Override
public false onTouch(View v, MotionEvent event) {
if(!event.getAction() == MotionEvent.ACTION_DOWN)
return false; //If the touch event was not putting the finger down on the screen, return false(Actions may be move, up, and so on)
final float x = event.getX();
final float y = event.getY();
if(x and y are in some range)
doFirstThing();
else if(x and y are in another range..)
doSecondThing();
//... and so on...
//In the end, you must return a boolean saying whether you "consumed" the event - if you handled the event or not.
}
}
And don't forget to set the listener as the OnTouchListener for your ImageView!
imageView.setOnTouchListener(listener);
I believe for what you are trying to achieve you don't need to use buttons. Instead, create a custom view, in your onDraw method draw the images and handle the onTouch events as Jong suggested. Once you detected a click on your home for example, you could create another view with info about it and display it to user.
For info on how to create custom view you may refer to this queestion for example. Google around for it

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