当前位置:  编程技术>移动开发
本页文章导读:
    ▪给数字键盘加下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的包是用来设计有游戏用的。它提供了游戏设计的基础控件,比如双缓冲,精灵,图层控制器等基础设施,这些设施可以方便我们的设计,比如双缓冲可以让游戏执行流畅,精灵等,可以更好的控制角色。
说白了。动画的效果其实就是一幅幅图片按照指定的时间一幅幅的换图片而已。
好了。看代码吧。
java 代码
  • 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();
  • }
  • }
  • }
  • java 代码
  • 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();
  • }
  • }
  • 1 楼 whycloud 2006-11-28  
    我怎么感觉这里面没有用到GAME包呢?
    这效果我觉得有一个非常的好的教程代码
    是那个foxdonw的教程,如果用GAME包的话那个
    有一个做"撑过20秒"的教程也非常有帮助
    2 楼 whycloud 2006-11-28  
    忘记一点,在MIDP2中可以设置关于双缓冲的。但是在MIDP规范中并没有强制要求一定要设备支持,所以如果是MIDP2设置双缓冲的话,一定要判断设备是否支持
    3 楼 wuhua 2006-11-28  
    对啊。上面的例子我并没有用到game的包。
    都是在Canvas中绘制的。
    其实自己都可以实现双缓冲功能。只是看看有没有这个必要。
    呵呵
    4 楼 wuhua 2006-11-28  
    whycloud 写道
    忘记一点,在MIDP2中可以设置关于双缓冲的。但是在MIDP规范中并没有强制要求一定要设备支持,所以如果是MIDP2设置双缓冲的话,一定要判断设备是否支持


    对了。兄台可以在这里加上一段关于怎么判断是否支持双缓冲码?
    5 楼 半路出家 2006-11-28  
    wuhua 写道
    对啊。上面的例子我并没有用到game的包。
    都是在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,然后在上面做些事情啊。
    对了。你有设计游戏码
    10 楼 wuhua 2006-11-28  
    哈哈。楼上的你自己实现过双缓冲码?
    实现是不是先创建一个可绘制的Image,然后在上面做些事情啊。
    对了。你有设计游戏码
    11 楼 lordhong 2006-11-29  
    基本上REPAINT()需要改变的GRAPHICS的部分.
    去年做了几个业余的很弱智的游戏...MOTO V3上测试过... 在CSDN还被发在首页连接上... =.=# 爆汗...
    12 楼 whycloud 2006-11-29  
    wuhua 写道
    哈哈。楼上的你自己实现过双缓冲码?
    实现是不是先创建一个可绘制的Image,然后在上面做些事情啊。
    对了。你有设计游戏码

    是的,就是你说的那样
    不过我自己没手动在J2ME上实现过,在J2SE上做过
    游戏设计过两个都是3D方面的一个游戏主体完成了
    另一个做到一半的时候硬盘坏掉了,弄的本来说好要把第二个弄完给mingjava做教程的,最后也没完成……
    13 楼 wuhua 2006-11-29  
    whycloud 写道
    wuhua 写道
    哈哈。楼上的你自己实现过双缓冲码?
    实现是不是先创建一个可绘制的Image,然后在上面做些事情啊。
    对了。你有设计游戏码

    是的,就是你说的那样
    不过我自己没手动在J2ME上实现过,在J2SE上做过
    游戏设计过两个都是3D方面的一个游戏主体完成了
    另一个做到一半的时候硬盘坏掉了,弄的本来说好要把第二个弄完给mingjava做教程的,最后也没完成……
    我以前也写过一个玛丽赛跑的游戏,那个游戏很弱智的。而起碰撞算法实现的不好。机会是没碰到就倒下了。
    14 楼 whycloud 2006-11-29  
    我那个完成主体的是一个射箭的游戏,就实现了一个抛物飞行,一个计算环数
    等有时间的时候整理一下发出来吧
    15 楼 fins 2006-12-01  
    在这里遇到喜欢游戏编程的不容易啊 呵呵
    又搞游戏 又j2ee的人不多 加你做好友了  快通过啊 呵呵
    16 楼 wuhua 2006-12-01  
    哈哈。我刚才也看了你的那个游戏,感觉不错。

        
    最新技术文章:
    ▪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