精华内容
下载资源
问答
  • 机选一注摇一摇
    千次阅读
    2018-01-24 20:48:43

    下面是shake.js代码【ios需要注意权限问题】

    (function(global, factory) {
        if (typeof define === 'function' && define.amd) {
            define(function() {
                return factory(global, global.document);
            });
        } else if (typeof module !== 'undefined' && module.exports) {
            module.exports = factory(global, global.document);
        } else {
            global.Shake = factory(global, global.document);
        }
    } (typeof window !== 'undefined' ? window : this, function (window, document) {
        'use strict';
        function Shake(options) {
            //feature detect
            this.hasDeviceMotion = 'ondevicemotion' in window;
            this.options = {
                threshold: 15, //默认摇动阈值
                timeout: 1000 //默认两次事件间隔时间
            };
            if (typeof options === 'object') {
                for (var i in options) {
                    if (options.hasOwnProperty(i)) {
                        this.options[i] = options[i];
                    }
                }
            }
            //使用date防止重复调用
            this.lastTime = new Date();
            //accelerometer values
            this.lastX = null;
            this.lastY = null;
            this.lastZ = null;
            //创建自定义事件
            if (typeof document.CustomEvent === 'function') {
                this.event = new document.CustomEvent('shake', {
                    bubbles: true,
                    cancelable: true
                });
            } else if (typeof document.createEvent === 'function') {
                this.event = document.createEvent('Event');
                this.event.initEvent('shake', true, true);
            } else {
                return false;
            }
        }
        //重置时间计时器
        Shake.prototype.reset = function () {
            this.lastTime = new Date();
            this.lastX = null;
            this.lastY = null;
            this.lastZ = null;
        };
        //开始监听 devicemotion
        Shake.prototype.start = function () {
            this.reset();
            if (this.hasDeviceMotion) {
                window.addEventListener('devicemotion', this, false);
            }
        };
        //停止监听 devicemotion
        Shake.prototype.stop = function () {
            if (this.hasDeviceMotion) {
                window.removeEventListener('devicemotion', this, false);
            }
            this.reset();
        };
        //计算是否触发摇动
        Shake.prototype.devicemotion = function (e) {
            var current = e.accelerationIncludingGravity;
            var currentTime;
            var timeDifference;
            var deltaX = 0;
            var deltaY = 0;
            var deltaZ = 0;
            if ((this.lastX === null) && (this.lastY === null) && (this.lastZ === null)) {
                this.lastX = current.x;
                this.lastY = current.y;
                this.lastZ = current.z;
                return;
            }
            deltaX = Math.abs(this.lastX - current.x);
            deltaY = Math.abs(this.lastY - current.y);
            deltaZ = Math.abs(this.lastZ - current.z);
            if (((deltaX > this.options.threshold) && (deltaY > this.options.threshold)) || ((deltaX > this.options.threshold) && (deltaZ > this.options.threshold)) || ((deltaY > this.options.threshold) && (deltaZ > this.options.threshold))) {
                //计算上次触发摇动到现在的间隔时间
                currentTime = new Date();
                timeDifference = currentTime.getTime() - this.lastTime.getTime();
                if (timeDifference > this.options.timeout) {
                    window.dispatchEvent(this.event);
                    this.lastTime = new Date();
                }
            }
            this.lastX = current.x;
            this.lastY = current.y;
            this.lastZ = current.z;
        };
        //事件处理
        Shake.prototype.handleEvent = function (e) {
            if (typeof (this[e.type]) === 'function') {
                return this[e.type](e);
            }
        };
        return Shake;
    }));

    在页面中创建新实例进行调用

    //创建实例
    var myShakeEvent = new Shake({
        threshold: 10, // 摇动阈值
    	timeout: 500 // 事件发生频率,是可选值
    });
    // 监听设备动作
    myShakeEvent.start();
    
    //添加一个监听事件
    window.addEventListener('shake', shakeEventDidOccur, false);
    
    //摇动回调函数
    function shakeEventDidOccur() {
    	alert('摇了一次');
    }

    更多相关内容
  • Android----机选摇一摇,猜大小功能

    万次阅读 2019-05-29 13:42:51
    本篇讲的是摇一摇,猜大小,晃动手机,唤起震动,两个按钮自动切换,停止时,随机停在某一个按钮上。 样式上丑了点。不过功能最主要了。 import android.annotation.SuppressLint; import android.app.Service...

    今天继续为朋友们分享一个不一样的功能。

    本篇讲的是摇一摇,猜大小,晃动手机,唤起震动,两个按钮自动切换,停止时,随机停在某一个按钮上。

    样式上丑了点。不过功能最主要了。

    import android.annotation.SuppressLint;
    import android.app.Service;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.os.CountDownTimer;
    import android.os.Vibrator;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    import android.widget.Toast;
    import java.util.Random;
    
    public class MainActivity extends AppCompatActivity implements SensorEventListener {
        TextView tv_bs;
        RelativeLayout rl_big, rl_small;
        TextView big, tv_big;
        TextView small, tv_small;
        ImageView select1,select2;
        private MyCountDownTimer mc;
        private Boolean canstart = true;
        private  int j=0;
        private  int i=0;
        private Vibrator vibrator;
        private SensorManager mSensorManager;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.header_new_solobigsmall);
            initView();
        }
    
        private void initView() {
            mc = new MyCountDownTimer(1000, 200);
            tv_bs = findViewById(R.id.tv_bs);
            rl_big =  findViewById(R.id.rl_big);
            rl_small =  findViewById(R.id.rl_small);
            small =  findViewById(R.id.small);
            tv_small =  findViewById(R.id.tv_small);
            big =  findViewById(R.id.big);
            tv_big = findViewById(R.id.tv_big);
            select1=findViewById(R.id.select1);
            select2=findViewById(R.id.select2);
            // 获取传感器管理服务
            mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            // 震动
            vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
            rl_big.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    setBigSmall(1);
                }
            });
            rl_small.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    setBigSmall(2);
                }
            });
        }
    
        private void setBigSmall(int c){
            switch (c) {
                case 1:
                    rl_small.setBackgroundResource(R.drawable.bd_solonotselect);
                    small.setTextColor(getResources().getColor(R.color.cs_999999));
                    tv_small.setTextColor(getResources().getColor(R.color.cs_999999));
                    select2.setVisibility(View.GONE);
                    big.setTextColor(getResources().getColor(R.color.red_packet));
                    tv_big.setTextColor(getResources().getColor(R.color.red_packet));
                    select1.setVisibility(View.VISIBLE);
                    break;
                case 2:
                    rl_big.setBackgroundResource(R.drawable.bd_solonotselect);
                    big.setTextColor(getResources().getColor(R.color.cs_999999));
                    tv_big.setTextColor(getResources().getColor(R.color.cs_999999));
                    select1.setVisibility(View.GONE);
                    rl_small.setBackgroundResource(R.drawable.bd_soloselect);
                    small.setTextColor(getResources().getColor(R.color.red_packet));
                    tv_small.setTextColor(getResources().getColor(R.color.red_packet));
                    select2.setVisibility(View.VISIBLE);
                    break;
                case 3:
                    rl_big.setBackgroundResource(R.drawable.bd_solonotselect);
                    big.setTextColor(getResources().getColor(R.color.cs_999999));
                    tv_big.setTextColor(getResources().getColor(R.color.cs_999999));
                    select1.setVisibility(View.GONE);
                    rl_small.setBackgroundResource(R.drawable.bd_solonotselect);
                    small.setTextColor(getResources().getColor(R.color.cs_999999));
                    tv_small.setTextColor(getResources().getColor(R.color.cs_999999));
                    select2.setVisibility(View.GONE);
                    break;
                default:
                    break;
            }
        }
    
        @SuppressLint("MissingPermission")
        @Override
        public void onSensorChanged(SensorEvent event) {
            int sensorType = event.sensor.getType();
            // values[0]:X轴,values[1]:Y轴,values[2]:Z轴
            float[] values = event.values;
            if (sensorType == Sensor.TYPE_ACCELEROMETER) {
                float x = values[0];
                float y = values[1];
                float z = values[2];
                int value = 19;
                // 摇一摇阀值,不同手机能达到的最大值不同,如某品牌手机只能达到20
                if (x >= value || x <= -value || y >= value || y <= -value || z >= value || z <= -value) {
                    if (canstart) {
                        setBigSmall(3);
                        i = new Random().nextInt(2) + 1;
                        mc.start();
                        vibrator.vibrate(500);
                    }
                }
            }
        }
    
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
    
        }
    
        class MyCountDownTimer extends CountDownTimer {
            public MyCountDownTimer(long millisInFuture, long countDownInterval) {
                super(millisInFuture, countDownInterval);
            }
    
            @Override
            public void onFinish() {
                setBigSmall(j);
                canstart = true;
    
            }
    
            @Override
            public void onTick(long millisUntilFinished) {
                canstart = false;
                if (i == 1) {
                    setBigSmall(3);
                    setBigSmall(1);
                    j = i;
                    i = 2;
                } else if (i == 2) {
                    setBigSmall(3);
                    setBigSmall(2);
                    j = i;
                    i = 1;
                }
            }
        }
    
        @Override
        protected void onPause() {
            if (mSensorManager != null) {
                mSensorManager.unregisterListener(this);
            }
            Toast.makeText(MainActivity.this,"这传感解绑了",Toast.LENGTH_SHORT).show();
            super.onPause();
        }
    
        @Override
        protected void onStop() {
            if (mSensorManager != null) {
                mSensorManager.unregisterListener(this);
            }
            super.onStop();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            // 加速度传感器
            if (mSensorManager != null) {
                mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                        SensorManager.SENSOR_DELAY_NORMAL);
                Toast.makeText(MainActivity.this,"这初始化请求了",Toast.LENGTH_SHORT).show();
            }
        }
    }
    
    

    命名上没按驼峰那么规范,写的比较随性,写着玩的。就写个大概意思。

    一顿乱扔,没分包,也没分drawable,写的过于随意了,谅解。就是想保证功能而已。

    package com.example.administrator.yyy;
    
    import android.os.CountDownTimer;
    
    public class CountDownTimerUtils extends CountDownTimer {
       
        public interface CountDownTimerUtilsListener {
            void onTick(long millisUntilFinished);
            void onFinish();
        }
        
        public CountDownTimerUtilsListener countDownTimerUtilsListener;
        
       /**
        * 
        * @param millisInFuture
        *            表示以毫秒为单位 倒计时的总数
        * 
        *            例如 millisInFuture=1000 表示1秒
        * 
        * @param countDownInterval
        *            表示 间隔 多少微秒 调用一次 onTick 方法
        * 
        *            例如: countDownInterval =1000 ; 表示每1000毫秒调用一次onTick()
        * 
        */
       public CountDownTimerUtils(long millisInFuture, long countDownInterval, CountDownTimerUtilsListener countDownTimerUtilsListener) {
          super(millisInFuture, countDownInterval);
          this.countDownTimerUtilsListener = countDownTimerUtilsListener;
       }
    
       @Override
       public void onFinish() {
          countDownTimerUtilsListener.onFinish();
       }
    
       @Override
       public void onTick(long millisUntilFinished) {
          countDownTimerUtilsListener.onTick(millisUntilFinished);
       }
    }
    

     

     

     

    package com.example.administrator.yyy;
    
    import org.json.JSONObject;
    
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Locale;
    
    public class DateUtils {
       
       /**
        * 取得毫秒与当前日期 差值
       * <p>Title: getMillisecond</p> 
       * @author cw 
       * @date 2016年7月25日 下午4:15:06 
       * @return long
       * <p>Description: </p> 
       * @param createTime
       * @return 
       *
        */
       public static long getMillisecondDifference(long createTime){
          long currentMillisecond = System.currentTimeMillis();
          if(currentMillisecond<createTime*1000){
             return createTime*1000-currentMillisecond;
          }
          return -1;
       }
       
       /**
        * 获取当天的毫秒
       * <p>Title: getCurrentMillis</p> 
       * @author cw 
       * @date 2016年8月22日 下午3:37:59 
       * @return long
       * <p>Description: </p> 
       * @return 
       *
        */
       public static long getCurrentMillis(long createTime){
          DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
          Calendar cMax = Calendar.getInstance();
          cMax.setTimeInMillis(createTime * 1000L);
          
          String strMax = sdf.format(cMax.getTime());
          try {
             Date dMax = sdf.parse(strMax);
             return dMax.getTime();
          } catch (ParseException e) {
             e.printStackTrace();
          }
          return 0;
       }
    
       /**
        * 计算指定时间到现在相隔天数
        * <p>
        * Title: parseDate
        * </p>
        * 
        * @author cw
        * @date 2016年6月25日 下午3:03:18
        * @return long
        *         <p>
        *         Description:
        *         </p>
        * @param createTime
        * @return
        *
        */
       public static long parseOldToCurrent(long createTime) {
          try {
             DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
             Calendar cMax = Calendar.getInstance();
             cMax.setTimeInMillis(createTime * 1000);
             Calendar cMin = Calendar.getInstance();
    
             String strMax = sdf.format(cMax.getTime());
             Date dMax = sdf.parse(strMax);
    
             String strMin = sdf.format(cMin.getTime());
             Date dMin = sdf.parse(strMin);
    
             return (dMin.getTime() - dMax.getTime()) / (1000 * 60 * 60 * 24);
    
          } catch (ParseException e) {
             e.printStackTrace();
          }
          return 0;
       }
    
       /**
        * 计算现在到指定时间相隔天数
        * <p>
        * Title: parseDateDay
        * </p>
        * 
        * @author cw
        * @date 2016年6月25日 下午2:39:33
        * @return long
        *         <p>
        *         Description:
        *         </p>
        * @param createTime
        * @return
        *
        */
       private static long parseCurrentToFuture(long createTime) {
          try {
             DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
             Calendar cMax = Calendar.getInstance();
             cMax.setTimeInMillis(createTime * 1000);
             Calendar cMin = Calendar.getInstance();
    
             String strMax = sdf.format(cMax.getTime());
             Date dMax = sdf.parse(strMax);
    
             String strMin = sdf.format(cMin.getTime());
             Date dMin = sdf.parse(strMin);
    
             return (dMax.getTime() - dMin.getTime()) / (1000 * 60 * 60 * 24);
    
          } catch (ParseException e) {
             e.printStackTrace();
          }
          return 0;
       }
    
       /**
        * 红包方案有效期
        * <p>
        * Title: usablerdRedTime
        * </p>
        * 
        * @author cw
        * @date 2016年6月25日 下午3:04:38
        * @return String
        *         <p>
        *         Description:
        *         </p>
        * @param createTime
        * @return
        *
        */
       public static String usablerdRedTime(long createTime) {
          long lDay = parseCurrentToFuture(createTime) + 1;
          if (lDay == 1) {
             return "今天";
          } else if (lDay < 301) {
             return lDay + "天";
          } else if (lDay > 300 && lDay < (10 * 365 + 1)) {
             return toDateSimplay(createTime);
          } else if (lDay > 10 * 365) {
             return "永久有效";
          }else {
             return "";
          }
       }
       /**
        * 我的晒单列表日期
        * <p>
        * Title: getDateShowOff
        * </p>
        * 
        * @author cw
        * @date 2016年5月27日 下午5:18:41
        * @return String
        *         <p>
        *         Description:
        *         </p>
        * @param t
        * @return
        *
        */
       public static String getDateShowOff(long t) {
          Calendar c = Calendar.getInstance();
          c.setTimeInMillis(t * 1000);
          long iDay = parseOldToCurrent(t);
          if (iDay == 0) {
             return "今天";
          } else if (iDay == 1) {
             return "昨天";
          } else {
             DateFormat sdf = new SimpleDateFormat("dd");
             String iDay1 = sdf.format(c.getTime());
             sdf = new SimpleDateFormat("M月");
             String iMonth = sdf.format(c.getTime());
             String strR = iDay1 + "\n" + iMonth;
             return strR;
          }
       }
    
       /**
        * 最新揭晓时间显示规则 揭晓时间:如果是今天,显示今天12:34,如果是昨天,显示昨天 12:34,如果是其他日期,显示 06-08 12:34
        * <p>
        * Title: getDateNewAnnounce
        * </p>
        * 
        * @author cw
        * @date 2016年5月26日 上午8:30:43
        * @return String
        *         <p>
        *         Description:
        *         </p>
        * @return
        *
        */
       public static String getDateNewAnnounce(long t) {
          Calendar c = Calendar.getInstance();
          c.setTimeInMillis(t * 1000);
          long iDay = parseOldToCurrent(t);
          DateFormat sdf = new SimpleDateFormat("HH:mm", Locale.CHINESE);
          if (iDay == 0) {
             return "今天" + sdf.format(c.getTime());
          } else if (iDay == 1) {
             return "昨天" + sdf.format(c.getTime());
          } else {
             sdf = new SimpleDateFormat("MM-dd HH:mm");
             return sdf.format(c.getTime());
          }
       }
    
       public static String getDateNewAnnounceBill(long t) {
          Date dt = new Date();
          Long time = dt.getTime();
          Long i = time - t * 1000;
          Long j = (long) 86400000;
          int chage = (int) (i / j);
          if (chage < 1) {
             if (i / 3600000 >= 1) {
                if (i / 3600000 < 10) {
                   return i / 3600000 + "小时前";
                } else {
                   Date d = new Date(i);
                   SimpleDateFormat sdf = new SimpleDateFormat("HH");
                   return i / 3600000 + "小时前";
                }
             } else {
    /*          if (i < 60000) {
                   return "刚刚";
                } else {*/
                   if (i < 600000) {
                      Date d = new Date(i);
                      SimpleDateFormat sdf = new SimpleDateFormat("m");
                      return sdf.format(d) + "分钟前";
                   } else {
                      Date d = new Date(i);
                      SimpleDateFormat sdf = new SimpleDateFormat("mm");
                      return sdf.format(d) + "分钟前";
                   }
                //}
             }
          } 
    /*    else if (parseOldToCurrent(t)==1) {
             Date d = new Date(t * 1000);
             SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
             return "昨天" + sdf.format(d);
          } */
          else {
             Date d = new Date(t * 1000);
             SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm");
             return sdf.format(d);
          }
       }
    
       /**
        * 支付可用红包列表
        * <p>
        * Title: getDateShowOff
        * </p>
        * 
        * @author cw
        * @date 2016年5月27日 下午5:18:41
        * @return String
        *         <p>
        *         Description:
        *         </p>
        * @param t
        * @return
        *
        */
       public static String getRedPacketExpire(long createTime) {
          long lDay = parseCurrentToFuture(createTime) + 1;
          if (lDay == 1) {
             return "今天后过期";
          } else {
             return lDay + "天后过期";
          }
       }
    
       public static String toDate(Object now) {
          if (null == now || null == now.toString() || JSONObject.NULL == now) {
             return "";
          }
          DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(Long.parseLong(now.toString()));
          return formatter.format(calendar.getTime());
       }
       public static String toDateSSS1000(Object now){
          if ( null == now || null == now.toString() || JSONObject.NULL==now) {
             return "";
          }
          DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(Long.parseLong(now.toString())*1000);
          return formatter.format(calendar.getTime());
       }
    
       public static String toDateSSS(Object now) {
          if (null == now || null == now.toString() || JSONObject.NULL == now) {
             return "";
          }
          DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(Long.parseLong(now.toString()));
          return formatter.format(calendar.getTime());
       }
    
       public static String toDateMm(Object now) {
          if (null == now || null == now.toString() || JSONObject.NULL == now) {
             return "";
          }
          DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(Long.parseLong(now.toString()) * 1000);
          return formatter.format(calendar.getTime());
       }
    
       public static String toDateMm1(Object now) {
          if (null == now || null == now.toString() || JSONObject.NULL == now) {
             return "";
          }
          DateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss:SSS");
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(Long.parseLong(now.toString()));
          return formatter.format(calendar.getTime());
       }
       public static String toDateSS(Object now) {
          if (null == now || null == now.toString() || JSONObject.NULL == now) {
             return "";
          }
          DateFormat formatter = new SimpleDateFormat("mm:ss:SSS");
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(Long.parseLong(now.toString()));
          return formatter.format(calendar.getTime()).substring(0, 8);
       }
    
       public static String toDateSecond(Object now) {
          if (null == now || null == now.toString() || JSONObject.NULL == now) {
             return "";
          }
          DateFormat formatter = new SimpleDateFormat("HH:mm:ss");
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(Long.parseLong(now.toString()));
          return formatter.format(calendar.getTime()).substring(0, 8);
       }
    
       public static String toDateMin(Object now) {
          if (null == now || null == now.toString() || JSONObject.NULL == now) {
             return "";
          }
          DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(Long.parseLong(now.toString()) * 1000);
          return formatter.format(calendar.getTime());
       }
       public static String toDateMin2(Object now) {
          if (null == now || null == now.toString() || JSONObject.NULL == now) {
             return "";
          }
          DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(Long.parseLong(now.toString()));
          return formatter.format(calendar.getTime());
       }
       public static String toDateSimplay(Object now) {
          if (null == now || null == now.toString() || JSONObject.NULL == now) {
             return "";
          }
          DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(Long.parseLong(now.toString()) * 1000);
          return formatter.format(calendar.getTime());
       }
    
       public static String toDateFormat(Object now, String strFormat) {
          if (null == now || null == now.toString() || JSONObject.NULL == now) {
             return "";
          }
          DateFormat formatter = new SimpleDateFormat(strFormat);
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(Long.parseLong(now.toString()) * 1000);
          return formatter.format(calendar.getTime());
       }
    
       public static String toDate() {
          DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
          Calendar calendar = Calendar.getInstance();
          return formatter.format(calendar.getTime());
       }
       
       public static String toDate(String format) {
          DateFormat formatter = new SimpleDateFormat(format);
          Calendar calendar = Calendar.getInstance();
          return formatter.format(calendar.getTime());
       }
    
       public static String toDateMinShow(Object now) {
          if (null == now || null == now.toString() || JSONObject.NULL == now) {
             return "";
          }
          DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
          Calendar calendar = Calendar.getInstance();
          calendar.setTimeInMillis(Long.parseLong(now.toString()) * 1000);
          return formatter.format(calendar.getTime());
    
       }
    }

     

    package com.example.administrator.yyy;
    
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.util.AttributeSet;
    import android.widget.TextView;
    
    
    @SuppressLint("AppCompatCustomView")
    public class TimeTextView extends TextView  {
       
       
       public enum eDownTimeType{
          lottery//开奖倒计时
          ,quisoccer//虚拟足球开场倒计时
          ,activity//首页活动倒计时
          ,gambling//幸运4选1和快乐猜大小倒计时
       }
       
       public static final int HOUR = 1;
       public static final int MINUTE = 2;
       public static final int QUIZMINUTE = 3;
    
       public interface TimeFinishListener {
          void timeFinish();
          void timeTick(boolean bReturn);
       }
       
       private boolean run = false; // 是否启动了
       private TimeFinishListener mTimeFinishListener;
       private CountDownTimerUtils countDownTimerUtils;
    
       public TimeTextView(Context context, AttributeSet attrs) {
          super(context, attrs);
          initView(context, attrs);
       }
    
       public TimeTextView(Context context, AttributeSet attrs, int defStyle) {
          super(context, attrs, defStyle);
          initView(context, attrs);
       }
       
       public void setmTimeFinishListener(TimeFinishListener mTimeFinishListener) {
          this.mTimeFinishListener = mTimeFinishListener;
       }
    
       public TimeTextView(Context context) {
          super(context);
       }
    
       private void initView(Context context, AttributeSet attrs) {
          
       }
    
    
       public boolean isRun() {
          return run;
       }
    
       public void setRun(boolean run) {
          this.run = run;
       }
    
       /**
        * 共同倒计时
        * @param truetime 倒计时开始时间
        */
       public void startCommon(long truetime,long interval,eDownTimeType downTimeType) {
          if (!isRun()){
              setRun(true);
              onStartCommon(truetime, interval, downTimeType);
           }
       }
       
       /**
        * 开奖倒计时
        * @param downtime 倒计时开始时间
        * @param truetime 真实倒计时开始时间
        */
       public void startLottery(long truetime,long downtime,long timeCha) {
          if (!isRun()){
              setRun(true);
              onStartLottery(truetime, downtime, timeCha);
           }
       }
       
       
       public void cancel(){
          if(countDownTimerUtils!=null){
             countDownTimerUtils.cancel();
             setRun(false);
          }
       }
       int iCountDownInterval = 0;
       public void onStartLottery(final long truetime,long downtime,final long timeCha){
          iCountDownInterval = 0;
          countDownTimerUtils = new CountDownTimerUtils(downtime, 10L, new CountDownTimerUtils.CountDownTimerUtilsListener() {
             @Override
             public void onTick(long millisUntilFinished) {
                long currentTimeMillis = System.currentTimeMillis()+timeCha;
                if(truetime<currentTimeMillis){
                   setText("正在揭晓");
                   if(iCountDownInterval==0) {
                      mTimeFinishListener.timeTick(true);
                   } else {
                      mTimeFinishListener.timeTick(false);
                   }
                   iCountDownInterval+=10;
                     if(iCountDownInterval==3000){
                        iCountDownInterval=0;
                     }
                }else{
                   setText(DateUtils.toDateSS(truetime-currentTimeMillis));
                   mTimeFinishListener.timeTick(false);
                }
                
             }
             @Override
             public void onFinish() {
                setRun(false);
                mTimeFinishListener.timeFinish();
             }
          });
          
          countDownTimerUtils.start();
       }
       
       
       public void onStartCommon(long truetime,final long interval,final eDownTimeType downTimeType){
          countDownTimerUtils = new CountDownTimerUtils(truetime, interval, new CountDownTimerUtils.CountDownTimerUtilsListener() {
             @Override
             public void onTick(long millisUntilFinished) {
                if(downTimeType== eDownTimeType.gambling){
                   setText(formatDuring(millisUntilFinished,MINUTE));
                }else if(downTimeType== eDownTimeType.activity){
                   setText(formatDuring(millisUntilFinished,HOUR));
                }else if(downTimeType== eDownTimeType.lottery){
                   setText(DateUtils.toDateSS(millisUntilFinished));
                }else if(downTimeType== eDownTimeType.quisoccer){
                   setText(formatDuring(millisUntilFinished, QUIZMINUTE));
                }
                mTimeFinishListener.timeTick(true);
             }
             @Override
             public void onFinish() {
                setRun(false);
                mTimeFinishListener.timeFinish();
             }
          });
          
          countDownTimerUtils.start();
       }
       
       public void onStartBabyTime(long truetime){
          countDownTimerUtils = new CountDownTimerUtils(truetime, 1000, new CountDownTimerUtils.CountDownTimerUtilsListener() {
             @Override
             public void onTick(long millisUntilFinished) {
                mTimeFinishListener.timeTick(true);
             }
             @Override
             public void onFinish() {
                setRun(false);
                mTimeFinishListener.timeFinish();
             }
          });
          
          countDownTimerUtils.start();
       }
       
       /**
        *
        * @param
        * @return 该毫秒数转换为 * days * hours * minutes * seconds 后的格式
        * @author fy.zhang
        */
       public static String formatDuring(long mss,int rType) {
           long days = mss / (1000 * 60 * 60 * 24);
           long hours = (mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
           long minutes = (mss % (1000 * 60 * 60)) / (1000 * 60);
           long seconds = (mss % (1000 * 60)) / 1000;
           if(rType==HOUR) {
             return (days * 24 + hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds);
          } else if(rType==MINUTE) {
             return (((days * 24 + hours) * 60 + minutes) < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds);
          } else if(rType==QUIZMINUTE) {
             return "距离比赛开始" + seconds + "秒";
          }
           return "";
       }
       public static String[] formatDuringArray(long mss){
          String str = formatDuring(mss,HOUR);
          if(StringUtils.isNotEmpty(str)){
             String[] arry = new String[6];
             String[] arryTemp = str.split(":");
             String str1 = arryTemp[0];
             if(str1.length()<2){
                arry[0]="0";
                arry[1]= str1;
             }else{
                arry[0]=str1.substring(0,1);
                arry[1]=str1.substring(1,2);
             }
             String str2 = arryTemp[1];
             arry[2]=str2.substring(0,1);
             arry[3]=str2.substring(1,2);
             String str3 = arryTemp[2];
             arry[4]=str3.substring(0,1);
             arry[5]=str3.substring(1,2);
             
             return arry;
          }
          
          return null;
       }
       public static String[] DuringArray(long mss){
          String str = formatDuring(mss,HOUR);
          if(StringUtils.isNotEmpty(str)){
             String[] arry = new String[6];
             String[] arryTemp = str.split(":");
             String str1 = arryTemp[0];
             if(str1.length()<2){
                arry[0]="00";
                arry[1]= str1;
             }else{
                arry[0]=str1.substring(0,2);
                //arry[1]=str1.substring(1,2);
             }
             String str2 = arryTemp[1];
             arry[1]=str2.substring(0,2);
             //arry[2]=str2.substring(2,4);
             String str3 = arryTemp[2];
             arry[2]=str3.substring(0,2);
             //arry[5]=str3.substring(1,2);
    
             return arry;
          }
    
          return null;
       }
    }
    

     

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#f1eeec"
        android:orientation="vertical" >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:orientation="horizontal" >
    
            <RelativeLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center_horizontal"
                android:background="#ffffff"
                android:id="@+id/rl_zoushi">
    
                <TextView
                    android:id="@+id/expect"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="10dp"
                    android:text="038期揭晓"
                    android:gravity="center_horizontal"
                    android:textColor="#1f1f1f"
                    android:textSize="10sp" />
             <LinearLayout
                 android:layout_width="match_parent"
                    android:layout_height="25dp"
                    android:layout_marginLeft="3dp"
                    android:gravity="center_horizontal"
                    android:layout_alignParentBottom="true"
                   android:layout_marginBottom="10dp"
                    >
                   <TextView
                       android:id="@+id/tv_bs"
                        android:layout_alignParentBottom="true"
                        android:layout_marginBottom="10dp"
                       android:layout_width="25dp"
                       android:layout_height="25dp"
                       android:background="@drawable/bd_textground"
                       android:gravity="center"
                       android:text="大"
                       android:textColor="#999999"
                       android:textSize="18sp" />
       
                   <ImageView
                       android:id="@+id/lookup"
                        android:layout_marginLeft="3dp"
                        android:layout_alignParentBottom="true"
                        android:layout_marginBottom="10dp"
                       android:layout_width="22dp"
                       android:layout_height="25dp"
                       android:layout_toRightOf="@+id/tv_bs"
                       android:src="@drawable/ic_solo_down" 
                       />
                </LinearLayout>
            </RelativeLayout>
    
            <View
                android:layout_width="1px"
                android:layout_height="match_parent" />
    
            <RelativeLayout
                android:id="@+id/rl_details"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="#ffffff"
                >
                <TextView
                    android:id="@+id/expect_now"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="10dp"
                    android:text="揭晓号码"
                    android:textColor="#1f1f1f"
                    android:textSize="10sp" />
                <TextView
                    android:id="@+id/tv_time"
                    android:layout_width="wrap_content"
                    android:layout_height="28dp"
                    android:layout_below="@+id/expect_now"
                    android:layout_centerHorizontal="true"
                    android:layout_centerVertical="true"
                    android:gravity="center"
                    android:text="108801"
                    android:layout_marginTop="-5dp"
                    android:textColor="#d91d33"
                    android:textSize="25sp" />
                <TextView
                    android:id="@+id/tv_jisuan"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="center"
                    android:text="计算详情>"
                    android:layout_below="@+id/tv_time"
                    android:textColor="#5a97d0"
                    android:layout_marginBottom="5dp"
                    android:textSize="10sp"/>
            </RelativeLayout>
            <RelativeLayout
                android:id="@+id/rl_details1"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:background="#ffffff"
                android:visibility="gone"
                >
    
                <TextView
                    android:id="@+id/expect_now1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="10dp"
                    android:text="距038期揭晓"
                    android:textColor="#1f1f1f"
                    android:textSize="10sp" />
    
                <com.example.administrator.yyy.TimeTextView
                    android:id="@+id/time_done"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/expect_now1"
                    android:layout_centerHorizontal="true"
                    android:gravity="center"
                    android:text="06:15"
                    android:textColor="@color/change_color"
                    android:textSize="@dimen/sp_30" />
    
                <ProgressBar
                    android:id="@+id/solo_pro"
                    style="?android:attr/progressBarStyleHorizontal"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/rect_goods_progress_height"
                    android:layout_alignParentBottom="true"
                    android:max="600000"
                    android:progressDrawable="@drawable/bd_solopro" />
            </RelativeLayout>
        </LinearLayout>
    
        <View
            android:id="@+id/v1"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_10" />
         <WebView 
            android:id="@+id/zoushi"
            android:layout_width="match_parent"
            android:layout_height="135dp"
            android:visibility="gone"
            />
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_36"
            android:background="@color/white" >
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:background="@drawable/ic_solo_rock"/>
    
            <TextView
                android:id="@+id/state"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginRight="@dimen/ds_16dp"
                android:text="玩法说明>"
                android:textColor="@color/solo_5a97d0"
                android:textSize="@dimen/sp_14" />
        </RelativeLayout>
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white" >
    
            <TextView
                android:id="@+id/tv_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="@dimen/ds_16dp"
                android:text="猜中后你将获得移动充值卡"
                android:textColor="@color/solo_535353"
                android:textSize="@dimen/sp_15" />
    
            <RelativeLayout
                android:id="@+id/rl_big"
                android:layout_width="140dp"
                android:layout_height="45dp"
                android:layout_below="@+id/tv_title"
                android:layout_marginLeft="32dp"
                android:layout_marginTop="26dp"
                android:background="@drawable/bd_soloselect" >
    
                <TextView
                    android:id="@+id/big"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="@dimen/ds_3dp"
                    android:gravity="center"
                    android:text="大"
                    android:textColor="@color/red_packet"
                    android:textSize="@dimen/sp_18" />
    
                <TextView
                    android:id="@+id/tv_big"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/big"
                    android:layout_centerHorizontal="true"
                    android:layout_gravity="center_horizontal"
                    android:gravity="center"
                    android:text="12幸运币"
                    android:textColor="@color/red_packet"
                    android:textSize="@dimen/sp_10" />
    
                <ImageView
                    android:layout_marginBottom="@dimen/ds_4dp"
                    android:layout_marginRight="@dimen/ds_3dp"
                    android:id="@+id/select1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentRight="true"
                    android:src="@drawable/ic_solo_select" 
                    />
            </RelativeLayout>
    
            <RelativeLayout
                android:layout_marginBottom="@dimen/ds_26dp"
                android:id="@+id/rl_small"
                android:layout_width="140dp"
                android:layout_height="45dp"
                android:layout_alignParentRight="true"
                android:layout_below="@+id/tv_title"
                android:layout_marginRight="32dp"
                android:layout_marginTop="26dp"
                android:background="@drawable/bd_solonotselect" >
    
                <TextView
                    android:id="@+id/small"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:layout_marginTop="@dimen/ds_3dp"
                    android:gravity="center"
                    android:text="小"
                    android:textColor="@color/cs_999999"
                    android:textSize="@dimen/sp_18" />
    
                <TextView
                    android:id="@+id/tv_small"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/small"
                    android:layout_centerHorizontal="true"
                    android:layout_gravity="center_horizontal"
                    android:gravity="center"
                    android:text="12幸运币"
                    android:textColor="@color/cs_999999"
                    android:textSize="@dimen/sp_10" />
    
                <ImageView
                    android:layout_marginBottom="@dimen/ds_4dp"
                    android:layout_marginRight="@dimen/ds_3dp"
                    android:id="@+id/select2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentRight="true"
                    android:src="@drawable/ic_solo_select"
                    android:visibility="gone" />
            </RelativeLayout>
    
        </RelativeLayout>
    
        
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white"
            android:orientation="vertical" 
            android:layout_marginTop="@dimen/ds_10dp">
    
    
            <View
                android:layout_width="match_parent"
                android:layout_height="1px"
                android:background="@color/solo_cccccc" />
        </LinearLayout>
    
    </LinearLayout>

    核心的已经给上去了,剩下的就是资源图片和 颜色了。自己改改就行。  

    下面是传送门:去我的csdn下载吧。完成的,直接运行就能看。

    https://download.csdn.net/download/qq_35874340/11214495

    展开全文
  • 一个主界面,有大小两个按钮,可点击切换,可以摇一摇手机,然后按钮自己随机切换。最后有个随机默认选中。 可以使用于猜大小,此功能非常适合替代ktv喝酒适合用的筛子,通过猜大小来拼酒!
  • 用HTML5实现手机摇一摇的功能并配上声音 HTML5的一个重要特性:DeviceOrientation,他将底层的方向传感器和运动传感器进行了高级封装,提供DOM事件支持。 DeviceOrientation这个特性包括两种事件: 1、device...

    一、用HTML5实现手机摇一摇的功能并配上声音

    HTML5的一个重要特性:DeviceOrientation,他将底层的方向传感器和运动传感器进行了高级封装,提供DOM事件支持。

    DeviceOrientation这个特性包括两种事件:

    1、deviceOrientation:封装方向传感器数据的事件,可以获取手机静止状态下的方向数据,如手机的方位、角度、朝向

    2、deviceMotion:封装运动传感器数据的事件,获取手机运动状态下的运动加速度等数据

    设备运动事件:DeviceMotionEvent返回设备有关于加速度和旋转的相关信息,加速度包含x,y,z数据

    该事件有连个属性:accelerationIncludingGravity(含重力的加速度)     acceleration(排除重力的加速度)

    原理如下:针对三个方向的加速度进行计算,间隔测量他们,考察它们在固定时间内的变化率,为它定义一个阈值

                       来确定触发动作。
            1、监听运动传感事件

             if(window.DeviceMotionEvent){

      window.addEventListener('devicemotion',deviceMotionHandler,false);

                    }

            2、获取含重力的加速度

                 function deviceMotionHandler(eventData){

    var acceleration = eventData.accelerationIncludingGravity;

                } 

    JS代码如下:

    1、定义一些用到的变量

        var SHAKE_THRESHOLD = 1800;  //定义触发动作的阈值
        var last_update = 0;         //上一次触发的时间
        var x = y = z = last_x = last_y = last_z = 0;//x,y,z当前加速度,last_z,last_x,last_y上次加速度
        var num = 0;
        var numMax = 3;
    
    

      //调用

        listenPhoneShake();

        //监听摇一摇的动作
        function listenPhoneShake() {
            if (window.DeviceMotionEvent) {
                window.addEventListener('devicemotion', deviceMotionHandler,false);
                console.log("addEventListener devicemotion");
            } else {
                alert('抱歉,你的手机配置实在有些过不去,考虑换个新的再来试试吧');
            }
        }

        // --检测设备是否有摇一摇动作
        function deviceMotionHandler(eventData) {
            var acceleration = eventData.accelerationIncludingGravity;
            var curTime = new Date().getTime();
          
            if ((curTime - last_update) > 100) {
                var diffTime = curTime - last_update;
                last_update = curTime;
                x = acceleration.x;
                y = acceleration.y;
                z = acceleration.z;
                var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000;
    
                if (speed > SHAKE_THRESHOLD) {
                    handelShakingMotion();
                }
                last_x = x;
                last_y = y;
                last_z = z;
            }
        }

        // 设备有摇一摇动作,则对页面已摇次数进行加1,若已经摇到最大次数numMax,则请求抢红包接口
        function handelShakingMotion() {
            num++;
            // 添加摇一摇的声音
            $('#shakingAudio').trigger('play');
            document.getElementById("numberCount").innerHTML = num;
            if (num == numMax) {
                num = 0;
                // 关闭摇一摇的接口
                window.removeEventListener("devicemotion", deviceMotionHandler);
                // 添加摇到红包的声音
                $('#shakingResult').trigger('play'); 
                // 摇一摇结束之后,请求抢红包接口
                drawRedbag(openid);
            }
        }
    

    二、添加摇一摇的声音和摇到红包的声音

      利用jquery事件trigger():触发被选元素的指定事件类型。

    1、HTML如下:

        <!-- 摇一摇的声音 -->
        <audio src="mp3/shakingAudio.mp3" preload="preload" id="shakingAudio"></audio>
        <!-- 摇到红包的声音 -->
        <audio src="mp3/shakingResult.mp3" preload="preload" id="shakingResult"></audio>

    2、jquery如下:

        // 添加摇一摇的声音 
        $('#shakingAudio').trigger('play');
       // 添加摇到红包的声音
       $('#shakingResult').trigger('play'); 

    问题:在android下,trigger()函数是有效的,即能自动播放音乐,但是在iphone下是无效的,即iphone机这样设置是不能自动播放声音的,因为iphone机内置浏览器safari默认下将自动播放功能禁止了,需要人为触发才行。


    解决iphone进入网页,不能能自动播放音乐的bug

    原理:利用微信WeixinJSBridgeReady事件,这个是微信浏览器自带提供的事件,微信ready()之后播放。

    先在html中引入jquery.js插件,然后在js文件里面写如下代码:

    $(function(){
          //一般android机都能自动播放
         $('#shakingAudio').play();
         //处理iphone不能自动播放
         document.addEventListener('WeixinJSBridgeReady',function(){
             $('#shakingAudio').play();
         },false);
    });





    
    
    展开全文
  • Android手机摇一摇之传感器开发

    千次阅读 2015-07-27 21:53:37
    ——尊重作者,知识无价,...、手机摇晃计算 1、手机摇晃的动作 2、个点三个轴X、Y、Z ①计算从a——b的增量:a点到b点各个轴相减之和 假设a(x1,y1,z1)、b(x2,y2,z2) 增量ab=(x2-x1)+(y2-y1)

    【声明】转载请注明出处,此文出自指尖飞落的博客:http://blog.csdn.net/huntersnail

    ——尊重作者,知识无价,交流无限!

    一、手机摇晃计算

    1、手机摇晃的动作



    2、一个点三个轴X、Y、Z

    ①计算从a——b的增量:a点到b点各个轴相减之和

    假设a(x1,y1,z1)、b(x2,y2,z2)

    增量ab=(x2-x1)+(y2-y1)+(z2-z1)


    ②将所有的增量进行汇总,得到一个大的增量,假设是N。并进行判断:

    如果N>=设定的域值M,则确定在摇晃手机。

    说明:N=ab+bc+cd+......n;


    ③问题:手机传感器的反应(灵敏度)会因为手机的不同而有区别,主要是生产商的原因。 

    灵敏度以设置的采样时间间隔进行判断。

    假设:A手机:a——b需要30ms(灵敏度高)

              B手机:a——b需要90ms(灵敏度低)

    图解:

    得:A手机灵敏度>B手机


    如何解决这个问题?我们可以以设置好的域值来进行处理。(详情看代码思路)

    通过汇总与设置好的阈值进行比对,如果大于或等于。用户继续摇晃手机,否则继续记录当期的数据(加速度读和时间)


    二、代码实现

    代码思路:
    1、记录第一个数据:三的轴的加速度。(为了屏蔽掉不同手机采样的时间间隔,记录第一个点的时间)

    2、当有新的传感器数据传递后,判断时间间隔(用当前时间与第一个采样的时间进行比对,如果满足了时间间隔要求,认为是合格的第二个时间,记录下来。否则舍弃该数据包)

    进行增量计算:获取到新的加速度值与第一个点上存储的轴的数据进行差值计算,获取到第一点和第二个点的增量。
    ③以此类推,获取到两个相邻点的增量进行以此汇总。
    ④通过汇总与设置好的阈值进行比对,如果大于或等于。用户继续摇晃手机,否则继续记录当期的数据(加速度读和时间)


    1、手机摇晃处理。摇一摇随机选彩票ShakeListener.java

    package com.yiyun.mobileblottery.view.sensor;
    
    import android.content.Context;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    import android.os.Vibrator;
    //手机摇晃处理
    public abstract class ShakeListener implements SensorEventListener {
    	private float lastX;
    	private float lastY;
    	private float lastZ;
    	private long lastTime;
    	private Context context;
    	//手机振动的处理
    	private Vibrator vibrator;
    	
    	public ShakeListener(Context context) {
    		super();
    		this.context = context;
    		vibrator=(Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
    	}
    
    	private long duretion=100;//指定时间间隔
    	private float total;//增量的累加
    	private float swiftValue=200;//判断手机摇晃的阈值
    	
    	
    	@Override
    	public void onSensorChanged(SensorEvent event) {
    		//①判断是否为第一个点
    		//如果时间为0,则为第一个点
    		if (lastTime==0) {
    			lastX=event.values[SensorManager.DATA_X];
    			lastY=event.values[SensorManager.DATA_Y];
    			lastZ=event.values[SensorManager.DATA_Z];
    			//获得系统时间
    			lastTime=System.currentTimeMillis();
    		}else {
    			//②第二个点的时间
    			long currentTime=System.currentTimeMillis();
    			//第一个点的时间-地二个点的时间>=指定时间间隔
    			//这样做的目的是尽可能屏蔽掉不同手机的差异
    			if ((currentTime-lastTime)>=duretion) {
    				//第二个点及以后的点
    				float x=event.values[SensorManager.DATA_X];
    				float y=event.values[SensorManager.DATA_Y];
    				float z=event.values[SensorManager.DATA_Z];
    				
    				//第二个点与第一个点轴之间的增量
    				float dx=Math.abs(x-lastX);
    				float dy=Math.abs(x-lastY);
    				float dz=Math.abs(x-lastZ);
    				
    				//第一个点与第二个点总的增量
    				float shake=dx+dy+dz;
    				
    				//③获取到两个相邻的增量进行汇总
    				total+=shake;
    				
    				//④通过汇总与设置好的阈值进行比对,如果大于或等于,确定用户在摇晃手机。否则继续记录当期的数据(数据+时间)
    				if (total>=swiftValue) {
    					//摇晃手机的处理
    					//①机选一注彩票
    					randCure();
    				    <span style="white-space:pre">	</span>//②提示用户(声音或振动)
    					vibrator.vibrate(100);
    					//③所有数据都要初始化
    					init();
    				}
    			}
    		}
    
    	}
    
    	/**
    	 * 具体在这里做处理:摇晃机选一注彩票
    	 * 以抽象处理,让子类实现具体方法
    	 */
    	public abstract void randCure();
    
    	/**第二次摇
    	 * 所有数据都要初始化
    	 */
    	private void init() {
    		float lastX=0;
    		float lastY=0;
    		float lastZ=0;
    		long lastTime=0;
    		
    		float total=0;//增量的累加
    	}
    
    	@Override
    	public void onAccuracyChanged(Sensor sensor, int accuracy) {
    		
    	}
    }
    


    2、权限注册AndroidManifest.xml

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


    3、子类实现的具体方法,选双色球PlaySSQ.java

    /**
    	 * 机选双色球
    	 */
    	protected void randomSSQ() {
    		Random random=new Random();
    		//机选红球
    		//一般设置的数=size-1,设置33个红球的随机数
    		int redNum=random.nextInt(33)+1;
    		redNums.clear();//每次清空
    		//每次点击机选彩票需要产生6个随机数红球
    		while (redNums.size()<6) {
    			//随机选择会有重复的,如果有重复的就不装载,继续随机
    			//contains如果此列表中包含指定的元素,则返回 true。
    			if (redNums.contains(redNum)) {
    				continue;
    			}
    			redNums.add(redNum);
    		}
    		
    		//机选篮球
    		int blueNum=random.nextInt(16)+1;
    		blueNums.add(blueNum);
    		
    		//通知更新UI
    		redAdapter.notifyDataSetChanged();
    		blueAdapter.notifyDataSetChanged();
    	}


    4、效果图



    O(∩_∩)O哈哈~欢迎交流......

    ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆转载请注明出处☞指尖飞落的博客☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆




    展开全文
  • 本编讲的是在微信公众号模仿微信摇一摇的采坑之路,供大家参考 小编只做个搬运工 源码地址:https://alexgibson.github.io/shake.js 实现原理: 微信摇一摇事件需要有硬件支撑,要求手机中有 陀螺仪(顾明思议它是利用...
  • vue中使用摇一摇功能(兼容ios13.3以上)

    千次阅读 热门讨论 2021-01-24 15:51:55
    最近做了个摇一摇类似的功能,使用的是shake.js,但在ios13.3之前的版本中可以触发摇一摇,之后的版本需要兼容,需要制作一个让用户能手动点击的弹框,才能使用户授权动作与方向的权限。(要使用https的协议) <...
  • 学习微信网页开发工具包,高效利用微信生态能力
  • 手机摇一摇 功能

    2016-06-15 14:17:41
    原理:手机系统有传感器,调用手机传感器,并让手机振动 public abstract class ShakeListener implements SensorEventListener{ private int duration = 100;//采样时间间隔 private long lastTime;...//上
  • 手机摇一摇监听

    2018-07-18 11:05:54
    最近项目需要用到手机摇一摇,之前没做过,就在网上找了一下,在此记录一下,直接上代码。 // 手机摇一摇监听 (function(global, factory) { $('.p6-tishi').hide(); if (typeof define === 'function' &am...
  • 大家好我是指尖,玩家们心心念的心愿活动终于来了,王者荣耀这个活动已经持续了至少三年的时间,无缺席,不知道这次欧皇是不是你呢?微信有心愿,QQ有钓鲲,两个活动都是非常良心的活动,不少玩家因此获得了...
  • 首先 在起始状态 在AppDelegate的代理类中 在- (BOOL)application:(UIApplication *)application ...在这个函数中,要先先在我们的手机的磁盘文件中判断保存我们摇一摇状态的文件是否存在
  • 摇一摇动画效果 (加震动音效)
  • html5手机摇一摇实现随机抽取用户电话号码
  • 前言感想:不放过任何一个WARNING、ERROR或者不够好的体验点,持续不断优化,精益求精,我们就能够得到提高。 1. HTML5摇一摇效果监测 2. 微信浏览器Audio播放优化
  • 非酋玩家实测皮肤概率,20分钟到嘻哈皮肤,作为个准非酋玩家,当其他召唤师心愿实现拿到传说和勇者皮肤的时候,小新永远是应该,并且很开心地对自己说,1w8的英雄不错了,而狂欢时刻冲着赵云皮肤去的小新,没...
  • 1. devicemotion:监听手机加速度变化的事件(比如:手机疯狂摇摆) 属性:均为只读属性 (1)accelerationIncludingGravity:重力加速度(包括重心引力9.8) (2)acceleration:加速度(需要设备...摇一摇: ...
  • 知识点: new Random() . next( 33): 产生个 0-33 (含0不含33) 的随机数 所以+1之后 , 就变成了 1-34( 1 - 33); HashSet集合:存储不重复的元素.... add( E element) 往集合... 双色球规则:双色球每投注号码...
  • 首先 我们看下360摇一摇的那个界面 (我去,这图片大了点~~,ubuntu找不到图像编辑工具) 因为目前有个蛋疼的需求,要做过类似与这样小球晃来晃去然后跳出个结果来的东西。 说的白点,其实我这边的一个功能...
  • 众所周知, 微信中的摇一摇功能: 搜索人/歌曲/电视,同样在一些其他类APP中也有一个摇一摇签到, 摇一摇随机号等功能,下面以微信摇一摇功能来介绍实现原理. 对于摇一摇功能, 在iOS中系统默认为我们提供了摇一摇的...
  • 摇一摇截屏相关功能 -- 集成文档

    千次阅读 2014-04-15 11:35:20
    摇一摇截屏相关功能 -- 集成文档 1.添加摇一摇截屏分享所需的依赖2.摇一摇相关各种功能,请按需集成 2.1 摇一摇截图分享 2.1.1 注册监听摇一摇事件2.1.2 普通应用程序2.1.3 使用Cocos2d的游戏2.1.4 ...
  • 实现思路:因为手机传感器每隔段时间会发送采集到的数据包, 首先获取第个数据包所在的三个轴的加速度值,记录, 当过段时间之后再次获取三个轴的加速度值,计算增量,将相邻两个点的增量进行汇总,当达到预先...
  • 用java写的个彩票

    2010-04-17 16:16:43
    平时我们做IT这行的朋友,没事都喜欢买两,呵呵不知道大家是否这样,反正我认识的哥们大都这样,自己闲着没事编了一套小程序,感觉很不错。大家可以试用一下碰碰自己的运气,真要中奖了别忘记我哦。
  • 设计了种双振子自走型直线超声电机,电机的定子由2个同轴的对称布置的弯曲摇头型振子和中部带细颈的柔性振动块组成。2个振子的弯曲振动会激励出中间振动块的摇头振动,使驱动头上的质点产生椭圆运动轨迹,与导轨摩擦...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,494
精华内容 3,397
关键字:

机选一注摇一摇