当前位置:  编程技术>移动开发
本页文章导读:
    ▪Kuix的事件处理机制(沙洲版) 2        Kuix的事件处理机制(沙地版) 2 至此终于调用了doLayout强制重新“布局”,根据revalidateAsSoonAsPossible的备注,这个函数就是为了方便开发者“强制”刷新界面所提供的,Kuix本身不调用这个函数,.........
    ▪ 运用BinCompiler将资源文件打包成二进制文件        使用BinCompiler将资源文件打包成二进制文件 版权申明:http://yarin.iteye.com/blog/453262     在开发游戏时,总是要使用很多的资源文件,比如:图片、音乐等。而我们经常会遇到一些商业游戏中.........
    ▪ 已停机的动感地带的卡再度利用       已停机的动感地带的卡再次利用 现在向大家透露一个如何激活已停机卡的方法!?激活了以后就可以免费上网了。注:《本人动感地带的卡已测,通过》!     首先,准备一张已经欠费停机.........

[1]Kuix的事件处理机制(沙洲版) 2
    来源: 互联网  发布时间: 2014-02-18
Kuix的事件处理机制(沙地版) 2

至此终于调用了doLayout强制重新“布局”,根据revalidateAsSoonAsPossible的备注,这个函数就是为了方便开发者“强制”刷新界面所提供的,Kuix本身不调用这个函数,而使用场合恰好就是我碰到的这个场景。如下: 

 

	    	Kuix.getCanvas().revalidateAsSoonAsPossible();
	    	//恢复滚动条
			ScrollPane main=(ScrollPane)screen.getWidget("main");
			main.bestScrollToChild(screen.getWidget("selUserName"), false);	

 

案例二:下拉框的bug

    如果你使用了下拉框(choice),并且使用了Kuix的刷屏机制(如:transition: slide(left);),那么很容易发现下拉框的一个bug会导致系统当机,快速按确定键弹出下拉框并选择,那么用不了几下就会发现界面完全失去响应,死机了,而且下拉列表的项目“丢失”了若干项。造成上述bug的原因是缺少同步机制,输入按键的时候Kuix会把按键存入keyEvents,等待消息处理线程的处理,快速多次输入确认键导致上一次弹出/关闭列表窗口还没处理完毕,消息处理线程又再次操作列表,导致死机现象产生,最好的解决方法当然是在弹出列表时增加同步机制,但是我们不希望按键输入完毕后界面还在缓慢的多次弹出、关闭,简单说就是不需要缓存输入键,所以下面的可以快速解决上述bug:

 

	protected void processKeyEvent(byte type, int keyCode) {
		if (initialized) {
			
			int kuixKeyCode = adoptKeyCode(keyCode);
			
			// Intercept debugInfos key
			if (type == KuixConstants.KEY_RELEASED_EVENT_TYPE) {
				if ((debugInfosKuixKeyCode & kuixKeyCode) == kuixKeyCode) {
					debugInfosKeyCounter++;
					if (debugInfosKeyCounter >= 3) {
						initializer.processDebugInfosKeyEvent();
						debugInfosKeyCounter = 0;
					}
				} else {
					debugInfosKeyCounter = 0;
				}
			}
			
			// Add event to queue
			synchronized (this) {
				if(keyEvents.isEmpty()) //add by shappy
					keyEvents.addElement(new int[] { type, kuixKeyCode });
			}
			
		}
	}

 if(keyEvents.isEmpty())可以保证在有键盘事件未处理时,新的键盘输入被系统忽略。理论上这样的代码可能丢失输入

键,但是好在多数手机上没有键盘,而且Kuix也不支持直接输入文字,所以,就这样吧。

