Emulating physical buttons / lower level touchscreen control - android

One thing I find many Android games and emulators get wrong is when the user presses multiple (on-screen) buttons simultaneously. I'm wondering how one could fix that.
Imagine a game like Super Mario World. You have two buttons on the right side (simplified): Y is for running and B is for jumping. Typically, you hold Y most of the time with the tip of your thumb, and when you want to jump you lay down your thumb and press B, too.
Situations like this understandably confuse Android. Instead of detecting two presses, it just moves the one from the Y button down a bit.
What I'd need to fix this is one of the following:
Raw touch data as a bitmap (but probably too computationally expensive, and doesn't leave the touchscreen anyway)
The detected touch points in more detail, e.g. as best-fit ellipses or polygons
The ability to define touch regions. If a finger overlaps such a region a certain amount, the region fires.
(The points are from low- to high level, e.g. if I had the first I could emulate the other ones.)
Any ideas?

Related

Android Game Development - Custom map leading to different activities

I'd like to create a custom map. It should be or look like one picture, but according to the part of which the user clicks, it should move the user to a different location (i.e. start a different activity). I've seen it done in several games but I don't know how to do it myself.
The part of the picture should have non-geometrical borders (obviously it would be easily done with many square images). Sadly, I don't even know what term describes what I want to do so I wasn't able to find any helpful tutorials or discussed topics.
Example:
Picture: http://i236.photobucket.com/albums/ff40/iathen/mapEx.png
If the user touches the purple slide, (s)he should be leaded to activity_1
If the user touches the blue slide, (s)he should be leaded to activity_2
If the user touches the green slide, (s)he should be leaded to activity_3
In my experience there are 2 main (most used) ways to achieve this.
The first (my favorite):
Get the data from a PNG
You should write multiple layers to a canvas. These layers constitute your "zones" (blue, green, purple in the image). To obtain the data of these areas, you get it from PNGs (with transparencies off course) to write the canvas with whatever you want. You must store the values where there can be a tap from the user (non-transparent areas). Notice that this values can be scaled up/down depending on the map size, screen resolution, map dimensions, etc.
Once you've written the layers to the canvas you should check for a match of the user tap and the stored areas you have. You should take into consideration here the order in which the user tap is processed in your code. For instance, in your image, the purple layer is on top so it must be processed first, the blue as second, and the green as the last one. This way you can have an "island" inside a bigger area.
The second way:
Generate the boundaries programmaticaly
I think this solution is self-explanatory. The only I've faced with this variant is that when the surfaces boundaries get messy, it's really complicated to generate the proper equations.
EDIT:
Using the first approach you can employ multiple PNGs to load data or use a single PNG with data coded into the bytes (i.e. RGB values). It's up to you to decide which one to implement.
Hope it helps!
Since a touchscreen itself isn't very accurate, your collision detection for the buttons doesn't need to be either. It would be a waste of time to try to make a complicated collision detection algorithm to detect a touch within those weird shapes.
Since you are making a game, I assume you know how to handle custom touch events, as well as canvas (at least). There are many ways to do what you want, but in the specific example image you linked is kind of a special case.
You could create a giant bounding circle around the three blobs, and then check if the user touched within the bounds of the circle (ie check if the distance from the touch to the center of the circle is less than or equal to the radius). Once you determine that it is, you could check which section of the circle it falls into by splitting it up into 3 equal sections. Requires some math, but shouldn't be that complicated.
It wouldn't be a perfect solution, but it should be good enough. Although, you might have to change the buttons a little so they aren't so stretched out horizontally, otherwise a bounding circle wouldn't be ideal.
Personally, in my games I always have "nodes" that represent the visual elements of the game, such as buttons. Instead of using a large image like you are doing, I would create separate images for each button, and then check their collisions with touch events independently. That way I could have each button check with their own individual bounding circles, or, if absolutely necessary, I could even have custom algorithms for each individual button.
These aren't perfect solutions. If you do want a pixel-perfect solution, you'll need to implement some polygon collision detection algorithms
One thing to consider is screen size and ratio. The only constants you should use are for percentages.

Implement something comparable to Android's pattern-lock system

Suppose that my display consists of numbers 1-9 displayed via a 3x3 grid of Buttons, like on num-pad, where one number is placed on each button. I want to be able to detect complex movements, such as the tracing of a Z, which would yield [7 8 9 5 1 2 3] or top-left to bottom-right swipe, which would yield [7 5 3]. I read that I could accomplish this via overriding boolean onTouchEvent(MotionEvent event), but I'm not certain that I understand how this works. From what I can tell from the Android API for MotionEvents, whenever an object is touched on the screen, whether or not one's finger is still tracing or lifting up, it is captured by ACTION_UP. If that is true,
How do I get the history or stack trace, if you will? Can I do this in real time, or do I have to wait for the drag to complete?
How do I actually highlight/ draw the path that their finger/ stylus is tracing (in real time)? I don't want their precise, trace, but rather, I'd like to be able to normalize it via straight-line paths, like Android implements in their pattern-lock system.
Thanks in advance.

how to detect the shape that touch the touch screen

I have received requirement like this http://www.youtube.com/watch?v=7MYQicokwmY&feature=plcp I am reviewing this requirement.As per requirement we have to build touch detection like in video link for Android enabled Tablets.
In that video toys (toys with circular, star or rectangle shape) uses Conductive Silicone Sensors with that they are detecting touch on screen & deciding shape of external world object like triangle,circle or a star & further processing the shape.
I have to use same touch detection for android tablets.Can anybody help me to find the way to implement this on Android platform ? Is there any API or framework to implement it?
If you see the video around 1:13, they show what I am guessing are some prototypes, the circle has three points, the hexagon too...
My best guess is that the biggest part of the object is non-conductive and only has a few points that are conductive and would actually register as touch points on the screen. The key is that each of them will be different enough that you would be able to recognize them no matter what the orientation is, what the position (and depending on your requirements whether you have several of those objects at the same time on the screen).
You can also play with the area of each conductive points so in your code, you will get the touch information, you can get different pressure values from the MotionEvent
Now how you place the conductive points and how many on each shape is completely up to you and would really depend on what your requirements are (recognizing arbitrary shape is not an option...)
Most touch screens would reject the touch if the area is too large (that's palm rejection), so I don't think there are much other ways to do this...

functionality of touchscreens and user input

I am an amateur (desktop) programmer but I want to get into phones. I have some ideas for apps but the touchscreen and it's inputs confuse me....
I know that touchscreens can accept multiple points of touch. For instance zooming in you take two fingers and you bring them closer.. and for zooming out you do the opposite.
Here is my problem though... I've never seen functionality with any phone app on any phone (I use windows phones and android phones) where.... the input on touch is multiple points but it doesn't begin at the same time.
For the sake of illustration I'll make an example. Suppose you have a mini browser on a phone... and it has a vertical scroll bar... and a horizontal one. What I want to do is be able to scroll down... and WHILE i am scrolling down also scroll the horizontal one so i can move the page left or right. So a few seconds after I touch the screen and begin moving the vertical scrollbar downwards or upwards... i want to use a different finger and touch the horizontal scrollbar and move it as well (at the same time).
Is this even possible? Are there certain hardware or software limitations preventing something like this?
You are mixing up gestures and touches. Gestures are touch behaviors, such as...
Two fingers placed at the same time that grow apart from each other means zoom-in.
Tap and hold means context popup.
Tap and drag equals scroll.
You can cancel these gestures when your app doesn't follow these conventions. For example, Angry birds doesn't scroll if you tap and drag on a bird, but it does if you do it elsewhere on the scene.
The default state of gestures is to not detect additional touches while you are performing a gesture. if you scroll and introduce a second finger to click on a button while still holding the scroll finger, nothing will happen. I'm not sure if you can override this behavior (and I don't think it's a good idea either).
Touches, on the other hand, allow a certain amount of simultaneous touches depending on the device. When a touch is not a gesture you can start a second or n number of touches after the first one starts.
You can try this out yourself at http://raphaeljs.com/touches.html.
Now, going back to your example: it depends on how it's implemented. If you are using the OS gestures (tap and drag anywhere) then no, you can't introduce a second finger to drag horizontally, you'd use the same finger used to scroll vertically (panning with a single finger). But, if you have actual scrollbars (like those in mouse interfaces) then yes, you can implement the kind of interface you are describing.
Yes its possible and it depends on the phone but since most android devices and all WP7 devices got multi touch it shouldn't be a problem

Detecting touch area on Android

Is it possible to detect every pixel being touched? More specifically, when the user touches the screen, is it possible to track all the x-y coordinates of the cluster of points touched by the user? How can I tell the difference between when users are drawing with their thumb and when they are drawing with the tip of a finger? I would like to reflect the brush difference depending on how users touch the screen, and would also like to track x-y coordinates of all the pixels being touched over time. Thanks so much in advance for any help.
This would be very tricky primarily because every android phone is going to behave differently. There are some touch screen devices that are very, very sensitive and some that are basically "dull" by comparison.
It also sounds more like you are wanting to track pressure - how hard is the user pushing on the screen - which is actually supported on android devices.
I think some of your answer may be found by monitoring all of the touch events - in practice, most applications ignore a great number of events or perform some kind of "smoothing" of the events since there is literally a deluge of touch events when the user is manipulating the screen. Doing this may negatively impact your applications performance though.
I would recommend that you look into pressure sensitivity and calculate a circular region around the primary touch point based on pressure, then build your brush around that.
Another idea would be to incorporate more of a gesture approach to what you are trying to do - for example, visualize touching the screen with the tip of two fingers together (index and middle) and rolling the middle finger around the index finger or simply moving the middle finger up and down in relation to the index finger. Both fingers would be moved together for painting. This could be used to manipulate drawing angle on the fly or perhaps even toggle between a set of pre-selected brushes or could change brush size on the fly as you are painting.
Some of the above ideas I would love to see implemented - let me know when you have your app ready.
Good luck!
Rodney
If you have a listener on your image it will respond that there was a touch within that bounding box, basically.
So, to get what you want, you could, but, I would never do this, create a box around every pixel, or small group of pixels, and listen for a touch.
Wherever you get a touch, it may fire off an event, then you can react accordingly.
I can't think of any other solution that will give you each pixel that a person touched, at one time.
You may want to read up on multitouch though, as there are some suggestions in here that my help you:
http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html
If you're looking for a way to get your content view as a View after Activity#setContentView(int), then you can set an id on the outer-most element of your layout:
android:id="#+id/entire_view" and reference it in your onCreate() method after setContentView:
View view = getViewById(R.id.entire_view);
view.setOnTouchListener( ... );

Categories

Resources