仿淘宝"摇一摇"

简介:

前几天看到淘宝最新的客户端有一个弱网络情况数据加载超时,手持摇一摇即可手动刷新功能,觉得蛮有趣,便自己抽空实现了下,并增加了摇动时对话框抖动和声音的效果。

 

效果图如下:

 

 

 

 

 

  主要代码如下,具体代码可以参见附件:

 

Java代码   收藏代码
  1. /** 
  2.  * 摇一摇,尝试重新连接网络 
  3.  * @ClassName: ShakeDialog 
  4.  * @author 姜涛 
  5.  * @version 1.0 2012-2-2 上午10:26:09 
  6.  */  
  7. public class ShakeDialog extends AlertDialog implements OnClickListener,  
  8.         SensorEventListener {  
  9.   
  10.     private View view;  
  11.     private Context mContext;  
  12.     private Button settingBtn, retryBtn, backBtn;  
  13.   
  14.     private SensorManager mSensorManager;  
  15.     private long firstTime = 0, endTime = 0;  
  16.     private float x, last_x;  
  17.     private float y, last_y;  
  18.     private float z, last_z;  
  19.     private MediaPlayer mediaPlayer;  
  20.   
  21.     private static final int CHECK_NET = 1;  
  22.     private static final long TIME = 1000;  
  23.     private final Handler handler = new Handler() {  
  24.   
  25.         @Override  
  26.         public void handleMessage(Message msg) {  
  27.             switch (msg.what) {  
  28.   
  29.             case CHECK_NET:  
  30.   
  31.                 if (NetUtils.checkNetwork(mContext)) {  
  32.                     dismiss();  
  33.                 } else {  
  34.                     view.setVisibility(View.VISIBLE);  
  35.                 }  
  36.   
  37.                 break;  
  38.   
  39.             }  
  40.         }  
  41.   
  42.     };  
  43.   
  44.     public ShakeDialog(Context context) {  
  45.         super(context);  
  46.         this.mContext = context;  
  47.     }  
  48.   
  49.     @Override  
  50.     protected void onCreate(Bundle savedInstanceState) {  
  51.         super.onCreate(savedInstanceState);  
  52.         view = getLayoutInflater().inflate(R.layout.connecterror_layout, null);  
  53.         setContentView(view);  
  54.   
  55.         initUi();  
  56.         initView();  
  57.         addListener();  
  58.     }  
  59.   
  60.     @Override  
  61.     protected void onStop() {  
  62.         if (mSensorManager != null)  
  63.             mSensorManager.unregisterListener(this);  
  64.         if (mediaPlayer != null)  
  65.             mediaPlayer.release();  
  66.         super.onStop();  
  67.     }  
  68.   
  69.     private void initUi() {  
  70.         settingBtn = (Button) findViewById(R.id.setting);  
  71.         retryBtn = (Button) findViewById(R.id.retry);  
  72.         backBtn = (Button) findViewById(R.id.back);  
  73.   
  74.         mSensorManager = (SensorManager) mContext  
  75.                 .getSystemService(Context.SENSOR_SERVICE);  
  76.         mSensorManager.registerListener(this,  
  77.                 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
  78.                 SensorManager.SENSOR_DELAY_UI); // 注册加速度感应器  
  79.         mediaPlayer = new MediaPlayer();  
  80.     }  
  81.   
  82.     private void initView() {  
  83.         try {  
  84.             AssetFileDescriptor fd = mContext.getResources().getAssets()  
  85.                     .openFd("sound/shake_sound_male.mp3");  
  86.             mediaPlayer.setDataSource(fd.getFileDescriptor(),  
  87.                     fd.getStartOffset(), fd.getLength());  
  88.             mediaPlayer.prepare();  
  89.         } catch (IOException e) {  
  90.             e.printStackTrace();  
  91.         }  
  92.     }  
  93.   
  94.     private void addListener() {  
  95.         settingBtn.setOnClickListener(this);  
  96.         retryBtn.setOnClickListener(this);  
  97.         backBtn.setOnClickListener(this);  
  98.     }  
  99.   
  100.     @Override  
  101.     public void onClick(View v) {  
  102.         switch (v.getId()) {  
  103.   
  104.         case R.id.setting: // 设置网络  
  105.   
  106.             Intent intent = new Intent(  
  107.                     android.provider.Settings.ACTION_WIRELESS_SETTINGS);  
  108.             mContext.startActivity(intent);  
  109.   
  110.             break;  
  111.   
  112.         case R.id.retry: // 重试  
  113.   
  114.             view.setVisibility(View.INVISIBLE);  
  115.   
  116.             handler.sendEmptyMessageDelayed(CHECK_NET, TIME);  
  117.   
  118.             break;  
  119.   
  120.         case R.id.back: // 返回  
  121.   
  122.             cancel();  
  123.   
  124.             break;  
  125.   
  126.         }  
  127.     }  
  128.   
  129.     /** 
  130.      * 传感器精确度变化时调用 
  131.      */  
  132.     @Override  
  133.     public void onAccuracyChanged(Sensor sensor, int accuracy) {  
  134.         // TODO Auto-generated method stub  
  135.   
  136.     }  
  137.   
  138.     /** 
  139.      * 传感器数据变化时调用 
  140.      */  
  141.     @Override  
  142.     public void onSensorChanged(SensorEvent event) {  
  143.   
  144.         int sensorType = event.sensor.getType();  
  145.         float[] values = event.values;  
  146.   
  147.         if (sensorType == Sensor.TYPE_ACCELEROMETER) {  
  148.   
  149.             firstTime = System.currentTimeMillis();  
  150.             if ((firstTime - endTime) > 100) {  
  151.                 long betweenTime = firstTime - endTime;  
  152.                 /** 
  153.                  * x方向就是手机的水平方向,右为正    
  154.                  * y方向就是手机的水平垂直方向,前为正    
  155.                  * y方向就是手机的空间垂直方向,天空的方向为正,地球的方向为负 
  156.                  */  
  157.                 x = values[SensorManager.DATA_X];  
  158.                 y = values[SensorManager.DATA_Y];  
  159.                 z = values[SensorManager.DATA_Z];  
  160.                 float speed = Math.abs(x + y + z - last_x - last_y - last_z)  
  161.                         / betweenTime * 10000;  
  162.   
  163.                 if (speed > 1000) {  
  164.                     view.startAnimation(AnimationUtils.loadAnimation(mContext,  
  165.                             R.anim.shake));  
  166.   
  167.                     mediaPlayer.start();  
  168.   
  169.                     handler.sendEmptyMessageDelayed(CHECK_NET, TIME);  
  170.                 }  
  171.                 last_x = x;  
  172.                 last_y = y;  
  173.                 last_z = z;  
  174.                 endTime = System.currentTimeMillis();  
  175.             }  
  176.   
  177.         }  
  178.   
  179.     }  
  180.   
  181.     static class NetUtils {  
  182.   
  183.         /** 
  184.          * 判断网络的连接情况 
  185.          *  
  186.          * @param context 
  187.          * @return 
  188.          */  
  189.         public static boolean checkNetwork(Context context) {  
  190.             boolean result;  
  191.             ConnectivityManager manager = (ConnectivityManager) context  
  192.                     .getSystemService(Context.CONNECTIVITY_SERVICE);  
  193.             NetworkInfo info = manager.getActiveNetworkInfo();  
  194.             if (manager == null || info == null || !info.isAvailable()  
  195.                     || !info.isConnected()) {  
  196.                 result = false;  
  197.             } else {  
  198.                 result = true;  
  199.             }  
  200.             return result;  
  201.         }  
  202.     }  
  203. }  

 


 下载地址:

 http://download.csdn.net/detail/jdsjlzx/4332820

 

