说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Android加速感应器开发平衡球代码解析

HTML文档下载 WORD文档下载 PDF文档下载
Android加速感应器开发平衡球代码解析

作者:Android开发网


   如何使用Android的加速感应器开发一个控制铁球滚动的游戏:

public class AccelerometerPlayActivity extends Activity {

    private SimulationView mSimulationView; //游戏主显示View
    private SensorManager mSensorManager; //感应器管理类
    private PowerManager mPowerManager; //电源控制,比如防锁屏
    private WindowManager mWindowManager; 
    private Display mDisplay;
    private WakeLock mWakeLock;

     @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

         mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); // 实例化感应器管理类

        mPowerManager = (PowerManager) getSystemService(POWER_SERVICE);

        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        mDisplay = mWindowManager.getDefaultDisplay(); //为了获取屏幕的DPI级别

        mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass()
                .getName()); //处理屏幕防止锁屏

        mSimulationView = new SimulationView(this);
        setContentView(mSimulationView); //设置游戏View
    }

    @Override
    protected void onResume() {
        super.onResume();
         mWakeLock.acquire();  //恢复时解除锁屏

        mSimulationView.startSimulation();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mSimulationView.stopSimulation(); //Activity切出去时停止画面更新

        mWakeLock.release();
    }

    class SimulationView extends View implements SensorEventListener {
        private static final float sBallDiameter = 0.004f; //设置小球直径
        private static final float sBallDiameter2 = sBallDiameter * sBallDiameter;

        private static final float sFriction = 0.1f; //摩擦系数

        private Sensor mAccelerometer;
        private long mLastT;
        private float mLastDeltaT;

        private float mXDpi;
        private float mYDpi;
        private float mMetersToPixelsX;
        private float mMetersToPixelsY;
        private Bitmap mBitmap; //小球素材
        private Bitmap mWood; //背景使用木头
        private float mXOrigin;
        private float mYOrigin;
        private float mSensorX;
        private float mSensorY;
        private long mSensorTimeStamp;
        private long mCpuTimeStamp;
        private float mHorizontalBound;
        private float mVerticalBound;
        private final ParticleSystem mParticleSystem = new ParticleSystem();

        class Particle {
            private float mPosX;
            private float mPosY;
            private float mAccelX;
            private float mAccelY;
            private float mLastPosX;
            private float mLastPosY;
            private float mOneMinusFriction;

            Particle() {
                final float r = ((float) Math.random() - 0.5f) * 0.2f;
                mOneMinusFriction = 1.0f - sFriction + r;
            }

            public void computePhysics(float sx, float sy, float dT, float dTC) {
                final float m = 1000.0f; // mass of our virtual object
                final float gx = -sx * m;
                final float gy = -sy * m;

               final float invm = 1.0f / m;
                final float ax = gx * invm;
                final float ay = gy * invm;

                final float dTdT = dT * dT;
                final float x = mPosX + mOneMinusFriction * dTC * (mPosX - mLastPosX) + mAccelX
                        * dTdT;
                final float y = mPosY + mOneMinusFriction * dTC * (mPosY - mLastPosY) + mAccelY
                        * dTdT;
                mLastPosX = mPosX;
                mLastPosY = mPosY;
                mPosX = x;
                mPosY = y;
                mAccelX = ax;
                mAccelY = ay;
            }

            public void resolveCollisionWithBounds() {
                final float xmax = mHorizontalBound;
                final float ymax = mVerticalBound;
                final float x = mPosX;
                final float y = mPosY;
                if (x > xmax) {
                    mPosX = xmax;
                } else if (x < -xmax) {
                    mPosX = -xmax;
                }
                if (y > ymax) {
                    mPosY = ymax;
                } else if (y < -ymax) {
                    mPosY = -ymax;
                }
            }
        }

        class ParticleSystem { //收集取样感应器数据来绘制小球位置
            static final int NUM_PARTICLES = 15;
            private Particle mBalls[] = new Particle[NUM_PARTICLES];

            ParticleSystem() {
                    for (int i = 0; i < mBalls.length; i++) {
                    mBalls[i] = new Particle();
                }
            }

            private void updatePositions(float sx, float sy, long timestamp) {
                final long t = timestamp;
                if (mLastT != 0) {
                    final float dT = (float) (t - mLastT) * (1.0f / 1000000000.0f);
                    if (mLastDeltaT != 0) {
                        final float dTC = dT / mLastDeltaT;
                        final int count = mBalls.length;
                        for (int i = 0; i < count; i++) {
                            Particle ball = mBalls[i];
                            ball.computePhysics(sx, sy, dT, dTC);
                        }
                    }
                    mLastDeltaT = dT;
                }
                mLastT = t;
            }

            public void update(float sx, float sy, long now) {
                updatePositions(sx, sy, now);

                  final int NUM_MAX_ITERATIONS = 10;

                boolean more = true;
                final int count = mBalls.length;
                for (int k = 0; k < NUM_MAX_ITERATIONS && more; k++) {
                    more = false;
                    for (int i = 0; i < count; i++) {
                        Particle curr = mBalls[i];
                        for (int j = i + 1; j < count; j++) {
                            Particle ball = mBalls[j];
                            float dx = ball.mPosX - curr.mPosX;
                            float dy = ball.mPosY - curr.mPosY;
                            float dd = dx * dx + dy * dy;
                            // Check for collisions
                            if (dd <= sBallDiameter2) {
                                dx += ((float) Math.random() - 0.5f) * 0.0001f;
                                dy += ((float) Math.random() - 0.5f) * 0.0001f;
                                dd = dx * dx + dy * dy;
                                // simulate the spring
                                final float d = (float) Math.sqrt(dd);
                                final float c = (0.5f * (sBallDiameter - d)) / d;
                                curr.mPosX -= dx * c;
                                curr.mPosY -= dy * c;
                                ball.mPosX += dx * c;
                                ball.mPosY += dy * c;
                                more = true;
                            }
                        }
                        curr.resolveCollisionWithBounds();
                    }
                }
            }

            public int getParticleCount() {
                return mBalls.length;
            }

            public float getPosX(int i) {
                return mBalls[i].mPosX;
            }

            public float getPosY(int i) {
                return mBalls[i].mPosY;
            }
        }

        public void startSimulation() {
            mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
        }

        public void stopSimulation() { //暂停时主要是停掉感应器
            mSensorManager.unregisterListener(this);
        }

        public SimulationView(Context context) {
            super(context);
            mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); //实例化加速感应器

            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics); //分辨率获取
            mXDpi = metrics.xdpi;
            mYDpi = metrics.ydpi;
            mMetersToPixelsX = mXDpi / 0.0254f;
            mMetersToPixelsY = mYDpi / 0.0254f;

            Bitmap ball = BitmapFactory.decodeResource(getResources(), R.drawable.ball);
            final int dstWidth = (int) (sBallDiameter * mMetersToPixelsX + 0.5f);
            final int dstHeight = (int) (sBallDiameter * mMetersToPixelsY + 0.5f);
            mBitmap = Bitmap.createScaledBitmap(ball, dstWidth, dstHeight, true); //根据屏幕分辨率来设置素材的显示缩放比例

            Options opts = new Options();
            opts.inDither = true;
            opts.inPreferredConfig = Bitmap.Config.RGB_565;
            mWood = BitmapFactory.decodeResource(getResources(), R.drawable.wood, opts);
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) { //当View有变化时,Android123提示比如说横竖屏切换
            mXOrigin = (w - mBitmap.getWidth()) * 0.5f;
            mYOrigin = (h - mBitmap.getHeight()) * 0.5f;
            mHorizontalBound = ((w / mMetersToPixelsX - sBallDiameter) * 0.5f);
            mVerticalBound = ((h / mMetersToPixelsY - sBallDiameter) * 0.5f);
        }

        @Override
        public void onSensorChanged(SensorEvent event) { //感应器数据有变化时
            if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
                return;
            switch (mDisplay.getRotation()) {
                case Surface.ROTATION_0:
                    mSensorX = event.values[0];
                    mSensorY = event.values[1];
                    break;
                case Surface.ROTATION_90:
                    mSensorX = -event.values[1];
                    mSensorY = event.values[0];
                    break;
                case Surface.ROTATION_180:
                    mSensorX = -event.values[0];
                    mSensorY = -event.values[1];
                    break;
                case Surface.ROTATION_270:
                    mSensorX = event.values[1];
                    mSensorY = -event.values[0];
                    break;
            }

            mSensorTimeStamp = event.timestamp;
            mCpuTimeStamp = System.nanoTime();
        }

        @Override
        protected void onDraw(Canvas canvas) { //主要的小球绘制

            canvas.drawBitmap(mWood, 0, 0, null); //先画出背景

            final ParticleSystem particleSystem = mParticleSystem;
            final long now = mSensorTimeStamp + (System.nanoTime() - mCpuTimeStamp);
            final float sx = mSensorX;
            final float sy = mSensorY;

            particleSystem.update(sx, sy, now);

            final float xc = mXOrigin;
            final float yc = mYOrigin;
            final float xs = mMetersToPixelsX;
            final float ys = mMetersToPixelsY;
            final Bitmap bitmap = mBitmap;
            final int count = particleSystem.getParticleCount();
            for (int i = 0; i < count; i++) {
                final float x = xc + particleSystem.getPosX(i) * xs;
                final float y = yc - particleSystem.getPosY(i) * ys;
                canvas.drawBitmap(bitmap, x, y, null);
            }

            invalidate();
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    }
}

 整个例子可以在Android 2.3 SDK的Samples文件夹下找到,这个小铁球的例子可以帮助我们改造为平衡球游戏。

iOS开发者必备:四款后端服务工具 市场研究公司:iPhone5C/5S成本分别是173、199美元 对软件开发有利的5个敏捷编程方法 移动端性能大比拼:CSS Sprites vs. Data URI 三大峰会七大论坛,2013移动开发者大会将于11月在京举行 黑莓47亿美元收购的背后 微软或成最大受益者 搜索大战升级:360搜狗相互起诉对方不正当竞争 诺基亚将于10月22日发布6款新产品 平板Lumia 2520等 从17美元到50美元 Facebook股价上涨背后的两大关键 12个理由:为什么我会认为Android比iOS 7好! AMD推 &amp;quot;Mantle&amp;quot; API 欲释放GPU全部潜能 Salesforce架构:日事务过13亿,2.4万TPS的数据库峰值 久违的iOS,新鲜的SDK,豌豆荚发布云相册 喜大普奔:谷歌15岁了,生日快乐! 传福特CEO Alan Mulally目前最有希望执掌微软 微软计划将WP8和Win8应用商店合并?太好了! 响应开发者要求:Kinect for Windows SDK 1.8发布 OpenStack基金会BD总监:希望有更多的中国公司加入 CTO如何避免决策失控(三):从CEO角度看CTO的应对能力 IT界需求最旺的16项技能 PMC发布8系列RAID卡 找准国内互联网企业需求 早Google一步,eBay数据中心率先搭载了火星上使用的技术 目标专利2000,技术研发人员占55%,斐讯的厚积薄发 SwiftStack CEO:分布式存储的未来 触控陈昊芝:“好声音”标王对移动游戏未来的预测 Office将更强大:微软正开发Office Reader和Office Lens 百度技术专家详解Clouda 并称计划推出相应UI解决方案 少年才俊:看IT界8个不到20岁的科技公司创始人 Oracle与Freescale展开深度合作,Java或将一统物联网? 探秘Google新搜索引擎算法Hummingbird的16个疑惑 如何在开发项目里进行自我激励! 刚毕业的计算机本科生怎么提高自己的工作经验!!! 图标变色问题 急!!程序做完了,但放到客户机上无法连接服务器上数据库??? 关于.net 2003+win2003 server下使用多媒体控件的问题,谢谢 布什总统给12岁中国小姑娘的回信 那里有VC6.0内幕技术的第五版下载 发送的问题[初学] 数据表加密 关于DELPHI6操作INI文件的问题! 散分啦,快来抢分!谁能提供计算机中英文论文一篇,来者都必有分! 求银行家问题的C语言解法 请问,在中国,VC程序员的主要工作是什么? 菜鸟问题,ADO添加记录已经在浏览器上看到结果了,可是实际的ACCESS数据库却没变呢 怎么刷新整个窗口包括标题栏 订购了程序员全年杂志,不是送一本书吗?都已经出版这么久了,怎么还没有送过来呢?! 散分啦,快来抢分!谁能提供计算机中英文论文一篇,来者都必有分! 两个combobox关联显示(在线等) 关于我的yamaha 声卡在2003 不能用的问题 我用WIN98浏览器下载的文件都有错误。 Tomcat中的发行目录怎么设置! 初学者的问题. 关于最终用户许可协议 JPG图片怎么能实现部分透明? 如何用VB.net编写控件 关于ASP中对文本文件的skip(n)操作到底怎么做 关于SQL的菜鸟问题 大家现在用什么软件管理源代码啊。60分相送。 今年是考C 还是C++啊? 怎样判断一个线程已结束 我用new新建了若干个基类是cwnd的窗体cmywnd,然后想在每个窗体内定时让它们自己消失,我应该用什么函数?是destroywindow吗?最后还用不 vs.net 2003 中文版 的帮助MSDN是不是有问题? 清问这个SQL有什么错,还是FB1。0不支持? 是我的usb口的问题吗?? 怪事 急 路径绝对正确,为什么服务器只能下载rar 不能下载EXE 文件 已知,f(x)=arctanx,其二导f''(x)=(-2x)/(1+x*x)^2,f''(0)=0,试: 一个有趣的问题,请大家看一个小程序,来者有分。 这个写者优先是不是有问题????麻烦看一下,小弟实在看不出错在哪里 请问有没有办法得到[系统托盘]上其它程序的所显示的Icon?? 已知,十六进制(34.6)16=(28.75)10(十进制) 高手推荐几个Palm开发的网站?最好有源代码! 请教一个问题 触发器(加密)内容可以查看吗 怪,文件路径绝对正确,EXE文件不能下载,其它格式正常。 在编写的用户控件中公开所引用控件的事件怎么实现啊 这是我的usb口的问题吗? 考程序员前想先考全国三级,请问三级种哪个科目考C编程?何时报名? 调用DLL时候出现Bad Dll calling convention错误,为什么?代码如下 如何建立一个小数据库? 我想问下,网络技术到底是指什么??? 为什么会出现这个问题呢??急救??? 在不同操作系统出现不能正常运行的问题,和默认字体语系乱码问题 如图,等圆圆心O1与圆心O2相外切,并且都内切于圆心O.若三角形OO1O2的周长为24cm,则圆心O的半径为——cm 研究物理问题究竟选择惯性系还是非惯性系到底对问题有什么影响 卤素灯和氙气灯区别 标本是什么意思? 求解答一个情感上的问题...和女友分手后知道她怀孕了,我给了她钱做人流,她做了人流后没照顾好自己,第三天喝了酒,又谈了一个男朋友不知道有没有发生关系,后来她因为这些发炎了要动手 四线(2根火线1根零线1根接地线)应急电源怎样接普通照明灯具? 人类与基因锁吗 南极洲包围哪些洋? 请问下,家里的三基色灯管坏了,后来,我把镇流器不晓得也拆了.请问下镇流器怎么样对灯管? 已知皮带传送机的皮带与水平方向的夹角为α,将质量为m的小物块放在皮带传送机上,随皮带一起向下以加速度a做匀加速直线运动,则下列说法中正确的是().①小物块所受到的支持力的方向 眼睛一闭上,感觉有一个东西一会变大,一会变小是怎么回事患者信息:男 27岁 病情描述(发病时间、主要症状等):因为工作忙,再加上一些其他的压力,老感觉睡觉的时候,只要眼睛一闭上,就有 三项四线漏电保护器怎么接下火线? 《尼采生存哲学》是文章集合吗《尼采生存哲学》这本书是尼采好多本书中精选的文章集合吗?每个目录好像都是尼采的一本书名 是不是从好多书中精选的文章 集合到这一本书里? 什么是酶反应进程曲线 一天上有十个太阳,为什么后羿只射下九个? 那个好心人 帮我看看撒 找哈嘛 有急用的 读“尼采生存哲学”有感 有找这类的文章嘛 小女子先在这谢老 人造磁铁是怎样做的? 天上有十个太阳为什么后羿只射下九个代表什么数字 中国人均经济发展的和发达国家一样要多久,到时国民素质会提高吗,社会会更民主吗 buy trac什么意思 一物体在平行于斜面向上的恒力 F 作用下,由静止从底端沿光滑的斜面向...一物体在平行于斜面向上的恒力 F 作用下,由静止从底端沿光滑的斜面向 上做匀加速直线运动,经时间 t 力 F 做功为 60 如果发展中国家是资本主义社会会怎么样? trac...back.. (1/3)一物体在平行于斜面向上的恒力 F 作用下,由静止从底端沿光滑的斜面向 上做匀加速直线运动,经时...(1/3)一物体在平行于斜面向上的恒力 F 作用下,由静止从底端沿光滑的斜面向 上做匀加 (1/2)如图所示,一箱苹果沿着倾角为&的光滑斜面加速下滑,在箱子正中央夹有一只质量为m的苹果,它受到...(1/2)如图所示,一箱苹果沿着倾角为&的光滑斜面加速下滑,在箱子正中央夹有一只质量为m #include #include #include using namespace std;void main(){int i=0;using std::cin;using std::cout;using std::string;string s;cout 2-3的基因型为什么一定是aaBB 酶-底物复合物随着时间浓度的变化是什么?如题 java一个小错误,帮忙看下啊,超级感谢import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.CaretEvent;import javax.swing.event.CaretListener;public class NumberFrame extends JFrame implements CaretListener “我”还能用什么语言?请进来比如说我还能用俺,吾,汝辈,哀家,朕,在下……请问还能用什么?不要重复我说的. 一道难死聪明人的简单1+1的数学题有朋友三人相约去吃饭,一共花了五块五.三人都只带了两块钱,于是就都掏了出来,共6块给了老板,还大方地说:别找了.就走了.老板不爱财,拿出5毛钱叫小伙计 酶的活性中心包括 哪 两个功能部位,其中 什么 直接与底物结合,决定酶的专一性,是发生化学变化的部位, 曲线运动的一个基础小问题1曲线运动是加速运动,但加速度可以恒定2加速度与速度角度等于90度,不加不减不加不减不是匀速吗,为什么两个理论会矛盾 谁知道真空状态下电磁感应是否会减弱或者增强? 除愈创木酚外,还有什么化合物可作为过氧化物酶的底物 如何申请保障性住房?需要具备什么条件? 已知○o1与○o2外切与点p,○o与○o1 ○o2分别内切于点M 、N,△O1O2O的周长为18cm 求○o得周长 . 酶在催化将底物降解后,酶的形状会变化吗 评选工程师得需要什么样的资格和条件? 苹果5S屏幕屏幕什么地方换便宜质量又好?新买的5S手机屏幕摔烂了,据说到手机专卖店换一个屏幕都要一千多换哦,鉴于手机是新的,价值4000多元,本人决定换个屏幕,不知道哪里换屏幕便宜点? 底物与酶的加入次序改变有什么影响 已知甲、乙两城相距260千米,面包车和小轿车同时分别从甲、乙两城出发,几小时能相遇 如图,等圆⊙O1与若⊙O2相外切,并且都内切与⊙O,若△OO1O2的周长为24CM,则⊙O的半径为多少厘米 一个小疑惑.如果一个多项式中的每一项的系数要不是正的要不就是负的,请问公因式我是取正的还是负的? 交流阀用电磁铁说明书上的通电持续率是什意思 我要怎么修炼才能解开基因锁? 小疑惑----男友之前暗恋过一个女生,表白后没有在一起.跟我恋爱一年多后,今天他说,如果拿10分来衡量,那个女生占4分我占6分.我该怎么理解他这句话?麻烦大家给点意见啊·····谢谢. 阀用电磁铁为什么老烧线圈?电压220V 吸力5.5Kg 行程8mm 怎样开启基因锁? 关于物理的一个基本小疑惑!在电路中,为什么选用电阻小的做导体,是不是电阻小,电流就大?可是我有一点不明白:欧姆定律不是说必须有一个量一定,才能算出2个量的关系吗?可是在电路中,什 如图,已知∠1=∠2,∠C=∠D,求证:∠A=∠F 怎么开启基因锁第一层啊..只要前几层的开启法,第五层不要.我不想毁灭世界 急!求疑惑的一个小片段就是当大家感到很怀疑的时候.描写一下场面200字,就行了不用结尾. 磁铁是怎么做出来的 解开基因锁一共有几层都有什么用处, 恋爱中的小疑惑她说她以前向别人告白都很主动,都是直接亲上去的,可是面对我却很害羞,不知道怎么办才好,表白的时候很害羞,和我见面也会很害羞.这是为什么?我是第一次,所以有谁可以来 三相四线电源用几根火线三相四线电源中为什么要用三条火线,应用到设备时用一根还是三根都用呢 圆周角 找出图中∠A,∠B,∠C,∠D所对的弧但我不会画图 一个国家的碳排放量,国际上有限制吗?多排少排的,别人怎么会知道?怎么还能有碳排放交易了? 3项电压的2条火线是怎么来的?是不是从220V交流电压的火线上再分一根火线出来的? 特大生产销售假药告破 上万支假狂犬疫奥地利媒体称奥也遭到美国情报机构监听中国和伊朗签署互设文化中心谅解备忘录马来西亚外长:监听破坏盟友关系马来西亚外长:监听破坏盟友关系德国与巴西共同向联合国提交有关反监控白岩松评伤医事件频发:欠账改革让医生五角大楼否认美日制定“钓鱼岛共同防卫埃及宣布14日起解除紧急状态和宵禁印度首都新德里一成衣厂发生大火 至少印度发生火车撞人事故至少8人死公安部破获特大制售假药案 查获假药1阿根廷:监狱财政吃紧 多人“捡漏”越澳大利亚中国学者举行优秀论文报告会巴基斯坦全国高度警戒防巴塔袭击海军实兵演习执行导演:远海训练只会加中国以主宾国身份亮相伊斯坦布尔国际书甘肃甘南部分医用设备闲置曝光 卫生厅老挝失事客机黑匣子全部打捞出水美军无人机剿灭巴基斯坦塔利班头目 塔德国与巴西共同向联合国提交有关反监控怀疑女同事勾引父亲 女子发PS照诽谤42名非洲难民在也门海域溺亡 死亡人伊拉克希拉爆炸死亡人数升至34人吴思科呼吁巴以推动和谈取得实质性进展张德江:今年继续加强和改进代表服务工范文芳清新写真曝光为给朋友出气 男子电话打到北京谎报“中国政府赴马来西亚联合工作组启程离京张德江:今年纪念全国人民代表大会成立决定国家治理能力高低的三要素丁俊晖海口赛大热 夺冠赔率与罗伯逊塞亳州51项举措防治大气污染全国政协常委李毅中:破垄断要从大型央井冈山舰全速赶赴马航客机失联海域搜索中埃两国签署经济技术合作文件(高清组昌吉\"6·18\"特大交通事故案开促进公平正义深化检察改革对话教育部副部长刘利民:让家门口的学饮食警惕:煎鱼最易产生致癌物开盘:两市大幅低开 沪指跌0.76%青年作家姜萌现身合肥解读“中国式家庭
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