附,choice的按键处理函数,这里显然没有同步机制

 

	/* (non-Javadoc)
	 * @see org.kalmeo.kuix.widget.AbstractActionWidget#processActionEvent()
	 */
	public boolean processActionEvent() {
		Desktop desktop = Kuix.getCanvas().getDesktop();
		if (desktop != null) {
			
			if (lastSelectedRadioButton != null) {
				lastSelectedRadioButton.catchChildrenFrom(choiceContainer);
			}
			
			// Retrieve the owner screen instance
			ownerScreen = desktop.getCurrentScreen();
			
			// Keep the cleanUpWhenRemoved property value
			ownerScreenCleanUpWhenRemoved = ownerScreen.cleanUpWhenRemoved;
			ownerScreen.cleanUpWhenRemoved = false;
			
			desktop.setCurrentScreen(screen);
			
		}
		return super.processActionEvent();
	}

    有人说choice在tabgroup中才会出现上述问题,其实不是的,起码我在没有tabgroup的ui中确实出现过上述问题,而且
也不难测试,主要应该是transition的刷屏机制导致popup的窗口延迟才会出现问题,另外就是弹出窗口后返回原来的窗口是会出现choice的选择项丢失的情况,虽然代码里面强制给choice赋值可以保证下次提交是可以获取到choice的值(否则会是null),但是弹出时选择项还是空.

    Kuix的代码框架总体不错,但是小问题相当多,毕竟他是开源的框剪,作者的更新也相当慢,对中文的支持还不是很好,做了这几个月时间,给初学者的建议是,如果你没有决心去修改或者了解其源代码的话,建议还是不用它吧.另外列出它的几个问题,不是全部,只是随手写出来的,是没有解决或者完善解决的问题.

1 choice的长度超过一页时会显示滚动条,但是弹出列表时不会自动定位到当前选择项

2 在有滚动条,而且界面长度超过一页时,读取或者操作界面的某个widget时(很多时候是读取/修改某个列表),界面会自动滚动到最后.

3 实机测试似乎界面上所有的字体都是一样的,而不是可以用j2me的三种大中小的字体,但是wtk的模拟器上则可以,怀疑是kuix对中文字体支持不是很好

4 界面停滞现象,用线程连接服务器读取数据时,返回处理结果后弹出或者修改界面时,会出现界面停滞的情况,按任一按键或者鼠标可以马上恢复,否则需要等几秒时间,这一情况在模拟器上很少出现,实机比较多,没碰到的人估计很难理解我说的额情况,测试判断应该是线程同步问题导致,查询过程越慢越明显(因为我用上https通道加密后,这个现象会更明显),暂时没有完善的.

5 Kuix不支持直接输入,必须弹出标准输入窗口,这个其实不影响软件的功能,但是有时候挺煞风景的,而且不是kuix才有,其实有些开源的组件部分解决这个问题,应该说它必须解决两个问题,一个是kuix的布局问题(kuix的界面是运行时排版的,这可以解决不同分辨率的自适应问题),还有一个问题是解决输入法,你不仅必须接收特殊字符,还要接收汉字,而且最好支持手写输入,这是个大问题

6 滚动条问题,kuix滚动条默认是纵向的,其实它也支持横向滚动条,但是只能选择其中一种,作者不同时支持两种方向的滚动条估计和布局的缺陷有关.

7 不支持本地script,kuix把view独立开确实是方便用户编写界面,但是缺少客户端的脚本判断,这限制了软件的灵活性,比如说我在登录前必须判断用户的账户和密码不为空并提示用户,就必须把代码写死在客户端,所以必须引入客户端的脚本机制,这样Kuix才不失为一个完善的瘦客户端开发组件,另外,结合客户端脚本功能时,最好提供封装好的服务器连接组件,方便客户端的调用.

    问题很多,但其实只是其中很小一部分,希望没吓到希望学习Kuix的人,以后有时间解决其中部分问题的话我会陆续发表一些blog,不过项目差不多结束了,估计会转向其他的方向,有解决部分问题的朋友希望您回复一下,给其他读者作为参考.(我的邮箱shappy1978@sohu.com)

