一直在做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 运行截图: 静态