相关文章
|
7月前
|
容器
自定义 behavior - 完美仿 QQ 浏览器首页,美团商家详情页(一)
自定义 behavior - 完美仿 QQ 浏览器首页,美团商家详情页
|
7月前
|
XML Android开发 数据格式
自定义 behavior - 完美仿 QQ 浏览器首页,美团商家详情页(二)
自定义 behavior - 完美仿 QQ 浏览器首页,美团商家详情页
1、小兔鲜icon图标制作
1、小兔鲜icon图标制作
138 0
1、小兔鲜icon图标制作
|
JSON 小程序 前端开发
【今天吃什么】微信小程序炫酷摇一摇来告诉你!
【今天吃什么】微信小程序炫酷摇一摇来告诉你!
1599 1
【今天吃什么】微信小程序炫酷摇一摇来告诉你!
JS 实现京东商城放大镜
JS 实现京东商城放大镜
JS 实现京东商城放大镜
|
移动开发 Android开发 iOS开发
html5直播实例|h5仿陌陌、仿火山小视频
这段时间直播、小视频比较火,于是空余时间利用h5开发的仿陌陌、抖音、火山小视频项目,使用到了html5+css3+jQuery+iscroll+swiper+wlsPop+wcMsgTips等技术架构开发,界面功能效果挺不错哒!!!                
4545 0
|
Android开发
Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博
原文:Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博 兼容SDK 18以上的系统,直接调用系统分享功能,分享文本、图片、文件到第三方APP,如:微信、QQ、微博等 因为偷懒,可直达微信、朋友圈、QQ、QQ空间、微博的分享仅写了图片分享的,其他的文本、文件分享不常用到,就不写了。
6276 0
|
Android开发
仿抖音底部导航(二)
继续实现仿抖音底部导航 今天要实现效果如下图 实现效果 首先在原基础的布局中加入一个ImageView 这里附上刷新的图片素材 image 然后在原代码中进行修改以实现导航的动画及刷新功能 1.
1738 0
|
XML Android开发 数据格式
仿抖音底部导航效果(一)
最终效果预览 最终效果 这次实现的是第一步效果 本次效果 原理解析:通过对控件添加动画来实现仿抖音底部导航的效果 一.首先编写布局文件(这里是用TextView作为底部的指示横线) 二.
2032 0
第137天:移动端-仿京东秒杀倒计时
京东秒杀倒计时 1、HTML 1 2 3 掌上秒杀 4 5 0 6 0 7 : 8 0 9 0 10 : 11 0 12 ...
1195 0