1 楼 bruce0601 2010-08-12  
大侠,KUIX框架,请问如何实现,用户无任何操作1分钟后,跳转到某一个页面呢?望指点!
2 楼 shappy1978 2010-08-12  
这个似乎和kuix没有关系吧,关键在于如何判断用户没有任何操作,当然你也可以定义为客户没有提交任何操作,这样相对容易写,其他的就靠定时器去执行了。
3 楼 shappy1978 2010-08-12  
看你的意思似乎是希望修改kuix的消息处理编码来判断用户是否有操作,应该可行吧,不过这样就破坏了kuix的独立性了
4 楼 bruce0601 2010-08-16  
shappy1978 写道
看你的意思似乎是希望修改kuix的消息处理编码来判断用户是否有操作,应该可行吧,不过这样就破坏了kuix的独立性了

我想用kuix框架,在kuix框架里对事件使用canvas进行了捕获处理,所以要实现定时执行的功能,需要对kuix的canvas进行修改,使用多线程+定时器,应该可以实现吧
5 楼 shappy1978 2010-08-16  
有想法就去尝试修改,何必浪费时间等待答案?我的结论就是不推荐,但是确实有需求应该可以做到
6 楼 goblin_god 2010-08-26  
有一个问题想请教。我用了DataProvider里面的dispatchItemsUpdateEvent这个方法来动态的改变界面,界面是可以改变,但是它是以增量的形式在改变,先前的数据也还保留在界面上的,这个问题应该怎么解决啊?
7 楼 bruce0601 2010-09-30  
有个小问题,现在设计个UI界面,需要有多个tab页,每个tab页下方有9个图标,3*3排列,在点击“右键”时,想把焦点移动到右边的icon上,结果现在的实现是焦点,移动到了右边的tab页上,看了看源代码,不知从哪下手,请教大侠问如何修改?
8 楼 shappy1978 2010-10-08  
tab好像有翻页的快捷键设置的,先试试这个,其他的估计不好改
9 楼 shappy1978 2010-10-08  
这也是个切入源码的点,另外拦截右方向键的话会导致没有触摸屏的手机无法切换焦点,一搬还是不推荐啊

    
[2] 运用BinCompiler将资源文件打包成二进制文件
    来源: 互联网  发布时间: 2014-02-18
使用BinCompiler将资源文件打包成二进制文件

版权申明:http://yarin.iteye.com/blog/453262  

 

在开发游戏时,总是要使用很多的资源文件,比如:图片、音乐等。而我们经常会遇到一些商业游戏中都看不到这些资源文件,那是因为商业游戏,一般都会将这些资源文件打包成二进制的文件,然后在程序中读取,并使用。这样的游戏看上去更显得专业一些,本文我们就来学习一个最简单的将资源文件打包成二进制文件的方法——使用BinCompiler将资源文件打包成二进制文件。

 

所需工具:BinCompiler(见附件)

 

运行“BinCompiler.exe”,指定要打包的资源文件的路径,和输出二进制文件的路径,如下图所示。



  

点击create按钮,即在我们制定的位置产生一个bin文件,当然在这个bin文件所在目录还会产生一个index.txt文件。我们在程序中读取这些资源时,需要使用这个index.txt。index.txt文件如下所示:

FName	Index	Pos	Size
A_04.png	0	0	4141
A_03.png	1	4145	3802
A_02.png	2	7951	3813
A_01.png	3	11768	3959

接下来我们可以使用BinReader.java文件中的两个方法来读取这些资源文件了。

代码清单:BinReader.java

/*******************************************************************************
 * Reads a file from the BIN file and return data as a byte buffer
 *******************************************************************************/
public byte[] readFile(String binfile, int pos)
{
	byte buffer[];
	int len;

	try {

		InputStream is = Class.getClass().getResourceAsStream("/" + binfile);

		is.skip(pos);

		len  = (is.read() & 0xFF) << 24;
		len  |= (is.read() 0xFF) << 16;
		len  |= (is.read() & 0xFF) << 8;
		len  |= (is.read() & 0xFF);

		buffer = new byte[len];
	
		is.read(buffer, 0, buffer.length);

		is.close();
		is = null;
	
		System.gc();
	} catch (Exception e) {
		buffer = null;
		e.printStackTrace();
		System.gc();
		return null;
	}

	return buffer;
}

