微信微信自动摇一摇软件 shake什么软件

Android 微信摇一摇功能实现详细介绍
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Android 微信摇一摇功能实现详细介绍的相关资料,并附实例代码及实现微信摇一摇的思路,需要的朋友可以参考下
Android 微信摇一摇功能实现,最近学习传感器,就想实现摇一摇的功能,上网查了些资料,就整理下。如有错误,还请指正。
Android Studio 2.2.1
Gradle 2.2.1
相关知识点
加速度传感器
手机震动 (Vibrator)
较短 声音/音效 的播放 (SoundPool)
我们接下来分析一下这个案例, 当用户晃动手机时, 会触发加速传感器, 此时加速传感器会调用相应接口供我们使用, 此时我们可以做一些相应的动画效果, 震动效果和声音效果. 大致思路就是这样. 具体功能点:
用户晃动后两张图片分开, 显示后面图片
晃动后伴随震动效果, 声音效果
根据以上的简单分析, 我们就知道该怎么做了, Just now
先搭建布局
布局没啥可说的, 大家直接看代码吧
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff222222"
android:orientation="vertical"
tools:context="com.lulu.weichatshake.MainActivity"&
&RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"&
&!--摇一摇中心图片--&
&ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@mipmap/weichat_icon"/&
&LinearLayout
android:gravity="center"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"&
&!--顶部的横线和图片--&
&LinearLayout
android:gravity="center_horizontal|bottom"
android:id="@+id/main_linear_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"&
&ImageView
android:src="@mipmap/shake_top"
android:id="@+id/main_shake_top"
android:layout_width="wrap_content"
android:layout_height="100dp"/&
&ImageView
android:background="@mipmap/shake_top_line"
android:id="@+id/main_shake_top_line"
android:layout_width="match_parent"
android:layout_height="5dp"/&
&/LinearLayout&
&!--底部的横线和图片--&
&LinearLayout
android:gravity="center_horizontal|bottom"
android:id="@+id/main_linear_bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"&
&ImageView
android:background="@mipmap/shake_bottom_line"
android:id="@+id/main_shake_bottom_line"
android:layout_width="match_parent"
android:layout_height="5dp"/&
&ImageView
android:src="@mipmap/shake_bottom"
android:id="@+id/main_shake_bottom"
android:layout_width="wrap_content"
android:layout_height="100dp"/&
&/LinearLayout&
&/LinearLayout&
&/RelativeLayout&
&/LinearLayout&
得到加速度传感器的回调接口
step1: 在onStart() 方法中获取传感器的SensorManager
protected void onStart() {
super.onStart();
//获取 SensorManager 负责管理传感器
mSensorManager = ((SensorManager) getSystemService(SENSOR_SERVICE));
if (mSensorManager != null) {
//获取加速度传感器
mAccelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if (mAccelerometerSensor != null) {
mSensorManager.registerListener(this, mAccelerometerSensor, SensorManager.SENSOR_DELAY_UI);
step2: 紧接着我们就要在Pause中注销传感器
protected void onPause() {
// 务必要在pause中注销 mSensorManager
// 否则会造成界面退出后摇一摇依旧生效的bug
if (mSensorManager != null) {
mSensorManager.unregisterListener(this);
super.onPause();
Note: 至于为什么我们要在onStart和onPause中就行SensorManager的注册和注销, 就是因为, 防止在界面退出(包括按Home键)时, 摇一摇依旧生效(代码中有注释)
step3: 在step1中的注册监听事件方法中, 我们传入了当前Activity对象, 故让其实现回调接口, 得到以下方法
///////////////////////////////////////////////////////////////////////////
// SensorEventListener回调方法
///////////////////////////////////////////////////////////////////////////
public void onSensorChanged(SensorEvent event) {
int type = event.sensor.getType();
if (type == Sensor.TYPE_ACCELEROMETER) {
//获取三个方向值
float[] values = event.
float x = values[0];
float y = values[1];
float z = values[2];
if ((Math.abs(x) & 17 || Math.abs(y) & 17 || Math
.abs(z) & 17) && !isShake) {
实现摇动逻辑, 摇动后进行震动
Thread thread = new Thread() {
public void run() {
super.run();
Log.d(TAG, "onSensorChanged: 摇动");
//开始震动 发出提示音 展示动画效果
mHandler.obtainMessage(START_SHAKE).sendToTarget();
Thread.sleep(500);
//再来一次震动提示
mHandler.obtainMessage(AGAIN_SHAKE).sendToTarget();
Thread.sleep(500);
mHandler.obtainMessage(END_SHAKE).sendToTarget();
} catch (InterruptedException e) {
e.printStackTrace();
thread.start();
public void onAccuracyChanged(Sensor sensor, int accuracy) {
Note: 当用户晃动手机会调用onSensorChanged方法, 可以做一些相应的操作
为解决动画和震动延迟, 我们开启了一个子线程来实现.
子线程中会通过发送Handler消息, 先开始动画效果, 并伴随震动和声音 ,先把Handler的实现放一放, 我们再来看一下震动和声音初始化动画, 震动和音效实现
step 1: 先获取到震动相关的服务,注意要加权限. 至于音效, 我们采用SoundPool来播放, 在这里非常感谢Vincent 的贴子, 好初始化SoundPool
&&& &uses-permission android:name="android.permission.VIBRATE"/&
//初始化SoundPool
mSoundPool = new SoundPool(1, AudioManager.STREAM_SYSTEM, 5);
mWeiChatAudio = mSoundPool.load(this, R.raw.weichat_audio, 1);
//获取Vibrator震动服务
mVibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
Note: 大家可能发现SoundPool的构造方法已经过时, 不过不用担心这是Api21之后过时的, 所以也不算太”过时”吧  
step2: 接下来我们就要介绍Handler中的实现了, 为避免Activity内存泄漏, 采用了软引用方式
private static class MyHandler extends Handler {
private WeakReference&MainActivity& mR
private MainActivity mA
public MyHandler(MainActivity activity) {
mReference = new WeakReference&MainActivity&(activity);
if (mReference != null) {
mActivity = mReference.get();
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case START_SHAKE:
//This method requires the caller to hold the permission VIBRATE.
mActivity.mVibrator.vibrate(300);
//发出提示音
mActivity.mSoundPool.play(mActivity.mWeiChatAudio, 1, 1, 0, 0, 1);
mActivity.mTopLine.setVisibility(View.VISIBLE);
mActivity.mBottomLine.setVisibility(View.VISIBLE);
mActivity.startAnimation(false);//参数含义: (不是回来) 也就是说两张图片分散开的动画
case AGAIN_SHAKE:
mActivity.mVibrator.vibrate(300);
case END_SHAKE:
//整体效果结束, 将震动设置为false
mActivity.isShake =
// 展示上下两种图片回来的效果
mActivity.startAnimation(true);
Note: 内容不多说了, 代码注释中很详细, 还有一个startAnimation方法
我先来说一下它的参数, true表示布局中两张图片从打开到关闭的动画, 反之, false是从关闭到打开状态, 上代码
step3: startAnimaion方法上的实现
* 开启 摇一摇动画
* @param isBack 是否是返回初识状态
private void startAnimation(boolean isBack) {
//动画坐标移动的位置的类型是相对自己的
int type = Animation.RELATIVE_TO_SELF;
float topFromY;
float topToY;
float bottomFromY;
float bottomToY;
if (isBack) {
topFromY = -0.5f;
topToY = 0;
bottomFromY = 0.5f;
bottomToY = 0;
topFromY = 0;
topToY = -0.5f;
bottomFromY = 0;
bottomToY = 0.5f;
//上面图片的动画效果
TranslateAnimation topAnim = new TranslateAnimation(
type, 0, type, 0, type, topFromY, type, topToY
topAnim.setDuration(200);
//动画终止时停留在最后一帧~不然会回到没有执行之前的状态
topAnim.setFillAfter(true);
//底部的动画效果
TranslateAnimation bottomAnim = new TranslateAnimation(
type, 0, type, 0, type, bottomFromY, type, bottomToY
bottomAnim.setDuration(200);
bottomAnim.setFillAfter(true);
//大家一定不要忘记, 当要回来时, 我们中间的两根线需要GONE掉
if (isBack) {
bottomAnim.setAnimationListener(new Animation.AnimationListener() {
public void onAnimationStart(Animation animation) {}
public void onAnimationRepeat(Animation animation) {}
public void onAnimationEnd(Animation animation) {
//当动画结束后 , 将中间两条线GONE掉, 不让其占位
mTopLine.setVisibility(View.GONE);
mBottomLine.setVisibility(View.GONE);
//设置动画
mTopLayout.startAnimation(topAnim);
mBottomLayout.startAnimation(bottomAnim);
至此 核心代码已经介绍完毕 , 但是还有部分小细节不得不提一下
大家要在初始化View之前将上下两条横线GONE掉, 用GONE是不占位的
mTopLine.setVisibility(View.GONE);
mBottomLine.setVisibility(View.GONE);
2.咱们的摇一摇最好是只竖屏 (毕竟我也没见过横屏的摇一摇), 加上下面代码
//设置只竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
源码我已经发在了上, 希望大家多多支持!
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具HTML实现“摇一摇”效果 - DTOP - 动易设计团队博客
您的位置:&
laomao800 |
在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装了设备的运动传感器时间,通过改时间可以获取设备的运动状态、加速度等数据(另还有deviceOrientation事件提供了设备角度、朝向等信息)。
而通过DeviceMotion对设备运动状态的判断,则可以帮助我们在网页上就实现&摇一摇&的交互效果。
演示地址:
把监听事件绑定给 deviceMotionHandler
if (window.DeviceMotionEvent) {
window.addEventListener('devicemotion', deviceMotionHandler, false);
alert('本设备不支持devicemotion事件');
获取设备加速度信息 accelerationIncludingGravity
function deviceMotionHandler(eventData) {
var acceleration = eventData.accelerationIncludingGravity,
x = acceleration.x;
y = acceleration.y;
z = acceleration.z;
document.getElementById(&status&).innerHTML = &x:&+x+&&br /&y:&+y+&&br /&z:&+z;
将加速度信息打印置页面,通过演示地址可以看到随着设备的移动,屏幕上数字的变化。
演示地址:
&摇一摇&的动作既&一定时间内设备了一定距离&,因此通过监听上一步获取到的x, y, z 值在一定时间范围内的变化率,即可进行设备是否有进行晃动的判断。而为了防止正常移动的误判,需要给该变化率设置一个合适的临界值。
var SHAKE_THRESHOLD = 800;
var last_update = 0;
var x = y = z = last_x = last_y = last_z = 0;
if (window.DeviceMotionEvent) {
window.addEventListener('devicemotion', deviceMotionHandler, false);
alert('本设备不支持devicemotion事件');
function deviceMotionHandler(eventData) {
var acceleration = eventData.accelerationIncludingG
var curTime = new Date().getTime();
if ((curTime - last_update) & 100) {
var diffTime = curTime - last_
last_update = curT
x = acceleration.x;
y = acceleration.y;
z = acceleration.z;
var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000;
var status = document.getElementById(&status&);
if (speed & SHAKE_THRESHOLD) {
var text = &x:&+x+&&br /&y:&+y+&&br /&z:&+z+&&br /&speed:&+
status.innerHTML =
100毫秒进行一次位置判断,若前后x, y, z间的差值的绝对值和时间比率超过了预设的阈值,则判断设备进行了摇晃操作。
然后通过上面2个演示,然后再增加点样式效果,即可模拟一个简单的微信摇一摇界面。
应用演示:简易模拟微信摇一摇
演示地址:分享自己的一些微信技巧(摇一摇,申精)_微信吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:3,629,780贴子:
分享自己的一些微信技巧(摇一摇,申精)收藏
出来贵吧,1L度娘。内容可能火星,可能大家都知道,勿喷。
大家不管是什么原因使用摇一摇功能的时候,是否经常有一下郁闷?摇第一下,尼玛,吓到了。赶紧再摇。摇第二下,tmd,怎么还是你啊。。。。。。。。。。。。。。。然后,没有然后了。
路过的,顶一贴,貌似字数不足,在凑点!随风飘过!
反正我遇到过此种情况,我郁闷的发个消息给那个人【你丫的手机在做单摆运动啊?】那人回复【你不也是啊,艹。】呵呵,这就是大家经常的你对我没兴趣,我对你没兴趣,然而却总是互相摇到。
嗯。你可以言简意赅点。
这种情况,我之前的解决是:如果连续两次三次出现此现象后,稍等1秒,或者连续摇两次,这样一般就不会再摇到他了,但是大千世界无奇不有,人家也跟一样,结果还是可能又碰上了。。。。郁闷啊。
这边插下我个人觉得微信摇一摇功能的实现方式。摇一摇有三个功能,(看简介):1,两个手机摇着碰一下。2,聚会大家在一起一起摇下手机,所以列表显示出来。3,千里之外,摇出随机。
这里可以看出,前两个需要在一定的距离内。摇一摇碰手机 gprs定位是0米内(可能又误差,腾讯设置了个允许最大误差是10米)聚会显示摇的列表,gprs假定定位200米(这里当然也要加上误差)。而最后一种 则是优先级最低的,随机在远处寻找一个摇手机的。
从程序上分析,寻找如果包括你在内有四个人在摇动手机。A:在你身边5米,B,在你100米内C,在你1000米内D,在你10km外。这个时候,想想tx为了实现精准性,它并不知道你和A之间是否是碰撞摇一摇,然而你们距离近,如果优先级不高,那么选成了B的话,那么碰手机摇一摇此功能很有可能会经常不准。故有10米内的和50-100内的,摇动应该是10米内的出现的概率大的多。同理,B优先级比C高,C优先级比D高。这个大家应该都能理解吧。
这个听起来简单,但是正是由于这个原因导致了上面说的现象。老是摇到同一个人,而且你们的距离很近!你们一起摇,tx数据存点认为你们在聚会摇一摇呢。。。。
简明扼要点吗……目前为止说的都是废话
如何摆脱这种现象呢?答案就是把自己放远点,别这这死党干扰。能想到的 当然是自己跑出去个几千米。不知道你们这样做了么?反正我最开始这么做了。然而,悲剧的是,另一个人又替代着接着玩。。
不过还是鼓励。
首先,甚至里面把【使用无线网络】关掉。
16L怎么被抽调了。。。写到关键的地方呢。
16L的内容是:从wandojia下载一个叫做MockGps的软件安装(爱疯的sorry了,不过应该有类似工具)。
接17L,运行MockGps。移动地图,把加号置于一个较远的地方。我一般都放到西雅图附近。然后点set Location
我每次都可以摇到人的!我只想知道,为什么打招呼她们不理我
好了,这个时候启动微信,使用摇一摇功能。大家看下效果:我随便摇几个:这里不多举例了,反正我是一个下午都没有人重复过。
上面大家都知道怎么能不重复了吧。然而,童鞋么,这么好的mockgps这么用太浪费了。用摇一摇为了干嘛呢、当然找个高分女啊。那为何不将地点甚至在高分女成群的地方然后使用查看附近的人呢??例如南京师范,南京晓庄 等等。先把之前设置的地方长按,delete掉。下面例子,运行微信,查看附近我也不多截图了,这样操作就好像你手机置身于你设定的位置一样。简直是想找哪里就找哪里啊。
卤煮耐心真好
看来巴里像我这么蛋疼的人真少。
没人觉得有用么?哎,灰心啊。
有一个分享,请摇一摇。什么意思啊。。。懊恼了
不错,好东西
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或经验5506 米
在线时间356 小时
版本7.2.13
MIUI 9内测用户
机型红米Note TD版
签到次数121
MIUI版本7.2.13
来自网页版
在线时间136 小时
版本7.6.17
积分 189, 距离下一级还需 11 积分
积分 189, 距离下一级还需 11 积分
机型Sony Z2
签到次数10
MIUI版本7.6.17
通过手机发布
有什么用?
经验1240 米
在线时间8 小时
版本6.12.8
积分 1236, 距离下一级还需 764 积分
积分 1236, 距离下一级还需 764 积分
机型小米手机2/2S
签到次数111
MIUI版本6.12.8
真的假的………
经验971 米
在线时间14 小时
版本6.12.29
积分 1027, 距离下一级还需 973 积分
积分 1027, 距离下一级还需 973 积分
机型小米手机5SPlus
签到次数57
MIUI版本6.12.29
经验1366 米
在线时间21 小时
机型红米Note3 全网通
签到次数33
MIUI版本7.2.9
经验2468 米
在线时间30 小时
版本6.8.18
机型红米手机3S/3X
签到次数21
MIUI版本6.8.18
在线时间62 小时
版本6.12.8
积分 -2, 距离下一级还需 2 积分
积分 -2, 距离下一级还需 2 积分
机型红米Note2 移动/标准
签到次数16
MIUI版本6.12.8
通过手机发布
经验293 米
在线时间19 小时
版本6.8.11
积分 303, 距离下一级还需 197 积分
积分 303, 距离下一级还需 197 积分
机型红米Note2 双网通版
签到次数23
MIUI版本6.8.11
经验1697 米
在线时间124 小时
版本6.9.25
积分 1985, 距离下一级还需 15 积分
积分 1985, 距离下一级还需 15 积分
机型红米Note3
MIUI版本6.9.25
通过手机发布
谢谢分享。?
经验437 米
在线时间4 小时
版本7.1.12
积分 463, 距离下一级还需 37 积分
积分 463, 距离下一级还需 37 积分
机型红米Note-WCDMA版
MIUI版本7.1.12
来自网页版
好东西就要拿来分享
MIUI 300周
MIUI 300周更新纪念勋章
MIUI 3000万
MIUI 3000万发烧友纪念勋章
MIUI 2000万
MIUI 2000万发烧友纪念勋章
1000万用户纪念勋章
MIUI1000万用户纪念勋章
MIUI三周年
MIUI三周年纪念勋章
已关注极客秀微信
已关注微信
关注腾讯微博
已关注腾讯微博
关注新浪微博
已关注新浪微博
Copyright (C) 2016 MIUI
京ICP备号 | 京公网安备34号 | 京ICP证110507号

我要回帖

更多关于 微信摇一摇赛跑软件 的文章

 

随机推荐