摇一摇切图.apk

先上代码再说话!

清单文件加权限:

<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、摇一摇切两个图的问题,使用得到前后两次摇动时的系统时间,计算出时间间隔,通过间隔来给是否切换图片加上开关。

 

转载于:https://www.cnblogs.com/qingriye/p/4987255.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值