之前已经写过通过重绘整个背景的方式,实现物体移动。今天要讲的是,如何通过移动widget,view等控件,实现部分重绘。结合之前发Droiddraw工具,使用AbsoluteLayout,可以随意放置控件在任何位置。
package com.sky; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.AbsoluteLayout; import android.widget.Button; @SuppressWarnings("deprecation") public class AbosoluteMove extends Activity implements OnClickListener { /** Called when the activity is first created. */ public Button button1; public Button button2; public Button button3; public Button button4; Button tmp;//临时保存,选择的BUTTON int x; int y; int flag;//用于标志选择哪个BUTTON @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button1=(Button) findViewById(R.id.widget27); button2=(Button) findViewById(R.id.widget28); button3=(Button) findViewById(R.id.widget29); button4=(Button) findViewById(R.id.widget30); button1.setOnClickListener(this); button2.setOnClickListener(this); button3.setOnClickListener(this); button4.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()) { case R.id.widget27: flag=R.id.widget27; setTitle("button1"); break; case R.id.widget28: flag=R.id.widget28; setTitle("button2"); break; case R.id.widget29: flag=R.id.widget29; setTitle("button3"); break; case R.id.widget30: flag=R.id.widget30; setTitle("button4"); break; } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub return super.onKeyDown(keyCode, event); } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub x = (int) event.getX(); y = (int) event.getY(); tmp=(Button) findViewById(flag);//获取所选中的BUTTON AbsoluteLayout.LayoutParams params1=new AbsoluteLayout.LayoutParams(50,50,x-25,y-50); tmp.setLayoutParams(params1);//设置BUTTON的新位置 switch(event.getAction()) { case MotionEvent.ACTION_DOWN: tmp.invalidate(); tmp.setText("选中down"); break; case MotionEvent.ACTION_UP: tmp.invalidate(); tmp.setText("选中UP"); break; case MotionEvent.ACTION_MOVE: tmp.invalidate(); tmp.setText("选中move"); break; } return super.onTouchEvent(event); } }
前几天花了很多时间在MM提交android的应用,过程值得写一写,免得各位像我一样在毫无心理准备的情况下尝试该过程而造成心理上的巨大不适。本文针对的是个人开发者的流程。
该过程有六个步骤,好消息是,六个步骤并不需要一次全部完成,中途关掉浏览器,下次重新登录,会从上次的提交点继续。而坏消息则是,这些步骤真的很SB。
MM的发布过程只支持IE6 ,所以最好去装一个360安全浏览器。
第一个步骤:填写个人信息。
这个很简单了,无非是姓名,地址,邮编,电话,邮件。需要注意的时,此时需要填写你的银行账号。MM支持的银行极其众多,国内外总共几十个。除了填写银行卡号以外,还需要填写对应的开户银行营业部名称。另外还要准备银行卡的扫描图片和身份证的扫描图片 。扫描很不方便,我是用数码相机拍的,应该可以吧,我猜。身份证直接以图片文件上传就行了,银行卡图片则需要压缩成zip或者rar才行 ,不解。
第二个步骤,填写应用程序信息
名称、售价、分类、介绍、关键字之类的
第三个步骤,上传图片
麻烦的地方来了,该步骤要求你上传至少4张图片。这个也是很多开发人员抱怨的事情,看图看真相:
还好我之前在android market发布过程序,制作了一些Logo,宣传图片和截图,凑合用用。不过尺寸肯定是不对的,需要调整。我很奇怪移动是根据什么设备指定的这些尺寸。另外,MM只支持jpg格式,实在很糟糕,稍微醒目一点都知道png是大势所趋了。狂改图片中,提交之。。。。
可耻的失败了,某些图片大小超过了它要求的上限,有个图片超了0.2K,汗,多给10K会死么?
再改之,把那个什么从100%降到95%,搞定。
第四个步骤,还是上传图片
需要上传5个图片,他们分别是:
一个 30 * 30 的logo
一个 34 * 34 的logo
一个 50 * 50 的logo
一个 65 * 65 的logo
一个GIF动画
其中logo只能是jpg格式,文件大小有严格要求。
看到这个表单的时候,恩,我真的要怒了。。。。
狂改图,搞定四个logo。。。。
GIF动画??抓头。。。看这个:在线生成GIF的网站:http://gif.55.la/
提交几个图片,搞定之。胜利就在前方
第五个步骤,填写测试报告
最无厘头的一个步骤,要求你下载一个doc文件模板,填写软件运行情况的报告后上传。
下载的包有两个pdf的说明,一个doc模板,我上传了,大家可以下载来看看。
doc模板列了一堆表单要求填写,包括程序是否使用网络、是否修改手机设置、是否拦截系统事件等。
最麻烦的是,需要填写软件的运行流程和用户使用手册 。
一边骂人一边找材料,我的机器上没有MS office,用写字板连抄带写弄了半天,写完了发现文档最后一行字:请保存为PDF格式再提交。。。。。
幸好我有open office,拷贝、粘贴、发布,好歹算是弄完了。
第六个步骤,选择目标平台
恩,我很奇怪这一步为什么是在最后,而不是在最开始。难道不应该先选平台,然后再上传与对应设备屏幕相匹配的图片么?不解。另外需要填一个标识,不知道是什么。有个说明链接,点过去居然是个doc文件。无奈,下载阅读之,看了半天,不知道是在说什么。再无奈,失去耐心,把程序名填进去了事。
终于完成,哦也。状态是等待测试。另外写一篇来抱怨和骂人,敬请期待。
还需要银行卡的扫描图片?我注册的时候好像没要,
然后提交一测试,他说没看到广告,要重写文档。
(估计admob第一次运行,要准备数据,或当时没可用广告没显示)
结果我重写文档,在文档里面用红字,加粗注明可能是第一次要准备数据等等,暂时没广告。
结果过了几天一看,又被退回,理由是没广告,而文档里说有广告。。
我汗!!
懒得弄了,反正只是业余玩玩,而且还是1.0的系统,弄的话还要维护两套程序。
然后提交一测试,他说没看到广告,要重写文档。
(估计admob第一次运行,要准备数据,或当时没可用广告没显示)
结果我重写文档,在文档里面用红字,加粗注明可能是第一次要准备数据等等,暂时没广告。
结果过了几天一看,又被退回,理由是没广告,而文档里说有广告。。
我汗!!
懒得弄了,反正只是业余玩玩,而且还是1.0的系统,弄的话还要维护两套程序。
最近好像admob的广告有问题。像我的广告,突然fill rate跌到40%,有时候我在虚拟机上跑。也是显示不出来,我设定的是test='true',后台看了说是服务器连接问题。这几天又好了。
然后提交一测试,他说没看到广告,要重写文档。
(估计admob第一次运行,要准备数据,或当时没可用广告没显示)
结果我重写文档,在文档里面用红字,加粗注明可能是第一次要准备数据等等,暂时没广告。
结果过了几天一看,又被退回,理由是没广告,而文档里说有广告。。
我汗!!
懒得弄了,反正只是业余玩玩,而且还是1.0的系统,弄的话还要维护两套程序。
最近好像admob的广告有问题。像我的广告,突然fill rate跌到40%,有时候我在虚拟机上跑。也是显示不出来,我设定的是test='true',后台看了说是服务器连接问题。这几天又好了。
收到admob的邮件说,他们正在升级网站,也许有影响? 有一天我设置testing="true"仍然得到regular的广告,估计是他们在变更什么设置吧。
Doc的话建议用google docs, 可以直接导出PDF.
对了LZ, 个人开发者是不是要和那个虾米测试公司签测试app的协议啊?
Doc的话建议用google docs, 可以直接导出PDF.
对了LZ, 个人开发者是不是要和那个虾米测试公司签测试app的协议啊?
我把MM开发论坛上的FAQ读了一遍,确实提到需要签一个合作协议。但是提交程序的过程中,没看到任何提示,我也没搞清楚是咋回事
等啊等
此等绵绵会有期
算了吧,在那里会经常遇到一些莫名其妙的脑残测试的
比如我做了一个浏览器,网站问题,打不开了,被打回来,说我浏览器有错误。。
比如我做一个发短信的应用,它说在没有SIM卡的情况下,我的应用无法发送短信。。
等等让人吐血的驳回理由
我一个应用发布上去,3个月之后才开测
我在论坛上询问为什么3个月了还没测我的应用时,还被删帖,说影响他们的形象了
所以在我发布了3个应用之后,我决定再也不去移动的Mobile Market发布应用了
不晓得楼主的应用通过了没
算了吧,在那里会经常遇到一些莫名其妙的脑残测试的
比如我做了一个浏览器,网站问题,打不开了,被打回来,说我浏览器有错误。。
比如我做一个发短信的应用,它说在没有SIM卡的情况下,我的应用无法发送短信。。
等等让人吐血的驳回理由
我一个应用发布上去,3个月之后才开测
我在论坛上询问为什么3个月了还没测我的应用时,还被删帖,说影响他们的形象了
所以在我发布了3个应用之后,我决定再也不去移动的Mobile Market发布应用了
不晓得楼主的应用通过了没
这个例子很囧啊……
看到有人询问Kuix安装,而且运行Demo出现问题,其实在用过的几个UI包中,Kuix算是安装最简单的了,基本上只要包括Kuix和Kutil两个jar包就可以,这两个包在http://www.kalmeo.org/projects/kuix/download可以下载,其中Kutil提供基础类库,比如Textarea中的xml解析器就在这个包中,同时建议下载源代码,因为要做比较强大应用的话,这个包还是有不少问题的,不是bug,而是功能较弱,以后我会专门出一篇介绍Kuix的不足之处和改善方法.安装步骤如下:
下载最新的WTK,并安装,配置(具体搜索相关的文章),注意网上部分开源J2ME的包对于低版本的WTK是不能运行的,目前我用的是2.5.2.
引入Kuix,Kutil包,并做下图的配置.记得不要把J2ME的包删掉,Kuix还是基于J2Me的包的,虽然不用直接继承J2ME的任何基类.
新建Midlet suit,接着不用新建Midlet了,而是继承KuixMIDlet,然后依照指南建立Frame和XML
midlet代码,需要加载fram和css样式,直接复制KuixDemo的样式和图片即可.
public class Helloworld extends KuixMIDlet { public Helloworld() { // TODO Auto-generated constructor stub } public void initDesktopContent(Desktop arg0) { Kuix.getFrameHandler().pushFrame(new HelloworldFrame()); } public void initDesktopStyles() { Kuix.loadCss("style.css"); } }
frame代码,这是我演示动态数据绑定的demo:
public class HelloworldFrame implements Frame { public void onAdded() { // TODO Auto-generated method stub Screen screen = Kuix.loadScreen("hello.xml", null); screen.setCurrent(); } public boolean onMessage(Object identifier, Object[] arguments) { // TODO Auto-generated method stub if ("about".equals(identifier)) { Kuix.alert(Kuix.getMessage("CREDITS"), KuixConstants.ALERT_OK); return false; } if ("exitConfirm".equals(identifier)) { // display a popup message Kuix.alert(Kuix.getMessage("EXIT_CONFIRM"), KuixConstants.ALERT_YES | KuixConstants.ALERT_NO, "exit", null); return false; } if ("exit".equals(identifier)) { // get the midlet instance to invoke the Destroy() method Helloworld.getDefault().destroyImpl(); //if the event has been processed, we return 'false' to avoid event forwarding to other frames return false; } if ("showDynamic".equals(identifier)) { Kuix.getFrameHandler().pushFrame(new Dynamic()); return false; } if ("showCombo".equals(identifier)) { Kuix.getFrameHandler().pushFrame(new combo()); return false; } // return "true" makes the FramHandler to forward the message to the next frame in the stack return true; } public void onRemoved() { // TODO Auto-generated method stub } }
hello.xml
<?xml version="1.0" encoding="UTF-8"?> <screen shortcuts="1=about|back=exitConfirm|0=exitConfirm"> <_title>%HELLOWORLD%</_title> <container > <text><_text>%HELLOWORLD%</_text></text> <picture src="/blog_article/logo.png" /> <button onAction="/blog_article/showDynamic/index.html">%DYNAMIC_DISPLAY%</button> <button onAction="/blog_article/showCombo/index.html">combo dynamic</button> <button onAction="/blog_article/about/index.html">%ABOUT%</button> <button onAction="/blog_article/exitConfirm/index.html">%EXIT%</button> </container> <screenFirstMenu onAction="/blog_article/exit/index.html">Exit</screenFirstMenu> <screenSecondmenu> %MORE% <menuPopup> <menuItem onAction="/blog_article/about/index.html" shortcuts="1"> %ABOUT% </menuItem> <menuItem onAction="/blog_article/exitConfirm/index.html" shortcuts="back|0"> %EXIT% </menuItem> </menuPopup> </screenSecondmenu> </screen>
这样就可以运行了.另外如果需要修改代码的话建立添加source link,选择项目,右键,properties,java build path,source标签,点link source按钮,添加Kuix和Kutil源码的目录,这样就可以多个项目共享Kuix的源码,又可以方便的直接修改源码.
Kuix.alert(Kuix.getMessage("CREDITS"), KuixConstants.ALERT_OK);
执行的时候,当弹出此alert时,左下角将显示“ok”,如何更改为中文?
谢谢!
好像官方的入门教程上有。
谢谢指点!
通过在KuixConstants中修改源代码,可以更改“ok”为中文。
不过对于“SELECT”,只需要在messages.properties中修改value值即可,而只在此配置文件修改“OK”的value值,不能实现中文显示。为什么?两者的实现方式有什么区别么?
还有一个问题是,在.css文件中,可以设置屏幕的背景颜色,可以设置屏幕的背景图片么?如何设置?望不吝赐教。
/* */ import org.kalmeo.util.worker.Worker;
/* */ import org.kalmeo.util.worker.WorkerErrorListener;
/* */ import org.kalmeo.util.worker.WorkerTask;
请问这个包在那里获取.
还有个是工具包,叫kutil
你需要的这些在kutil里面
我看了你的一片博客说要修改kuix的源码,加上fixWidth属性,请问还有其他方式不??