/*******************************************************************************
 * Reads a file from the BIN file and return data as an Image
 *******************************************************************************/
public Image readImage(String binfile, long pos)
{
	byte buffer[];
	long len;

	try {
		InputStream is = Class.getClass().getResourceAsStream("/" + binfile);
		
		is.skip(pos);
		
		len  = (is.read() & 0xFF) << 24;
		len  |= (is.read() 0xFF) << 16;
		len  |= (is.read() & 0xFF) << 8;
		len  |= (is.read() & 0xFF);

		buffer = new byte[len];
	
		is.read(buffer, 0, buffer.length);

		is.close();
		is = null;
	
		System.gc();
	} catch (Exception e) {
		buffer = null;
		e.printStackTrace();
		System.gc();
		return null;
	}

	return Image.createImage(buffer, 0, buffer.length);
}

可以看出,这两个方法都只需要传入bin文件名和图片对应的pos,pos值就在我们上面所说的index.txt文件中去找对应的就可以了。 

例如我们读取一个图片

Image image = readimage("images.bin", 0);

可以看出,我们传入的pos的值是0,对应index.txt中就应该是A_04.png。 

很简单,可以直接使用就是了。谢谢大家支持。

1 楼 haishizi 2010-08-25  
很好。谢谢分享。
不过len  |= (is.read() 0xFF) << 16; 少了个&
哈哈。。。
2 楼 cbufeng 2010-10-14  
楼主,请问如果资源包中有子文件夹,应该如何处理?
3 楼 JACKDG2010 2012-04-27  
  楼主,android没有image这个类咋办???

    
[3] 已停机的动感地带的卡再度利用
    来源: 互联网  发布时间: 2014-02-18
已停机的动感地带的卡再次利用

现在向大家透露一个如何激活已停机卡的方法!?激活了以后就可以免费上网了。注:《本人动感地带的卡已测,通过》!
    首先,准备一张已经欠费停机的卡。注意重点:《1、需要知道卡的密码。2、卡没有被注销。3、停机时间不超过三个月》如果以上的都OK拉就可以开始刷卡拉!
   第一步:登陆中国移动网上营业厅,修改手机卡密码为949389是中国移动首字母代码的意思,这样做是为了延长系统搜寻时间,给行动带来便利。
  第二步:给手机卡挂失,拨打13800138000按照系统语音操作,输入卡号,输入密码949389然后系统会提示挂失成功。
  第三步:用另一张卡,发送QXGS#号码#密码到13800138000取消挂失操作。此时停机卡就被激活了,你可以尽情上网五天了,变废为宝了!切记:《不能打电话发短信,不用玩收费的东西的,不然系统就会察出来,结果还是要停机了。五天之后你又重复此操作,又能使用了。本人希望友友们都能使用无限量卡,因为移动赚了我们太多钱了!也该给点给我们分享了!对吧![本人鄙视看贴不回贴的人]希望大家支持.我现在上网用的卡就是这样搞的,虽然这个方法是很好但是就是有点麻烦。

    最后加一点点话.....
    
  
     在待机时按**21*999999#然后按拨打电话………成功拉…呼叫转接开启…现在别人打你电话,里面会提说你拨打的电话是空号…要么是没反应…快试吧……呵呵…试了要回来顶哦………解除按##21#,诺基亚手机测试成功。好累啊,终于写完了,!好东东大家多顶啊!

1 楼 花月痕 2009-12-10  
报怀疑的态度决定试一下
2 楼 wangjin0471 2009-12-11  
停机了就没法挂失
3 楼 energykey 2009-12-11  
都发这里了,相信移动的javaeyer早就通报上去了。
4 楼 zhangertong 2009-12-11  
停机了还怎么修改密码啊? 这明显矛盾嘛!
5 楼 天一 2009-12-11  
要被判刑。

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3