zoukankan      html  css  js  c++  java
  • Android学习笔记:摇一摇功能的实现

    首先需要用到一个摇一摇的工具类

    ShakeManager.java

     1 package com.wuxianedu.oschina.utils;
     2 
     3 import android.content.Context;
     4 import android.hardware.Sensor;
     5 import android.hardware.SensorEvent;
     6 import android.hardware.SensorEventListener;
     7 import android.hardware.SensorManager;
     8 
     9 /**
    10  * 震动监听器
    11  */
    12 public class ShakeManager implements SensorEventListener {
    13 
    14     private Context mContext;
    15     private static final int SPEED_SHRESHOLD = 4500;//这个值越大需要越大的力气来摇晃手机
    16     private static final int UPTATE_INTERVAL_TIME = 50;
    17     private SensorManager sensorManager;
    18     private Sensor sensor;
    19     private ShakeListener shakeListener;
    20     private float lastX;
    21     private float lastY;
    22     private float lastZ;
    23     private long lastUpdateTime;
    24 
    25     public ShakeManager(Context c) {
    26         mContext = c;
    27         start();
    28     }
    29 
    30     /**
    31      * 启动
    32      */
    33     public void start() {
    34         sensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
    35         if (sensorManager != null) {
    36             sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    37         }
    38         if (sensor != null) {
    39             sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);
    40         }
    41     }
    42 
    43     /**
    44      * 停止
    45      */
    46     public void stop() {
    47         sensorManager.unregisterListener(this);
    48     }
    49 
    50     public void onSensorChanged(SensorEvent event) {
    51         long currentUpdateTime = System.currentTimeMillis();
    52         long timeInterval = currentUpdateTime - lastUpdateTime;
    53         if (timeInterval < UPTATE_INTERVAL_TIME)
    54             return;
    55         lastUpdateTime = currentUpdateTime;
    56 
    57         float x = event.values[0];
    58         float y = event.values[1];
    59         float z = event.values[2];
    60 
    61         float deltaX = x - lastX;
    62         float deltaY = y - lastY;
    63         float deltaZ = z - lastZ;
    64 
    65         lastX = x;
    66         lastY = y;
    67         lastZ = z;
    68 
    69         double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ
    70                 * deltaZ)
    71                 / timeInterval * 10000;
    72         if (speed >= SPEED_SHRESHOLD) {
    73             shakeListener.onShake();
    74         }
    75     }
    76 
    77     public void onAccuracyChanged(Sensor sensor, int accuracy) {}
    78 
    79     public void setShakeListener(ShakeListener shakeListener) {
    80         this.shakeListener = shakeListener;
    81     }
    82 
    83     public interface ShakeListener {
    84         void onShake();
    85     }
    86 
    87 }

    接下来我们在MainActivity.java中来使用

     1     private ShakeManager shake;
     2 
     3         shake.setShakeListener(new ShakeManager.ShakeListener() {
     4             @Override
     5             public void onShake() {
     6                 QiStart();
     7                 shake.stop();
     8                 canrads.setVisibility(View.GONE);
     9                 soundPool.play(map.get(1),0.3f,0.3f,1,0,0);
    10             }
    11         });
    12 
    13 
    14 
    15     /**
    16      * 开始动画
    17      */
    18     private void QiStart() {
    19         TranslateAnimation up = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f
    20                 ,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,-0.3f);
    21         up.setDuration(600L);
    22         up.setRepeatCount(1);
    23         up.setRepeatMode(Animation.REVERSE);
    24         imageshang.startAnimation(up);
    25 
    26         TranslateAnimation down = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f
    27                 ,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0.3f);
    28         down.setDuration(600L);
    29         down.setRepeatCount(1);
    30         down.setRepeatMode(Animation.REVERSE);
    31         imagexia.startAnimation(down);
    32 
    33         down.setAnimationListener(new Animation.AnimationListener() {
    34             @Override
    35             public void onAnimationStart(Animation animation) {
    36 
    37             }
    38             @Override
    39             public void onAnimationEnd(Animation animation) {
    40                 xian2.setVisibility(View.VISIBLE);
    41                 new RequestClient(getContext(),requestConfig){
    42 
    43                     @Override
    44                     protected void loadSuccess(String result) {
    45                         try {
    46                             result = new String(result.getBytes("ISO-8859-1"),"UTF-8");
    47                         } catch (UnsupportedEncodingException e) {
    48                             e.printStackTrace();
    49                         }
    50                         shakeb = JSONParseUtil.parseObject(result,Shakeb.class);
    51                         assert shakeb != null;
    52                         String title = shakeb.getOwner()!=null ? shakeb.getOwner().getName():"";
    53                         tv_neirong.setText(title);
    54                         tv_biaoti.setText(shakeb.getDescription());
    55                         tv_chakan.setText(String.valueOf(shakeb.getForks_count()));
    56                         tv_xingxing.setText(String.valueOf(shakeb.getStars_count()));
    57                         tv_disange.setText(String.valueOf(shakeb.getWatches_count()));
    58                         //获取图片地址
    59                         String imageUrl = shakeb.getOwner().getNew_portrait();
    60                         ImageLoader imageLoader = ImageLoaderFactory.getImageLoader();
    61                         //加载图片
    62                         imageLoader.loadImage(imageUrl,roundImageView);
    63                         //隐藏正在加载
    64                         xian2.setVisibility(View.GONE);
    65                         //播放声音
    66                         soundPool.play(map.get(0),0.3f,0.3f,1,0,0);
    67                         //显示推举项目
    68                         canrads.setVisibility(View.VISIBLE);
    69                         //摇一摇监听开始
    70                         shake.start();
    71                     }
    72 
    73                     @Override
    74                     protected void loadFail() {
    75 
    76                     }
    77                 }.get(RequestAPI.SHAKE);
    78             }
    79 
    80             @Override
    81             public void onAnimationRepeat(Animation animation) {
    82 
    83             }
    84         });
    85 
    86     }
     /**
         * 判断Fragment是否可见
         * @param hidden
         */
        @Override
        public void onHiddenChanged(boolean hidden) {
            super.onHiddenChanged(hidden);
            if(hidden){
                shake.stop();
            }else{
                shake.start();
            }
        }
    
    
    true为不可见
  • 相关阅读:
    SQL Server OPENQUERY使用
    VS2013程序打包报 ISEXP : error -****: An error occurred streaming
    IIS重新注册
    c#之反射(Reflection)
    c#之Lambda表达式
    c#之委托事件(DelegateEvent)
    c#之委托详解(Delegate)
    git将文件托管到github上遇到的问题
    c#之泛型详解(Generic)
    linux下操作memcache的操作命令
  • 原文地址:https://www.cnblogs.com/langfei8818/p/6135268.html
Copyright © 2011-2022 走看看