仿淘宝"摇一摇"

简介:

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

 

效果图如下:

 

 

 

 

 

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

 

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

 

相关文章
|
XML Android开发 数据格式
自定义 behavior - 完美仿 QQ 浏览器首页,美团商家详情页(二)
自定义 behavior - 完美仿 QQ 浏览器首页,美团商家详情页
|
5月前
|
前端开发 搜索推荐 API
按图搜索淘宝商品(拍立淘)接口(Taobao.item_search_img)
按图搜索淘宝商品(拍立淘)接口(Taobao.item_search_img)
|
XML Android开发 数据格式
Android仿淘宝、京东Banner滑动查看图文详情
本文基于 `ViewPager2` 实现的 `Banner` 效果,进而实现了仿淘宝、京东`Banner`滑动至最后一页时继续滑动来查看图文详情的效果。
216 0
|
存储 容器
仿百度福袋红包界面
仿百度福袋红包界面
88 0
仿百度福袋红包界面
|
机器学习/深度学习 图形学
lol手游之任务进度条精准计算
unity实现lol任务进度条精准计算
lol手游之任务进度条精准计算
|
编解码 JavaScript 前端开发
送花送包送红包,不如用JS送给Ta一个VR世界
心动了吗?你以为实现这个炫酷特效会很复杂?
送花送包送红包,不如用JS送给Ta一个VR世界
|
移动开发 缓存 Dart
用前端最舒服的躺姿 "搞定" Flutter
当下最火的跨端技术,当属于 Flutter ,应该没人质疑吧。一个新的技术的趋势,最明显的特征,就是它一定想把“前浪”拍死在沙滩上。这个前浪,就是"react Native","weex"。目前随便在搜索引擎上 搜索"Flutter reactNative",就全是这两个技术的对比,评测。
用前端最舒服的躺姿 "搞定" Flutter
|
移动开发 Android开发 iOS开发
html5直播实例|h5仿陌陌、仿火山小视频
这段时间直播、小视频比较火,于是空余时间利用h5开发的仿陌陌、抖音、火山小视频项目,使用到了html5+css3+jQuery+iscroll+swiper+wlsPop+wcMsgTips等技术架构开发,界面功能效果挺不错哒!!!                
4584 0
第137天:移动端-仿京东秒杀倒计时
京东秒杀倒计时 1、HTML 1 2 3 掌上秒杀 4 5 0 6 0 7 : 8 0 9 0 10 : 11 0 12 ...
1218 0