先上代码再说话!
清单文件加权限:
<uses-permission android:name="android.permission.VIBRATE"/>
布局文件:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:id="@+id/container" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 tools:context="com.example.shake.MainActivity" 7 tools:ignore="MergeRootFrame" 8 android:orientation="vertical"> 9 10 <ImageView 11 android:id="@+id/iv" 12 android:layout_width="match_parent" 13 android:layout_height="match_parent" 14 android:scaleType="fitXY" 15 android:src="@drawable/yaoyao" 16 /> 17 </LinearLayout>
代码:
1 package com.example.shake; 2 3 import java.io.IOException; 4 5 import android.app.Activity; 6 import android.graphics.Bitmap; 7 import android.graphics.BitmapFactory; 8 import android.hardware.Sensor; 9 import android.hardware.SensorEvent; 10 import android.hardware.SensorEventListener; 11 import android.hardware.SensorManager; 12 import android.os.Bundle; 13 import android.os.Vibrator; 14 import android.util.Log; 15 import android.widget.ImageView; 16 17 public class MainActivity extends Activity { 18 19 private SensorManager sm; 20 private Sensor sensor; 21 private MyListener listener; 22 23 private ImageView iv; 24 25 private int flag = 1; //用于标记加载的图片,实现图片循环切换 26 27 private long l_ever; //摇动加速度满足条件后的上一次系统时间 28 private long l_now; //摇动加速度满足条件后的当前系统时间 29 30 31 @Override 32 protected void onCreate(Bundle savedInstanceState) { 33 super.onCreate(savedInstanceState); 34 setContentView(R.layout.activity_main); 35 36 iv = (ImageView) findViewById(R.id.iv); 37 38 39 40 //创建传感器管理者 41 sm = (SensorManager) getSystemService(SENSOR_SERVICE); 42 //创建传感器 43 sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 44 listener = new MyListener(); 45 sm.registerListener(listener, sensor, SensorManager.SENSOR_DELAY_GAME); 46 47 } 48 49 private class MyListener implements SensorEventListener{ 50 51 @Override 52 public void onSensorChanged(final SensorEvent event) { 53 54 float [] value = event.values; 55 56 if(value[0] > 17){ //判断加速度值 57 58 l_now = System.currentTimeMillis(); //得到当前系统时间 59 60 if((l_now - l_ever) > 2000){ 61 //【日志】把两次摇一摇的系统时间差计算出来 62 Log.v("1", l_now - l_ever +""); 63 64 l_ever = l_now; //满足条件后把当前系统时间赋给前一次 65 66 Log.v("1", value[0]+""); //打印当前的重力加速度 67 68 System.out.println(flag); //打印看下是哪个图片 69 f(); //调用震动 70 BitmapFactory.Options options = new BitmapFactory.Options(); 71 Bitmap bitmap; 72 if(flag == 1){ 73 try { 74 bitmap = BitmapFactory.decodeStream(getAssets().open("1.jpg"), null, options); 75 iv.setImageBitmap(bitmap); 76 flag++; 77 return; 78 } catch (IOException e) { 79 80 e.printStackTrace(); 81 } 82 }else if(flag == 2){ 83 try { 84 85 bitmap = BitmapFactory.decodeStream(getAssets().open("22.jpg"), null, options); 86 iv.setImageBitmap(bitmap); 87 flag++; 88 return; 89 } catch (IOException e) { 90 91 e.printStackTrace(); 92 } 93 94 }else if(flag == 3){ 95 try { 96 //getAssets().open("33.jpg")调用assets中的图片文件 97 //把文件流转化成bitmap位图 98 bitmap = BitmapFactory.decodeStream(getAssets().open("33.jpg"), null, options); 99 iv.setImageBitmap(bitmap); 100 flag = 1; 101 return; 102 } catch (IOException e) { 103 104 e.printStackTrace(); 105 } 106 } 107 } 108 109 110 } 111 112 113 } 114 115 @Override 116 public void onAccuracyChanged(Sensor sensor, int accuracy) { 117 // TODO Auto-generated method stub 118 119 } 120 121 } 122 123 124 125 //震动 126 private void f(){ 127 Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 128 long[] pattern = {100, 1000, 50, 30}; // OFF/ON/OFF/ON... 129 vibrator.vibrate(pattern, -1);//-1不重复,非-1为从pattern的指定下标开始重复 130 } 131 132 @Override 133 protected void onDestroy() { 134 sm.unregisterListener(listener); 135 super.onDestroy(); 136 } 137 138 }
2015/11/22 目前的问题是,在摇动终端的时候,震动没问题,但切图有时过快,摇一下切了两张图。待排查。
2015/11/23 查看日志发现有时候摇一下切了两张图的时候打印出来传感器满足条件的数值有两次,因此导致了问题。于是加入一个判断条件,在单位时间内,传感器只取第一次有效值,对其它有效值不处理。
【重点】
1、图片循环切换,一开始不知道怎么实现,后来想想用了标注flag,可解决。
2、震动问题(要加入震动权限)
//震动
126 private void f(){
127 Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
128 long[] pattern = {100, 1000, 50, 30}; // 第一个值是检测到后延迟多少毫秒开始震动,第二个值是开始震动后震动多长时间停止
129 vibrator.vibrate(pattern, -1);//-1不重复,非-1为从pattern的指定下标开始重复
130 }
3、摇一摇切两个图的问题,使用得到前后两次摇动时的系统时间,计算出时间间隔,通过间隔来给是否切换图片加上开关。