当前位置: 编程技术>移动开发
本页文章导读:
▪给数字键盘加下Done按键 给数字键盘加上Done按键
默认的数字键盘没有Done按键,如下图:
KeyboardViewController.h
#import <UIKit/UIKit.h>
@interface KeyboardViewController: UIViewController {
UITextField *textField;
}
@end
Keyboa.........
▪ 一些与蓝牙相关的code 一些与蓝牙有关的code
注册Recevier
IntentFilter audioStateFilter = new IntentFilter();
audioStateFilter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
audioStateFilter.addAction(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED);
mRec.........
▪ 游戏中卡通的基础 游戏中动画的基础
全文请看
游戏中动画的基础
这篇文章是纯粹的个人看法。
游戏的基础是动画,想来大家都知道。这几天公司的项目都忙完了。很是无聊,所以就上网找了些资源,并写.........
[1]给数字键盘加下Done按键
来源: 互联网 发布时间: 2014-02-18
给数字键盘加上Done按键
默认的数字键盘没有Done按键,如下图:
KeyboardViewController.h
#import <UIKit/UIKit.h> @interface KeyboardViewController: UIViewController { UITextField *textField; } @end
KeyboardViewController.m
#import "KeyboardViewController.h" @implementation KeyboardViewController - (void)loadView { self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; self.view.backgroundColor = [UIColor groupTableViewBackgroundColor]; textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 200, 300, 26)]; textField.borderStyle = UITextBorderStyleRoundedRect; textField.keyboardType = UIKeyboardTypeNumberPad; textField.returnKeyType = UIReturnKeyDone; textField.textAlignment = UITextAlignmentLeft; textField.text = @"12345"; [self.view addSubview:textField]; [textField release]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardDidShowNotification object:nil]; } - (void)keyboardWillShow:(NSNotification *)note { UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom]; doneButton.frame = CGRectMake(0, 163, 106, 53); doneButton.adjustsImageWhenHighlighted = NO; [doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal]; [doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted]; [doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside]; UIWindow *tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1]; UIView *keyboard; for(int i = 0; i < [tempWindow.subviews count]; i++) { keyboard = [tempWindow.subviews objectAtIndex:i]; if(([[keyboard description] hasPrefix:@"<UIPeripheralHostView"] == YES) || ([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES)) [keyboard addSubview:doneButton]; } } - (void)doneButton:(id)sender { [textField resignFirstResponder]; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [textField release]; [super dealloc]; } @end
效果图:
[2] 一些与蓝牙相关的code
来源: 互联网 发布时间: 2014-02-18
一些与蓝牙有关的code
注册Recevier
IntentFilter audioStateFilter = new IntentFilter(); audioStateFilter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED); audioStateFilter.addAction(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED); mReceiver = new VoiceDialerBroadcastReceiver(); registerReceiver(mReceiver, audioStateFilter);
取消Receiver
unregisterReceiver(mReceiver);
Receiver的实现
private class VoiceDialerBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1); if (false) Log.d(TAG, "HEADSET STATE -> " + state); if (state == BluetoothProfile.STATE_CONNECTED) { if (device == null) { return; } mBluetoothDevice = device; updateBluetoothParameters(true); } else if (state == BluetoothProfile.STATE_DISCONNECTED) { mBluetoothDevice = null; updateBluetoothParameters(false); } } else if (action.equals(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED)) { int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1); int prevState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, -1); if (state == BluetoothHeadset.STATE_AUDIO_CONNECTED && mWaitingForScoConnection) { // SCO channel has just become available. mWaitingForScoConnection = false; if (mWaitingForTts) { // still waiting for the TTS to be set up. } else { // we now have SCO connection and TTS, so we can start. mHandler.postDelayed(new GreetingRunnable(), FIRST_UTTERANCE_DELAY); } } else if (prevState == BluetoothHeadset.STATE_AUDIO_CONNECTED) { if (!mWaitingForScoConnection) { // apparently our connection to the headset has dropped. // we won't be able to continue voicedialing. if (false) Log.d(TAG, "lost sco connection"); mHandler.post(new ErrorRunnable( R.string.headset_connection_lost)); exitActivity(); } } } } }
蓝牙语音识别
mBluetoothHeadset.startVoiceRecognition(mBluetoothDevice); mBluetoothHeadset.stopVoiceRecognition(mBluetoothDevice);
mAdapter = BluetoothAdapter.getDefaultAdapter(); if (BluetoothHeadset.isBluetoothVoiceDialingEnabled(this) && mAdapter != null) { if (!mAdapter.getProfileProxy(this, mBluetoothHeadsetServiceListener, BluetoothProfile.HEADSET)) { Log.e(TAG, "Getting Headset Proxy failed"); } } mAdapter.closeProfileProxy(BluetoothProfile.HEADSET, mBluetoothHeadset);
private BluetoothProfile.ServiceListener mBluetoothHeadsetServiceListener = new BluetoothProfile.ServiceListener() { public void onServiceConnected(int profile, BluetoothProfile proxy) { if (false) Log.d(TAG, "onServiceConnected"); mBluetoothHeadset = (BluetoothHeadset) proxy; List<BluetoothDevice> deviceList = mBluetoothHeadset.getConnectedDevices(); if (deviceList.size() > 0) { mBluetoothDevice = deviceList.get(0); int state = mBluetoothHeadset.getConnectionState(mBluetoothDevice); if (false) Log.d(TAG, "headset status " + state); // We are already connnected to a headset if (state == BluetoothHeadset.STATE_CONNECTED) { updateBluetoothParameters(true); return; } } updateBluetoothParameters(false); } public void onServiceDisconnected(int profile) { mBluetoothHeadset = null; } };
Detect the connection status of a paired Bluetooth headset to the phone. In Android 3.0 (API level 11) "BluetoothHeadset" class has "isAudioConnected()" method.
adapter = BluetoothAdapter.getDefaultAdapter(); adapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET); private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() { public void onServiceConnected(int profile, BluetoothProfile proxy) { if (profile == BluetoothProfile.HEADSET) { mBluetoothHeadset = (BluetoothHeadset) proxy; } } public void onServiceDisconnected(int profile) { if (profile == BluetoothProfile.HEADSET) { mBluetoothHeadset = null; } } };
Use mBluetoothHeadset to call the functions on BluetoothHeadset.java
Note: Audio Connection is different from Connection.
BluetoothProfile.ServiceListener b = new BlueToothListener(); boolean profileProxy = BluetoothAdapter.getDefaultAdapter() .getProfileProxy(Handler.bot, b, BluetoothProfile.HEADSET); public class BlueToothListener implements ServiceListener { public static BluetoothHeadset headset; public static BluetoothDevice bluetoothDevice; @Override public void onServiceDisconnected(int profile) {// dont care headset = null; } @Override public void onServiceConnected(int profile, BluetoothProfile proxy) {// dont care try { Debugger.test("BluetoothProfile onServiceConnected "+proxy); if (proxy instanceof BluetoothHeadset) headset = ((BluetoothHeadset) proxy); else// getProfileProxy(Handler.bot, b, BluetoothProfile.HEADSET); return;// ^^ => NEVER List<BluetoothDevice> connectedDevices = proxy .getConnectedDevices(); for (BluetoothDevice device : connectedDevices) { Debugger.log("BluetoothDevice found :" + device); bluetoothDevice = device; int connectionState = headset.getConnectionState(bluetoothDevice); Debugger.log("BluetoothHeadset connectionState "+connectionState);//2 == OK boolean startVoiceRecognition = headset .startVoiceRecognition(device); if (startVoiceRecognition) { Debugger .log("BluetoothHeadset init Listener OK"); return; } else Notify.popup("Bluetooth headset can't start speech recognition"); } } catch (Exception e) { // } } } }
.
[3] 游戏中卡通的基础
来源: 互联网 发布时间: 2014-02-18
游戏中动画的基础
全文请看
游戏中动画的基础
这篇文章是纯粹的个人看法。
游戏的基础是动画,想来大家都知道。这几天公司的项目都忙完了。很是无聊,所以就上网找了些资源,并写两个动画的例子。在此贴出来,让大家把砖头砸我吧。^_^
j2me midp2.0有个game的包是用来设计有游戏用的。它提供了游戏设计的基础控件,比如双缓冲,精灵,图层控制器等基础设施,这些设施可以方便我们的设计,比如双缓冲可以让游戏执行流畅,精灵等,可以更好的控制角色。
说白了。动画的效果其实就是一幅幅图片按照指定的时间一幅幅的换图片而已。
好了。看代码吧。
package org.wuhua.game.timer;
import java.util.Timer;
import java.util.TimerTask;
/**
* 对Timer的包装
* @author wuhua
*/
public class TimerTaskManager {
private Timer _timer;
static TimerTaskManager instace;
public static TimerTaskManager getInstace() {
if (instace == null)
instace = new TimerTaskManager();
return instace;
}
public TimerTask add(Runnable runnable, long period) {
TimerTask task = new RunnableTimerTask(runnable);
long delay = period;
getTimer().schedule(task, delay, period);
return task;
}
void close() {
if (_timer != null) {
_timer.cancel();
_timer = null;
}
}
private Timer getTimer() {
if (_timer == null)
_timer = new Timer();
return _timer;
}
static class RunnableTimerTask extends TimerTask {
private Runnable _runnable;
RunnableTimerTask(Runnable runnable) {
_runnable = runnable;
}
public void run() {
_runnable.run();
}
}
}
package org.wuhua.game;
import java.io.IOException;
import java.util.TimerTask;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import org.wuhua.game.timer.TimerTaskManager;
/**
* 动画的主类
* @author wuhua
*/
public class Game extends Canvas implements Runnable{
private Image source;
private Image action[] = new Image[10];
private int bgcolor = 0x209C00;
private TimerTask task;
private static int next;
Game(){
try {
source = Image.createImage("/action.png");
} catch (IOException e) {
e.printStackTrace();
}
//切割图片
for(int i=0; i<5; i++){
action[i] = Image.createImage(source, 96*i, 0, 96, 60, 0);
}
for(int j=5; j<10; j++){
action[j] = Image.createImage(source, 96*(j-5), 102, 96, 80, 0);
}
//这个是用来执行动作的计时器。原理是要求经过0.2毫秒动一次
task = TimerTaskManager.getInstace().add(this, 150);
}
protected void paint(Graphics g) {
fillScreen(g);
paintAction(g);
}
private void fillScreen(Graphics g) {
g.setColor(0xFFFFFF);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
}
private void paintAction(Graphics g) {
if(next == 10)
next =0;
//如果绘制的图片是出雷电的时候,让人物停留在那里。这样的效果会好点
if(next>=5){
g.drawImage(action[4], 10*4, 0, Graphics.LEFT|Graphics.TOP);
}
g.drawImage(action[next], 10*next, 0, Graphics.LEFT|Graphics.TOP);
next++;
}
public void run() {
repaint();
}
}
对了。兄台可以在这里加上一段关于怎么判断是否支持双缓冲码?
对了。兄台可以在这里加上一段关于怎么判断是否支持双缓冲码?
刚一问还真想了半天,现在想起来了
在midp2中Canvas有一个public boolean isDoubleBuffered()方法来判断该设备是否支持二重缓冲,如果不支持还是需要手动实现的
是的,就是你说的那样
不过我自己没手动在J2ME上实现过,在J2SE上做过
游戏设计过两个都是3D方面的一个游戏主体完成了
另一个做到一半的时候硬盘坏掉了,弄的本来说好要把第二个弄完给mingjava做教程的,最后也没完成……
是的,就是你说的那样
不过我自己没手动在J2ME上实现过,在J2SE上做过
游戏设计过两个都是3D方面的一个游戏主体完成了
另一个做到一半的时候硬盘坏掉了,弄的本来说好要把第二个弄完给mingjava做教程的,最后也没完成……我以前也写过一个玛丽赛跑的游戏,那个游戏很弱智的。而起碰撞算法实现的不好。机会是没碰到就倒下了。
全文请看
游戏中动画的基础
这篇文章是纯粹的个人看法。
游戏的基础是动画,想来大家都知道。这几天公司的项目都忙完了。很是无聊,所以就上网找了些资源,并写两个动画的例子。在此贴出来,让大家把砖头砸我吧。^_^
j2me midp2.0有个game的包是用来设计有游戏用的。它提供了游戏设计的基础控件,比如双缓冲,精灵,图层控制器等基础设施,这些设施可以方便我们的设计,比如双缓冲可以让游戏执行流畅,精灵等,可以更好的控制角色。
说白了。动画的效果其实就是一幅幅图片按照指定的时间一幅幅的换图片而已。
好了。看代码吧。
java 代码
java 代码
1 楼
whycloud
2006-11-28
我怎么感觉这里面没有用到GAME包呢?
这效果我觉得有一个非常的好的教程代码
是那个foxdonw的教程,如果用GAME包的话那个
有一个做"撑过20秒"的教程也非常有帮助
这效果我觉得有一个非常的好的教程代码
是那个foxdonw的教程,如果用GAME包的话那个
有一个做"撑过20秒"的教程也非常有帮助
2 楼
whycloud
2006-11-28
忘记一点,在MIDP2中可以设置关于双缓冲的。但是在MIDP规范中并没有强制要求一定要设备支持,所以如果是MIDP2设置双缓冲的话,一定要判断设备是否支持
3 楼
wuhua
2006-11-28
对啊。上面的例子我并没有用到game的包。
都是在Canvas中绘制的。
其实自己都可以实现双缓冲功能。只是看看有没有这个必要。
呵呵
都是在Canvas中绘制的。
其实自己都可以实现双缓冲功能。只是看看有没有这个必要。
呵呵
4 楼
wuhua
2006-11-28
whycloud 写道
忘记一点,在MIDP2中可以设置关于双缓冲的。但是在MIDP规范中并没有强制要求一定要设备支持,所以如果是MIDP2设置双缓冲的话,一定要判断设备是否支持
对了。兄台可以在这里加上一段关于怎么判断是否支持双缓冲码?
5 楼
半路出家
2006-11-28
wuhua 写道
对啊。上面的例子我并没有用到game的包。
都是在Canvas中绘制的。
其实自己都可以实现双缓冲功能。只是看看有没有这个必要。
呵呵
都是在Canvas中绘制的。
其实自己都可以实现双缓冲功能。只是看看有没有这个必要。
呵呵
6 楼
whycloud
2006-11-28
恩,我回去找找,那个FoxDown的教程回头发到圈子里吧
不过那个一直就没找到作者
不过那个一直就没找到作者
7 楼
wuhua
2006-11-28
恩。好的。让大家也学习学习
8 楼
whycloud
2006-11-28
wuhua 写道
whycloud 写道
忘记一点,在MIDP2中可以设置关于双缓冲的。但是在MIDP规范中并没有强制要求一定要设备支持,所以如果是MIDP2设置双缓冲的话,一定要判断设备是否支持
对了。兄台可以在这里加上一段关于怎么判断是否支持双缓冲码?
刚一问还真想了半天,现在想起来了
在midp2中Canvas有一个public boolean isDoubleBuffered()方法来判断该设备是否支持二重缓冲,如果不支持还是需要手动实现的
9 楼
wuhua
2006-11-28
哈哈。楼上的你自己实现过双缓冲码?
实现是不是先创建一个可绘制的Image,然后在上面做些事情啊。
对了。你有设计游戏码
实现是不是先创建一个可绘制的Image,然后在上面做些事情啊。
对了。你有设计游戏码
10 楼
wuhua
2006-11-28
哈哈。楼上的你自己实现过双缓冲码?
实现是不是先创建一个可绘制的Image,然后在上面做些事情啊。
对了。你有设计游戏码
实现是不是先创建一个可绘制的Image,然后在上面做些事情啊。
对了。你有设计游戏码
11 楼
lordhong
2006-11-29
基本上REPAINT()需要改变的GRAPHICS的部分.
去年做了几个业余的很弱智的游戏...MOTO V3上测试过... 在CSDN还被发在首页连接上... =.=# 爆汗...
去年做了几个业余的很弱智的游戏...MOTO V3上测试过... 在CSDN还被发在首页连接上... =.=# 爆汗...
12 楼
whycloud
2006-11-29
wuhua 写道
哈哈。楼上的你自己实现过双缓冲码?
实现是不是先创建一个可绘制的Image,然后在上面做些事情啊。
对了。你有设计游戏码
实现是不是先创建一个可绘制的Image,然后在上面做些事情啊。
对了。你有设计游戏码
是的,就是你说的那样
不过我自己没手动在J2ME上实现过,在J2SE上做过
游戏设计过两个都是3D方面的一个游戏主体完成了
另一个做到一半的时候硬盘坏掉了,弄的本来说好要把第二个弄完给mingjava做教程的,最后也没完成……
13 楼
wuhua
2006-11-29
whycloud 写道
wuhua 写道
哈哈。楼上的你自己实现过双缓冲码?
实现是不是先创建一个可绘制的Image,然后在上面做些事情啊。
对了。你有设计游戏码
实现是不是先创建一个可绘制的Image,然后在上面做些事情啊。
对了。你有设计游戏码
是的,就是你说的那样
不过我自己没手动在J2ME上实现过,在J2SE上做过
游戏设计过两个都是3D方面的一个游戏主体完成了
另一个做到一半的时候硬盘坏掉了,弄的本来说好要把第二个弄完给mingjava做教程的,最后也没完成……
14 楼
whycloud
2006-11-29
我那个完成主体的是一个射箭的游戏,就实现了一个抛物飞行,一个计算环数
等有时间的时候整理一下发出来吧
等有时间的时候整理一下发出来吧
15 楼
fins
2006-12-01
在这里遇到喜欢游戏编程的不容易啊 呵呵
又搞游戏 又j2ee的人不多 加你做好友了 快通过啊 呵呵
又搞游戏 又j2ee的人不多 加你做好友了 快通过啊 呵呵
16 楼
wuhua
2006-12-01
哈哈。我刚才也看了你的那个游戏,感觉不错。
最新技术文章: