zoukankan      html  css  js  c++  java
  • 传感器实现仿微信摇一摇功能

    导语

    如今Android手机中,硬件中内嵌了很多传感器(比如加速度传感器,重力传感器,陀螺仪传感器,方向传感器,压力传感器,温度传感器等等),作为一名Android的程序猿,有必要去了解一下这些传感器,代码怎么使用以及如何运用到我们平时公司项目炫酷效果的开发。

    1、摇一摇效果图

    效果如下:界面有点丑,勿吐槽哈~关键是后面我们如何去实现这功能。

    2、简单介绍传感器

    如果你英文不错以及可以FQ访问的话,建议您不妨直接去谷歌官网看文档:https://developer.android.com/reference/android/hardware/Sensor.html
    百度百科这样描述:传感器(英文名称:transducer/sensor)是一种检测装置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。
    我们常常会把各种传感器比拟成一个人的五官(视觉 听觉 嗅觉 味觉 触觉)。
    如今的手机中,硬件中内嵌了很多传感器(比如加速度传感器,重力传感器,陀螺仪传感器,方向传感器,压力传感器,温度传感器等等),作为一名程序猿,有必要去了解一下这些传感器,代码怎么使用以及如何运用到日常开发。

    3、如何使用传感器

    因为本文是为了实现一个仿微信摇一摇的功能,而实现这个功能用到的是加速度传感器。所以我们就以加速度传感器来讲解具体的实现过程。其他的传感器的使用也是类似,写程序就必须要举一反三,学的才不会累。
    一般使用传感器需要3个步骤:
    1、首先得到SensorManager

    SensorManager sensorManager= (SensorManager) getSystemService(SENSOR_SERVICE);

    2、注册监听加速度传感器

    Sensor accSensor;//加速度传感器 accSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    SensorEventListener accListener;//加速度传感器监听器 sensorManager.registerListener(accListener,accSensor,SensorManager.SENSOR_DELAY_GAME);//注册

    3、最后记得接触注册传感器

    sensorManager.unregisterListener(accListener);//解除注册

    4、微信摇一摇核心代码

    作为程序员,直接上微信摇一摇的核心代码,相信可以更直接了当的介绍传感器的具体用法,程序中重点的语句,我也已经注释在代码后面。

    public class MainActivity extends AppCompatActivity {
        @ViewInject(R.id.image1)
        private ImageView image1;
        @ViewInject(R.id.image2)
        private  ImageView image2;
        SensorManager sensorManager;
        Sensor accSensor;//加速度传感器
        SensorEventListener accListener;//加速度传感器监听器
        long lastTime;
        private int rawId;
        private SoundPool soundPool;
        //震动
        private Vibrator vibrator;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            x.Ext.setDebug(true);
            x.Ext.init(getApplication());
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);   
            x.view().inject(this);
            vibrator = (Vibrator)       getSystemService(VIBRATOR_SERVICE);//获取系统震动服务
            sensorManager= (SensorManager) getSystemService(SENSOR_SERVICE);
            initSoundPool();//初始化短小音乐
            initSensor();
        }
        private void initSensor() {        accSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            accListener=new SensorEventListener() {
                @Override
                public void onSensorChanged(SensorEvent event) {
                    //判断条件成功后,执行摇一摇的效果
                    //获取当前时间
                    long curTime=System.currentTimeMillis();
                    if ((curTime-lastTime)<1000) {
                       // Toast.makeText(MainActivity.this, "间隔时间过短", Toast.LENGTH_SHORT).show();
                        return;
                    }                
                    float[]values=event.values;
                    float x=values[0];
                    float y=values[1];
                    float z=values[2];
                    Log.e("自定义标签", "类名:MainActivity" + "方法名:onSensorChanged: "+x+":"+y+":"+z);
                    if (x>10||y>10||z>10) {
                        //摇一摇成功
                        //1.播音乐2.执行动画
                        soundPool.play(rawId,2,1,1,0,1);//参数2 左声道 参数3 右声道 参数4 优先级 参数5 是否循环  参数6 速率0.5-2
                        playAnim();
                        //摇动手机后,再伴随震动提示~~
                        vibrator.vibrate(500);
                    }
                    lastTime=curTime;
                }
                @Override
                public void onAccuracyChanged(Sensor sensor, int accuracy) {
                }
            };
            //注册    sensorManager.registerListener(accListener,accSensor,SensorManager.SENSOR_DELAY_GAME);
        }
        private void initSoundPool(){
            //专门用于播放短小音乐
             soundPool=new SoundPool(10, AudioManager.STREAM_MUSIC,1);
            rawId=soundPool.load(getApplicationContext(),R.raw.kakaka,1);//将资源转化为可播放对象
        }
        private void playAnim() {
            //微信摇一摇动画
            AnimatorSet animatorSet=new AnimatorSet();
            int width=image1.getWidth();
            int height=image1.getHeight();
            //属性动画,根据屏幕圆点的
            ObjectAnimator up_image1=ObjectAnimator.ofFloat(image1,"translationY",0,-height);//向上移动
            ObjectAnimator up_image2=ObjectAnimator.ofFloat(image1,"translationY",-height,0);//返回
            ObjectAnimator down_image1=ObjectAnimator.ofFloat(image2,"translationY",0,height);//向下移动
            ObjectAnimator down_image2=ObjectAnimator.ofFloat(image2,"translationY",height,0);//返回
            animatorSet.play(up_image1).with(down_image1);//先执行up1--down1
            animatorSet.play(up_image2).after(up_image1).with(down_image2);//后执行
            animatorSet.setDuration(1000);
            animatorSet.start();//执行动画3
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            sensorManager.unregisterListener(accListener);//解除注册
        }
    }

    5、总结

    本文创作时间为3个小时,原创不易,如果哪里有错误或者写作意见,请帮忙指正和提醒,谢谢,大家共同进步!
    本文的源码,如果谁有兴趣要的,直接微信加我私聊,微信号:li842546199。或者公众号直接私聊我都行。
    本文属于原创,如有转载,请标注原作者,版权归本公众号所有。如果你喜欢我写的文章请关注* 程序IT圈* 。以后会经常更新最实用的软件编程技术。
    最近建立了个微信群,群里有很多个公众号的作者,如果二维码过期,请直接加公众号后台回复”加群“,我拉你入群。期待你们的加入:

  • 相关阅读:
    Building Java Projects with Gradle
    Vert.x简介
    Spring及Spring Boot 国内快速开发框架
    dip vs di vs ioc
    Tools (StExBar vs Cmder)which can switch to command line window on context menu in windows OS
    SSO的定义、原理、组件及应用
    ModSecurity is an open source, cross-platform web application firewall (WAF) module.
    TDD中测试替身学习总结
    Spring事务银行转账示例
    台式机(华硕主板)前面板音频接口(耳机和麦克风)均无声的解决办法
  • 原文地址:https://www.cnblogs.com/cxyquan/p/9746590.html
Copyright © 2011-2022 走看看