一直在做PIM sync,对于OMA syncml的应用开发也浸淫了4年了,但是PIM的应用一直没跳出对于联系人,日程或者文件的同步备份的圈子,看看syncml的spec,DS 到了 2.0算是正式终结并并入了DM的序列,设备管理也算涵盖了用户数据的管理。PIM能不能跳出sync这个用途,利用其特性做些其他的扩展应用呢? 答案是肯定的,只是目前国内市面上还没有类似的应用。
1. 结合社交网站
利用sns的API,例如facebook,twitter,kaixin001,人人网的api,将手机的数据同步到第三方的服务器上,达到共享用户手机数据的效果,这个实时性和流动性应该是传统的互联网应用达不到的。
类似的应用: Rseven ,它是一个很不错的在线手机备份服务。
- 提供备份服务,备份的内容包括:通话记录/日志, 消息 (SMS, MMS & emails), 图片, 音频, 视频,并且以TimeLine的方式展示这些信息;
- 提供同步服务:同步的内容包括:联系人和Calendar (appointments & to do items).
- 可以讲Rseven备份内容还原到你的手机;
- 支持对图片, 音频, 视频用Tag进行管理;
- 可以对来电通话等进行录音并且同步到rseven,并且可以在rseven收听录音;
- 可以统计你和联系人的联系频率,包括通话频率,短信等;
- 可以将同不到rseven的内容分享到第三方网站,目前支持Facebook
2.结合飞信
这个从飞信加载联系人得到的启发,PIM sync真是做的联系人的同步,如果一个用户将自己的联系人同步到飞信的服务器上,这样,就可以从用户真实的联系人信息做文章,用户手机的联系人可以实时同步到飞信上。同时可以利用飞信的api,做一个短信的免费发送,类似google的voice的应用。
类似的应用:利用飞信API的网站很多,但是结合PIM sync的很少。
3.结合email做push email
现在运营商得到3G拍照后,叫嚣的都是争取终端支持,争取设备厂商的配合。在我看来,真正欠缺的是3G的杀手级应用。如果没有它,那么3G无非就是用浏览器看网页的速度快了而已,而到底什么是真正的杀手级应用呢?在欧美,答案已经出现了:push email。看看RIM 的blackberry就知道为啥看似如果简单的应用能造成如此成功的公司吧。目前的PIM 厂商要么只做联系人,日程,文件的同步,要么再加上一些RSS和变形的SNS,很难有太大的用户黏性,而如果把email的功能也加到PIM Sync服务器上,这就相当于利用用户真实的数据加上一项利器应用: email。
类似的应用:Funambol ,只要做过PIM的人应该都很熟悉这个开源项目,大名鼎鼎的sync4j 就是它的前身。
- 提供联系人,日程的同步备份功能
- 提供push email功能
- 支持多种手机客户端,例如Android,symbian,mobile等
当然这些都是PIM的一些扩展应用,目前市面上PIM 同步移动包括apple mobileme、MS Myphone、Google Sync这些巨头们的产品以及国内的mytt、蜡笔、火种、无忧通讯录等也是类似,运营商的产品应用就是移动的号码薄管家和电信的PIM 备份。PIM应该算是3G应用的一项基础应用,但是如果基于这些用户的真实数据做扩展应用,也许就是孕育杀手应用的一个要素。
通过面积法,判断点P是否在四边形(A,B,C,D)内。
如果在四边形内则, 四边形的面积=面积(P,A,B)+面积(P,B,C)+面积(P,C,D)+面积(P,D,A)
反之不在四边形内。
public class Quadrangle
{
/**
* 点是否在四边形内
* @param a
* @param b
* @param c
* @param d
* @param p
* @return
*/
public static boolean pInQuadrangle(Point a, Point b, Point c,Point d,Point p)
{
Log.d("Walk Game","Quadrangle:"+
"new Point("+a.x+","+a.y+"),"+
"new Point("+b.x+","+b.y+"),"+
"new Point("+c.x+","+c.y+"),"+
"new Point("+d.x+","+d.y+"),"+
"new Point("+p.x+","+p.y+"),"
);
double dTriangle = triangleArea(a,b,p)+triangleArea(b,c,p)
+triangleArea(c,d,p)+triangleArea(d,a,p);
double dQuadrangle = triangleArea(a,b,c)+triangleArea(c,d,a);
return dTriangle==dQuadrangle;
}
public static boolean pInQuadrangle(float[] px,float[] py,float x,float y)
{
Point a = new Point((int)px[0],(int)py[0]);
Point b = new Point((int)px[1],(int)py[1]);
Point c = new Point((int)px[2],(int)py[2]);
Point d = new Point((int)px[3],(int)py[3]);
Point p = new Point((int)x,(int)y);
Log.d("Walk Game","Quadrangle:"+
"new Point("+a.x+","+a.y+"),"+
"new Point("+b.x+","+b.y+"),"+
"new Point("+c.x+","+c.y+"),"+
"new Point("+d.x+","+d.y+"),"+
"new Point("+p.x+","+p.y+"),"
);
double dTriangle = triangleArea(a,b,p)+triangleArea(b,c,p)
+triangleArea(c,d,p)+triangleArea(d,a,p);
double dQuadrangle = triangleArea(a,b,c)+triangleArea(c,d,a);
return dTriangle==dQuadrangle;
}
// 返回三个点组成三角形的面积
private static double triangleArea(Point a, Point b, Point c)
{
double result = Math.abs((a.x * b.y + b.x * c.y + c.x * a.y - b.x * a.y
- c.x * b.y - a.x * c.y) / 2.0D);
return result;
}
}
你是指PC平台的JDK吗?
如果是的话,之前我和你的想法一样,想把PC平台的Polygon移到android中.
那里面关系到很多类,我的技术太烂.粗略做了一下,没成功放弃了.
因为我就是把这个方法考过来,稍微改改,就可用了,但是没看懂。
上次讲过 如何使得Button有按下的效果 但是最后也提过 如果要求几个Button都有这种效果 分别为每一个Button定义一个 *.xml 是不方便的 今天就演示一下简便一点的做法
[代码 步骤]
1. 准备这2个ImageButton 所需的 *.ico 如:
play_down.ico : ImageButton-play 的按下 效果
pause.ico : ImageButton-pause的静态(未按下) 效果
pause_down.ico : ImageButton-pause的按下 效果
2. 构建有2个ImageButton 的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageButton
android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<ImageButton
android:id="@+id/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
3. 分别为View 定义名称 便于引用
public void initialView(){
play = (ImageButton) findViewById(R.id.play);
pause = (ImageButton) findViewById(R.id.pause);
}
4. 为ImageButton play,pause 指定默认背景
public void specifyBackground(){
play.setBackgroundResource(R.drawable.play);
pause.setBackgroundResource(R.drawable.pause);
}
5. 为ImageButton play,pause 注册 onTouch() 事件 并根据其ID 与 状态 指定具体的背景图
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.play:
if(event.getAction() == MotionEvent.ACTION_DOWN){
v.setBackgroundResource(R.drawable.play_down);
}
else if(event.getAction() == MotionEvent.ACTION_UP){
v.setBackgroundResource(R.drawable.play);
}
break;
case R.id.pause:
if(event.getAction() == MotionEvent.ACTION_DOWN){
v.setBackgroundResource(R.drawable.pause_down);
}
else if(event.getAction() == MotionEvent.ACTION_UP){
v.setBackgroundResource(R.drawable.pause);
}
break;
}
return false;
}
};
play.setOnTouchListener(listener);
pause.setOnTouchListener(listener);
6. 所有程序为:
public class ButtonStyle3Usage extends Activity {
ImageButton play,pause;
OnTouchListener listener;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initialView();
specifyBackground();
listener = new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.play:
if(event.getAction() == MotionEvent.ACTION_DOWN){
v.setBackgroundResource(R.drawable.play_down);
}
else if(event.getAction() == MotionEvent.ACTION_UP){
v.setBackgroundResource(R.drawable.play);
}
break;
case R.id.pause:
if(event.getAction() == MotionEvent.ACTION_DOWN){
v.setBackgroundResource(R.drawable.pause_down);
}
else if(event.getAction() == MotionEvent.ACTION_UP){
v.setBackgroundResource(R.drawable.pause);
}
break;
}
return false;
}
};
play.setOnTouchListener(listener);
pause.setOnTouchListener(listener);
}
public void initialView(){
play = (ImageButton) findViewById(R.id.play);
pause = (ImageButton) findViewById(R.id.pause);
}
public void specifyBackground(){
play.setBackgroundResource(R.drawable.play);
pause.setBackgroundResource(R.drawable.pause);
}
}
7. emulator 运行截图: 静态