所需要的权限:

  <uses-permission android:name="android.permission.VIBRATE"></uses-permission>

xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="fanggao.qf.sensor.MainActivity">
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_marginTop="150dp"
        android:layout_marginLeft="80dp"
        android:src="@mipmap/down"/>
    <ImageView
        android:id="@+id/image_up"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/yaoyiyao"/>
    <ImageView
        android:id="@+id/image_down"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/yaoyiyao"/>
</FrameLayout>
</LinearLayout>

源代码:

package fanggao.qf.sensor;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;

/**
 * 1.初始化事件
 * 2.获得监听
 */
public class MainActivity extends AppCompatActivity {

    private ImageView imageUp;
    private ImageView imageDown;
    private SensorManager sensorManager;
    private SensorEventListener sensorEventListener;
    private Sensor sensor;
    private AnimationSet downAnimationSet;
    private AnimationSet upAnimationSet;
    //判断动画是否开始
    private boolean flag = true;
    private SoundPool soundPool;
    private int soundId;
    private Vibrator vibrator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        initEvent();
    //参数一传感器监听  参数二:监听的传感器对象
        //注册摇一摇事件
        sensorManager.registerListener(sensorEventListener,sensor,SensorManager.SENSOR_DELAY_NORMAL);

    }

    private void initEvent() {

        /*传感器事件监听器*/
         sensorEventListener  =  new SensorEventListener() {
             //当值发生改变的时候调用
            @Override
            public void onSensorChanged(SensorEvent event) {
                float[] values = event.values;
                //获取控件的值,设置触发条件
                float x = values[0];
                float y = values[1];
                float z = values[2];
                if(x > 15 || y > 15 || z > 15){//表示摇一摇
                    if(flag) {//正在执行动画的同时不能再次触发
                        //播放动画
                        imageUp.startAnimation(upAnimationSet);
                        imageDown.startAnimation(downAnimationSet);
                        //播放小音乐,不用MediaPlayer是因为mediaplayer适合播放耗时的文件,并且比较消耗资源
                        /**
                         * int soundID 音乐
                         * float leftVolume左声道
                         * float rightVolume 右声道
                         * int priority
                         * int loop 循环播放
                         * float rate 优先级
                         */
                       soundPool.play(soundId,1.0f,1.0f,1,1,1.0f);
                        //震动
                        //long[] pattern 1,第一次震动延迟的时间 2,第一次震动的持续时间 3,时间间隔 4,第二次震动的时间
                        //int repeat震动的重复次数 -1表示不重复
                        vibrator.vibrate(new long[]{400,500,500,500},-1);
                    }
                }
            }

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

            }
        };
        //设置动画监听
        upAnimationSet.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                flag = false;
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                flag = true;
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
    }

    /*初始化事件*/
    private void initData() {
        //获得传感器的管理器
       sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        //获得加速度传感器
       sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        //int maxStreams参数一:表示音乐池数量
        //int streamType 参数二:类型
        // int srcQuality参数三:资源的质量
        soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
        //将音乐加载到soundPool
        soundId = soundPool.load(this, R.raw.music, 1);
        //获得震动的服务
        vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);

        //初始化动画()  两个图片同时进行不能共用,
        //图片最终需要回到原点,因此使用补间动画
        //上面图片动画集合
        upAnimationSet = new AnimationSet(true);
        //上面图片动画
        //1.先上移
        TranslateAnimation upUptranslateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0,
                Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, -0.5f);
        //设置时间
        upUptranslateAnimation.setDuration(300);
        //1.后下移
        TranslateAnimation upDowntranslateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0,
                Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, -0.5f, Animation.RELATIVE_TO_SELF, 0);
        upDowntranslateAnimation.setDuration(300);
        //设置启动延迟,300ms后开始启动
        upDowntranslateAnimation.setStartOffset(300);
        upAnimationSet.addAnimation(upUptranslateAnimation);
        upAnimationSet.addAnimation(upDowntranslateAnimation);
        upAnimationSet.setDuration(800);
        upAnimationSet.setStartOffset(200);

        downAnimationSet = new AnimationSet(true);
        //下面图片的动画
        //1.先上移
        TranslateAnimation downUptranslateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0,
                Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0);
        downUptranslateAnimation.setDuration(300);
        downUptranslateAnimation.setStartOffset(300);
        //1.后下移
        TranslateAnimation downDowntranslateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0,
                Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0.5f);
        downDowntranslateAnimation.setDuration(300);
        downAnimationSet.addAnimation(downDowntranslateAnimation);
        downAnimationSet.addAnimation(downUptranslateAnimation);
        downAnimationSet.setDuration(800);
        downAnimationSet.setStartOffset(200);

    }

    private void initView() {
        imageUp = (ImageView) findViewById(R.id.image_up);
        imageDown = (ImageView) findViewById(R.id.image_down);
    }

    @Override
    protected void onDestroy() {
        sensorManager.unregisterListener(sensorEventListener);
        super.onDestroy();

    }
}

效果:

摇一摇:

利用传感器(sensor)实现微信摇一摇动画的更多相关文章

  1. 玩转Android之加速度传感器的使用,模仿微信摇一摇

    Android系统带的传感器有很多种,最常见的莫过于微信的摇一摇了,那么今天我们就来看看Anroid中传感器的使用,做一个类似于微信摇一摇的效果. OK ,废话不多说,我们就先来看看效果图吧: 当我摇 ...

  2. 安卓高级5 传感器和震动 模仿微信摇一摇Ui效果

    效果图: 所用的Ui就三张图: 案例代码: 结构 MainActivity.java package com.example.myapp; import android.content.Intent; ...

  3. Android仿iPhone晃动撤销输入功能(微信摇一摇功能)

    重力传感器微信摇一摇SensorMannager自定义alertdialogSensorEventListener 很多程序中我们可能会输入长文本内容,比如短信,写便笺等,如果想一次性撤销所有的键入内 ...

  4. android摇一摇实现(仿微信)

    这个demo模仿的是微信的摇一摇,是一个完整的demo,下载地址在最下面.下面是demo截图:                 步驟: 1.手机摇动监听,首先要实现传感器接口SensorEventLi ...

  5. iOS开发 传感器(加速计、摇一摇、计步器)

    一.传感器 1.什么是传感器传感器是一种感应\检测周围环境的一种装置, 目前已经广泛应用于智能手机上 传感器的作用用于感应\检测设备周边的信息不同类型的传感器, 检测的信息也不一样 iPhone中的下 ...

  6. iOS开发——高级篇——传感器(加速计、摇一摇、计步器)

    一.传感器 1.什么是传感器传感器是一种感应\检测周围环境的一种装置, 目前已经广泛应用于智能手机上 传感器的作用用于感应\检测设备周边的信息不同类型的传感器, 检测的信息也不一样 iPhone中的下 ...

  7. Android 摇一摇 之 传感器片

    要监视原始的传感器数据,你需要实现两个通过SensorEventListener接口暴露的回调方法:onAccuracyChanged()和onSensorChanged(). 传感器数据的速度值,这 ...

  8. C#开发微信门户及应用(38)--微信摇一摇红包功能

    摇一摇周边红包接口是为线下商户提供的发红包功能.用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包.我曾经在<C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实 ...

  9. 蓝牙Ibeacon室内定位和微信摇一摇周边原理分析

    苹果推出Ibeacon室内定位技术是为了弥补GPS无法覆盖室内定位这种场景.苹果意味着创新,在其推动下,蓝牙Ibeacon得到了极大的应用.而腾讯则是利用蓝牙Ibeacon在场景体验方面进行了创新,实 ...

随机推荐

  1. 使用boilerplate模版创建解决方案

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 话不多说,让我们开始干吧!对于还没有接触ABP框架或者接触时间还不是很长的小伙伴来说,我建议还是使用官方建议的做法,那就是到ABP ...

  2. 多线程同步工具——volatile变量

    关于volatile,找了一堆资料看,看完后想找一个方法去做测试,测了很久,感觉跟没有一样. 这本书<深入理解Java内存模型>,对volatile描述中有这样一个比喻的说法,如下代码所示 ...

  3. PHPer不能不看的50个细节!

    1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的"函数&quo ...

  4. 使用CodeDom动态生成类型

    .NET 3.5的时候加入了匿名类型这个特性,我们可以直接使用 new {name="abc"} 来直接生成一个对象.这个特性现在应用的地方很多,比如dapper的查询参数都是用匿 ...

  5. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 面向全国标准省市县行政数据基础之上的组织机构管理

    由于信息系统庞大.各种业务子系统.各种开发语言开发的业务逻辑.各种年代维护的代码.各种参差不齐的历史遗留信息系统,面向全国的业务系统,面向某个领域的汽运管理信息系统,面向内部的业务系统,面向外部的各种 ...

  6. 关于/usr/local/lib/libz.a(zutil.o): relocation R_X86_64_32 against `.rodata.str1.1&#39; can not be used when making a shared object; recompile with -fPIC解决办法

    具体报错截图如下: 解决方法: 题外话,我对makefill cmake也是一窍不通因此本人也是不想去积极的解决这个问题,但是当你求助无缘的时候你才会静心去思考.读到这句话的时候也许你已经发现了问题所 ...

  7. jq判断 复选框是否被选中 亲测可用

    var shortName = $('#shortName').is(':checked')?1:0;

  8. IE11出现“__doPostBack未定义”的解决办法。

    方法一:浏览器设置成兼容模式,这个是超级掩耳盗铃方法,你就没想过其他人也会出这个问题. 方法二.安装服务器版的.Net40的补丁.http://download.csdn.net/detail/565 ...

  9. openfire插件开发入门1

    .案例插件的功能 这个插件很简单,就是在openfire Server启动时,和关闭时,在控制台打印出消息. 3.插件开发的目录结构设计 先来看一下当前openfire在eclipse中的目录结构: ...

  10. android 读取串口数据的服务

    2016-09-1813:10:03 继承Service,定义抽象方法onDataReceived,子类通过实现抽象方法获取接收到数据的回调. package com.zrsoft.liftad.se ...