Showing posts with label programming. Show all posts
Showing posts with label programming. Show all posts

Wednesday, February 11, 2009

X Y motion

Android's onTouchEvent was giving me some difficulties. I want to increment and decrement my countdown timer based on touch screen input. The user should be able to touch the screen anywhere and move their finger left, right, up or down, and the values should change in a logical way. I discovered I had to introduce a certain scaling factor in order to prevent the tiny increments and decrements from canceling each other out effectively. The code I came up with computes the delta in X and Y coordinates and only increments or decrements the countdown timer values if the delta is more than a certain amount, in the example the value is 5. You could change this to make the system more or less sensitive. This effectively "understands" the intent of the user's gesture.

Here is my onTouchEvent, it should be fairly self explanatory.

@Override
public boolean onTouchEvent(MotionEvent event) {
float mvX;
float mvY;
boolean chg;
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
startY = event.getY();
startX = event.getX();
break;
case MotionEvent.ACTION_MOVE:
endY = event.getY();
endX = event.getX();
break;
case MotionEvent.ACTION_UP:
endY = event.getY();
endX = event.getX();
break;
default:
return false;
}
chg = false;
mvY = endY - startY;
if(mvY > 5) {
mySecondsTotal += 1;
chg = true;
}
if(mvY < -5) {
mySecondsTotal -= 1;
chg = true;
}
mvX = endX - startX;
if(mvX > 5) {
mySecondsTotal += 1;
chg = true;
}
if(mvX < -5) {
mySecondsTotal -= 1;
chg = true;
}
if (chg == false)
return true;
startY = event.getY();
startX = event.getX();
if (mySecondsTotal < 0)
mySecondsTotal = 0;
Message m = new Message();
m.what = timer.GUIUPDATEIDENTIFIER;
this.myYogaViewUpdateHandler.sendMessage(m);
return true;
}

Saturday, January 31, 2009

Webkit About box

This is kind of overkill for an About dialog, but the neat thing is you can click on the URL and go right to the web page. Hitting the back button returns to your application so it is very smooth


public class about extends Activity {
WebView aboutText;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.about);
aboutText = (WebView)findViewById(R.id.about_text);
String str = "<I>Yoga Timer</I><HR/>Version 1.4<BR/>" +
"<P>Patterns multiply the starting value to set separate durations for the four parts of the breath: <UL>" +
"<LI>Inhalation (Pooraka)<LI>Retention (Abhyantar Kumbhaka)<LI>Exhalation (Rechaka)<LI>Suspension (Bahya Kumbhaka)</UL>" +
"<P>Check for new versions here <A href=http://cubicware.com/>CUBICWARE.COM</A>";
aboutText.loadData(str, "text/html", "utf-8");
Button okButton = (Button) findViewById(R.id.okButton);
okButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
finish();
}
});
}
}

Android notifications

This is a work in progress. I don't think the light notification is working yet.


if (notifyVibrate){
Notification notification = new Notification();
notification.vibrate = new long[] { 100, 250, 100, 500};
nm.notify(NOTIFY_ID, notification);
}
if (notifyLight) {
Notification notification = new Notification();
notification.ledARGB = 0xFFFF5171;
notification.ledOnMS = 100;
notification.ledOffMS = 100;
notification.flags = Notification.FLAG_SHOW_LIGHTS;
nm.notify(NOTIFY_ID, notification);
}
if (notifyToast) {
Toast toast = Toast.makeText(timer.this , R.string.notification_text, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
}
if (notifySound) {
mp.play(timer.this, Settings.System.DEFAULT_NOTIFICATION_URI, false, AudioManager.STREAM_ALARM);
}

Code highlighting on blogger

I found this here but thought I'd document it in case it disappears.

<link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js"> </script>

<body onload='prettyPrint()'>


<pre class="prettyprint">
... # Your code goes here
</pre>