手机摇一摇震动刷新(支持ListView GridView WebView)

2024-06-09 02:38

本文主要是介绍手机摇一摇震动刷新(支持ListView GridView WebView),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

手机摇一摇震动刷新

第一步:看摇一摇震动刷新的前后的效果图

1、摇一摇震动刷新前的效果图如下(图片太大了,分2次录屏的,如果看着不爽请猛戳我的github上面的演示)



2、摇一摇震动刷新之后的效果图如下

      说明:我笔记本的虚拟机没有重力感应,所以用虚拟机摇一摇没反应,然后我用真机测试,摇一摇伴随着震动,然后把每个页面摇一摇震动刷新的效果图片都截图下来了,然后做成.gif格式,做得不好勿喷。

第二步:为什么会想到摇一摇震动刷新

 1、有时候QQ很卡,打开网页很卡,想砸手机,如果这个时候摇一摇手机能刷新就好了。

 2、看到过PullToFefresh、swipeFresh、UItraPullToFresh都是下拉刷新,能不能换一种方式刷新呢?

 3、摇一摇伴随着震动很好玩,震动,你懂的…………

第三步:介绍手机重力传感器和震动相关知识

1、重力传感器

重力传感器与方向传感器的开发步骤类似,只要理清了期中的x,y,z的值之后就可以根据他们的变化来进行编程了,首先来看一副图


假设当地的重力加速度值为g

当手机正面朝上的时候,z的值为q,反面朝上的时候,z的值为-g
当手机右侧面朝上的时候,x的值为g,右侧面朝上的时候,x的值为-g
当手机上侧面朝上的时候,y的值为g,右侧面朝上的时候,y的值为-g
了解了重力传感器中X,Y,Z的含义之后下面我们就开始学习如何使用
首先我们创建一个传感器管理器( SensorManager)和一个传感器监听器( MySensorEventListener),管理器用来管理传感器以及创建各种各样的传感器,监听器用来监视传感器的变化并且进行相应的操作
如果一个类实现了 MySensorEventListener这个监听,那么需要实现如下2个方法,如何才能使下面2个方法有效呢?

[html]  view plain copy print ?
  1. public void onSensorChanged(SensorEvent event){}   //可以得到传感器实时测量出来的变化值  
  2. public void onAccuracyChanged(Sensor sensor, int accuracy) {  
  3.         //当传感器精度改变时回调该方法,Do nothing.  
  4.     }  

第一步:获取传感器管理服务,代码如下
[html]  view plain copy print ?
  1. //获取传感器管理服务  
  2. mSensorManager = (SensorManager) getActivity().getSystemService(Service.SENSOR_SERVICE);  
第二步:我们需要用SensorManager现在onResume(){}函数里面注册,相关代码如下
[html]  view plain copy print ?
  1. @Override  
  2. public void onResume() {  
  3.     super.onResume();  
  4.     //加速度传感器 注册监听  
  5.     mSensorManager.registerListener(this,  
  6.             mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
  7.             //还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,  
  8.             //根据不同应用,需要的反应速率不同,具体根据实际情况设定  
  9.             SensorManager.SENSOR_DELAY_NORMAL);  
  10. }  
第三步:我们最后不要忘记了在onStop()方法里面取消注册,相关代码如下
[html]  view plain copy print ?
  1. @Override  
  2.  public void onStop() {  
  3.      super.onStop();  
  4.      //取消注册  
  5.      mSensorManager.unregisterListener(this);  
  6.  }  

2、手机震动

第一步:我们需要获取震动管理服务,代码如下

[html]  view plain copy print ?
  1. //震动  
  2.         vibrator = (Vibrator) getActivity().getSystemService(Service.VIBRATOR_SERVICE);  

 第二步:设置震动的时间,代码如下

[html]  view plain copy print ?
  1. vibrator.vibrate(500);  

第三步:一定要记得在AndroidManifest.xml文件加上权限,不然会出现然并卵

[html]  view plain copy print ?
  1. <uses-permission android:name="android.permission.VIBRATE"/>  

第四步:导入项目需要SlidingMenu的lib和二维码相关的jar包

1、配置好SlingMenu的lib

 第一步:下载项目源码    https://github.com/jfeinstein10/SlidingMenu
第二步:把Slidingmenu里面的lib文件夹配置到我的项目里面,如果你不知道怎么配置,或者不知道怎么使用,请猛戳这里,Android之SlidingMenu使用和总结

2、配置好二维码所需要的jar包

第一步:下载这个jar包,二维码的包

第二步:加到项目里面的libs文件夹里面,然后点击右键,add as library

第三步:如果你不熟悉二维码相关的知识,别怕,请猛戳这里,Android之二维码的生成和识别

3、看下项目所有的文件,很简单,就几个。



第五步:实现手机摇一摇(ListView)震动刷新

从上面的效果图可以看出,侧滑菜单点击的时候是取代中间的Fragment,ListView,我用的是SimpleAdaptor

simple_list_item.xml文件如下

[html]  view plain copy print ?
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:orientation="horizontal"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     >  
  6.     <TextView  
  7.         android:id="@+id/text1"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_marginTop="5dp"  
  11.         android:textColor="#29bffb"  
  12.         android:textSize="25sp"  
  13.         />  
  14.     <TextView  
  15.         android:id="@+id/text2"  
  16.         android:layout_width="wrap_content"  
  17.         android:layout_height="wrap_content"  
  18.         android:layout_marginTop="5dp"  
  19.         android:textColor="#FF4040"  
  20.         android:textSize="25sp"  
  21.         />  
  22. </LinearLayout>  
listview_fragment.xml文件如下

[html]  view plain copy print ?
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     xmlns:sat="http://schemas.android.com/apk/res-auto"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     android:paddingBottom="@dimen/activity_vertical_margin"  
  10.     tools:context=".MainActivity">  
  11.      <ListView  
  12.              android:id="@+id/listview_fragment"  
  13.             android:layout_width="match_parent"  
  14.             android:layout_height="match_parent">  
  15.      </ListView>  
  16. </RelativeLayout>  
然后是我的ListViewFragment.java文件

[html]  view plain copy print ?
  1. package com.example.chenyu.shaketofresh;  
  2.   
  3. import android.app.Fragment;  
  4. import android.app.Service;  
  5. import android.hardware.Sensor;  
  6. import android.hardware.SensorEvent;  
  7. import android.hardware.SensorEventListener;  
  8. import android.hardware.SensorManager;  
  9. import android.os.AsyncTask;  
  10. import android.os.Bundle;  
  11. import android.os.Vibrator;  
  12. import android.support.annotation.Nullable;  
  13. import android.util.Log;  
  14. import android.view.LayoutInflater;  
  15. import android.view.View;  
  16. import android.view.ViewGroup;  
  17. import android.widget.ListView;  
  18. import android.widget.SimpleAdapter;  
  19.   
  20. import java.util.ArrayList;  
  21. import java.util.HashMap;  
  22. import java.util.List;  
  23. import java.util.Map;  
  24.   
  25. /**  
  26.  * Created by Think on 2015/11/7.  
  27.  */  
  28. public class ListViewFragment extends Fragment implements SensorEventListener {  
  29.     List<Map<String, Object>> mData = new ArrayList<Map<String, Object>>();  
  30.     private String[] mListTitle = {"功能: ", "附带:", "姓名: ", "我的QQ:", "QQ学习群:", "邮箱:"};  
  31.     private String[] mListStr = {"手机摇一摇震动刷新", "摇出我的二维码", "陈喻", "2657607916", "319010802", "2657607916@qq.com"};  
  32.     private ListView mlistView = null;  
  33.     private ListView lv;  
  34.     private SimpleAdapter adapter;  
  35.     private int i = 0;  
  36.     private SensorManager mSensorManager;//定义sensor管理器  
  37.     private Vibrator vibrator;           //震动  
  38.   
  39.     @Nullable  
  40.     @Override  
  41.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  42.         View view = inflater.inflate(R.layout.listview_fragment, container, false);  
  43.         mData = getmData();  
  44.         lv = (ListView) view.findViewById(R.id.listview_fragment);  
  45.         adapter = new SimpleAdapter(getActivity(), mData, R.layout.simple_list_item, new String[]{"title", "text"}, new int[]{R.id.text1, R.id.text2});  
  46.         lv.setAdapter(adapter);  
  47.         //获取传感器管理服务  
  48.         mSensorManager = (SensorManager) getActivity().getSystemService(Service.SENSOR_SERVICE);  
  49.         //震动  
  50.         vibrator = (Vibrator) getActivity().getSystemService(Service.VIBRATOR_SERVICE);  
  51.         return view;  
  52.     }  
  53.   
  54.     @Override  
  55.     public void onResume() {  
  56.         super.onResume();  
  57.         //加速度传感器 注册监听  
  58.         mSensorManager.registerListener(this,  
  59.                 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
  60.                 //还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,  
  61.                 //根据不同应用,需要的反应速率不同,具体根据实际情况设定  
  62.                 SensorManager.SENSOR_DELAY_NORMAL);  
  63.     }  
  64.   
  65.     public List<Map<String, Object>> getmData() {  
  66.         for (int i = 0; i < mListTitle.length; i++) {  
  67.             Map<String, Object> map = new HashMap<String, Object>();  
  68.             map.put("title", mListTitle[i]);  
  69.             map.put("text", mListStr[i]);  
  70.             mData.add(map);  
  71.         }  
  72.         return mData;  
  73.     }  
  74.   
  75.     @Override  
  76.     public void onSensorChanged(SensorEvent event) {//可以得到传感器实时测量出来的变化值  
  77.         // TODO Auto-generated method stub  
  78.         int sensorType = event.sensor.getType();  
  79.         //values[0]:X轴,values[1]:Y轴,values[2]:Z轴  
  80.         float[] values = event.values;  
  81.         if (sensorType == Sensor.TYPE_ACCELEROMETER) {  
  82.                /*因为一般正常情况下,任意轴数值最大就在9.8~10之间,只有在你突然摇动手机  
  83.               *的时候,瞬时加速度才会突然增大或减少,所以,经过实际测试,只需监听任一轴的  
  84.               * 加速度大于14的时候,改变你需要的设置就OK了  
  85.               */  
  86.             if ((Math.abs(values[0]) > 14 || Math.abs(values[1]) > 14 || Math.abs(values[2]) > 14)) {  
  87.                 //摇动手机后,设置button上显示的字为空  
  88.                 new GetDataTask().execute();  
  89.             }  
  90.         }  
  91.     }  
  92.   
  93.     @Override  
  94.     public void onAccuracyChanged(Sensor sensor, int accuracy) {  
  95.         //当传感器精度改变时回调该方法,Do nothing.  
  96.     }  
  97.   
  98.     private class GetDataTask extends AsyncTask<Void, Void, Map<String, Object>> {  
  99.         @Override  
  100.         protected Map<String, Object> doInBackground(Void... params) {  
  101.   
  102.             Map<String, Object> map = new HashMap<String, Object>();  
  103.             map.put("title", "我是第--" + (++i) + "--个被摇出来的");  
  104.             map.put("text", "");  
  105.             //摇动手机后,再伴随震动提示~~  
  106.             vibrator.vibrate(500);  
  107.             return map;  
  108.         }  
  109.   
  110.         @Override  
  111.         protected void onPostExecute(Map<String, Object> stringObjectMap) {  
  112.             //            super.onPostExecute(stringObjectMap);  
  113.             mData.add(stringObjectMap);  
  114.             adapter.notifyDataSetChanged();  
  115.             // Call onRefreshComplete when the list has been refreshed. 如果没有下面的函数那么刷新将不会停  
  116.         }  
  117.     }  
  118.   
  119.     @Override  
  120.     public void onStop() {  
  121.         super.onStop();  
  122.         //取消注册  
  123.         mSensorManager.unregisterListener(this);  
  124.     }  
  125. }  

这个类实现了SensorEventListener这个监听,所以得实现onSensorChanged(){}、onAccuracyChanged(){}这2个方法,代码里面我已经注释很清楚了,然后也在onResume(){}方法里面注册了,在onStop()方法里面也取消注册了,在onCreatView方法里面分别得到了传感器、震动的管理服务,然后用了AsyncTask实现异步功能。

然后就是我的MainActivity.java类

[html]  view plain copy print ?
  1. package com.example.chenyu.shaketofresh;  
  2.   
  3. import android.app.FragmentManager;  
  4. import android.app.FragmentTransaction;  
  5. import android.graphics.Color;  
  6. import android.hardware.SensorManager;  
  7. import android.os.AsyncTask;  
  8. import android.os.Vibrator;  
  9. import android.support.v7.app.AppCompatActivity;  
  10. import android.os.Bundle;  
  11. import android.util.DisplayMetrics;  
  12. import android.view.View;  
  13. import android.widget.ListView;  
  14. import android.widget.TextView;  
  15.   
  16. import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;  
  17.   
  18. import java.util.ArrayList;  
  19.   
  20. public class MainActivity extends AppCompatActivity {  
  21.     private TextView tvListView;  //侧滑菜单listView  
  22.     private TextView tvGridView;  //侧滑菜单GridView  
  23.     private TextView tvWebview;   //侧滑菜单WebView  
  24.     private TextView tvCode;      //侧滑菜单我的二维码  
  25.     private ArrayList<TextView> textViews;  
  26.     private static SlidingMenu menu;  
  27.     private ListView slidingLv;   //侧滑菜单  
  28.   
  29.     @Override  
  30.     protected void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_main);  
  33.         //初始化界面  
  34.         FragmentManager fm = getFragmentManager();  
  35.         FragmentTransaction ft = fm.beginTransaction();  
  36.         ListViewFragment listViewFragment = new ListViewFragment();  
  37.         ft.replace(R.id.content, listViewFragment);  
  38.         ft.commit();  
  39.         //初始左侧菜单  
  40.         initSlidingMenu();  
  41.     }  
  42.   
  43.     private void initSlidingMenu() {  
  44.         //侧滑菜单  
  45.         menu = new SlidingMenu(MainActivity.this); // 实例化滑动菜单对象  
  46.         menu.setMode(SlidingMenu.LEFT);  
  47.         menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);  
  48.         //  menu.setShadowWidthRes(R.dimen.shadow_width); // 设置菜单边缘的渐变颜色宽度 (阴影效果宽度)  
  49.         //   menu.setShadowDrawable(R.drawable.slidingmenu_shadow); // 设置滑动阴影的图像资源  
  50.         //  menu.setBehindOffsetRes(R.dimen.slidingmenu_offset); // 设置滑动菜单视图的宽度  
  51.         menu.setFadeDegree(0.35f);// 边框的角度,这里指边界地方(设置渐入渐出效果的值 )  
  52.         menu.attachToActivity(MainActivity.this, SlidingMenu.SLIDING_CONTENT); // 把侧滑栏关联到当前的Activity  
  53.         menu.setMenu(R.layout.slidingmenu);// 设置当前的视图  
  54.         DisplayMetrics metric = new DisplayMetrics();  
  55.         getWindowManager().getDefaultDisplay().getMetrics(metric);  
  56.         long screenWidth = metric.widthPixels;// 获取屏幕的宽度  
  57.         menu.setBehindWidth((int) (screenWidth * 0.4));// 设置左页的宽度  
  58.         View view = menu.getMenu();  
  59.         findMenuViews(view);//  
  60. //        menu.showMenu();  如果想一进入界面,想把左侧菜单显示出来,用这个函数  
  61.     }  
  62.   
  63.     /**  
  64.      * 把侧滑菜单的控件初始化  
  65.      * @param view  
  66.      */  
  67.     private void findMenuViews(View view) {  
  68.         tvListView = (TextView) view.findViewById(R.id.menu_listview);  
  69.         tvGridView = (TextView) view.findViewById(R.id.menu_gridview);  
  70.         tvWebview = (TextView) view.findViewById(R.id.menu_webview);  
  71.         tvCode = (TextView) view.findViewById(R.id.menu_code);  
  72.   
  73.         tvListView.setOnClickListener(new MyOnClickListener());  
  74.         tvGridView.setOnClickListener(new MyOnClickListener());  
  75.         tvWebview.setOnClickListener(new MyOnClickListener());  
  76.         tvCode.setOnClickListener(new MyOnClickListener());  
  77.   
  78.     }  
  79.   
  80.     /**  
  81.      * 改变每次点击左侧菜单的颜色  
  82.      * @param textView  
  83.      */  
  84.     public void changeTextColor(TextView textView) {  
  85.         textViews = new ArrayList<TextView>();  
  86.         textViews.add(tvGridView);  
  87.         textViews.add(tvWebview);  
  88.         textViews.add(tvListView);  
  89.         textViews.add(tvCode);  
  90.         for (int i = 0; i < textViews.size(); i++) {  
  91.             if (textViews.get(i).equals(textView)) {  
  92.                 textView.setTextColor(Color.GREEN);  
  93.             } else {  
  94.                 textViews.get(i).setTextColor(Color.WHITE);  
  95.             }  
  96.         }  
  97.     }  
  98.   
  99.     class MyOnClickListener implements View.OnClickListener {  
  100.         @Override  
  101.         public void onClick(View v) {  
  102.             FragmentManager fm = getFragmentManager();  
  103.             FragmentTransaction ft = fm.beginTransaction();  
  104.             switch (v.getId()) {  
  105.                 case R.id.menu_listview:  
  106.                     changeTextColor(tvListView);  
  107.                     ListViewFragment listViewFragment = new ListViewFragment();  
  108.                     ft.replace(R.id.content, listViewFragment);  
  109.                     break;  
  110.                 case R.id.menu_gridview:  
  111.                     changeTextColor(tvGridView);  
  112.                     GridViewFragment gridViewFragment = new GridViewFragment();  
  113.                     ft.replace(R.id.content, gridViewFragment);  
  114.                     break;  
  115.                 case R.id.menu_webview:  
  116.                     changeTextColor(tvWebview);  
  117.                     WebViewFragment webViewFragment = new WebViewFragment();  
  118.                     ft.replace(R.id.content, webViewFragment);  
  119.                     break;  
  120.                 case R.id.menu_code:  
  121.                     changeTextColor(tvCode);  
  122.                     CodeFragment codeFragment = new CodeFragment();  
  123.                     ft.replace(R.id.content, codeFragment);  
  124.                     break;  
  125.                 default:  
  126.                     break;  
  127.             }  
  128.             ft.commit();  
  129.         }  
  130.     }  
  131. }  

里面初始化了侧滑菜单,以及一些相关侧滑菜单配置,slidingmenu.xml文件如下

[html]  view plain copy print ?
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     xmlns:sat="http://schemas.android.com/apk/res-auto"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     android:paddingBottom="@dimen/activity_vertical_margin"  
  10.     tools:context=".MainActivity"  
  11.     android:orientation="vertical"  
  12.     android:background="#666666">  
  13.        <TextView  
  14.            android:id="@+id/menu_listview"  
  15.            android:layout_width="match_parent"  
  16.            android:layout_height="40dp"  
  17.            android:textColor="#ffffff"  
  18.            android:textSize="18sp"  
  19.            android:text="ListView刷新"/>  
  20.         <View  
  21.             android:layout_width="match_parent"  
  22.             android:layout_height="1dp"  
  23.             android:background="#00B2EE"  
  24.             />  
  25.         <TextView  
  26.             android:id="@+id/menu_gridview"  
  27.             android:layout_width="match_parent"  
  28.             android:layout_height="40dp"  
  29.             android:paddingTop="5dp"  
  30.             android:text="GridView刷新"  
  31.             android:textColor="#ffffff"  
  32.             android:textSize="18sp"/>  
  33.     <View  
  34.         android:layout_width="match_parent"  
  35.         android:layout_height="1dp"  
  36.         android:background="#00B2EE"  
  37.         />  
  38.         <TextView  
  39.             android:id="@+id/menu_webview"  
  40.             android:layout_width="match_parent"  
  41.             android:layout_height="40dp"  
  42.             android:paddingTop="5dp"  
  43.             android:text="WebView刷新"  
  44.             android:textColor="#ffffff"  
  45.             android:textSize="18sp"/>  
  46.     <View  
  47.         android:layout_width="match_parent"  
  48.         android:layout_height="1dp"  
  49.         android:background="#00B2EE"  
  50.         />  
  51.     <TextView  
  52.         android:id="@+id/menu_code"  
  53.         android:layout_width="match_parent"  
  54.         android:layout_height="40dp"  
  55.         android:paddingTop="5dp"  
  56.         android:text="我的二维码"  
  57.         android:textColor="#ffffff"  
  58.         android:textSize="18sp"/>  
  59.     <View  
  60.         android:layout_width="match_parent"  
  61.         android:layout_height="1dp"  
  62.         android:background="#00B2EE"  
  63.         />  
  64.     </LinearLayout>  
activity_main.xml文件如下

[html]  view plain copy print ?
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     tools:context=".MainActivity">  
  6.     <RelativeLayout  
  7.         android:id="@+id/content"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent"></RelativeLayout>  
  10. </RelativeLayout>  

好了,然后就是我们进入页面的效果图了


当我手机摇一摇的时候伴随着震动,然后刷新了ListView如下图

第六步:实现手机摇一摇(GridView)震动刷新

grid_item.xml文件如下

[html]  view plain copy print ?
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     xmlns:sat="http://schemas.android.com/apk/res-auto"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     android:paddingBottom="@dimen/activity_vertical_margin"  
  10.     tools:context=".MainActivity"  
  11.     android:orientation="vertical"  
  12.     android:background="#666666">  
  13.        <TextView  
  14.            android:id="@+id/menu_listview"  
  15.            android:layout_width="match_parent"  
  16.            android:layout_height="40dp"  
  17.            android:textColor="#ffffff"  
  18.            android:textSize="18sp"  
  19.            android:text="ListView刷新"/>  
  20.         <View  
  21.             android:layout_width="match_parent"  
  22.             android:layout_height="1dp"  
  23.             android:background="#00B2EE"  
  24.             />  
  25.         <TextView  
  26.             android:id="@+id/menu_gridview"  
  27.             android:layout_width="match_parent"  
  28.             android:layout_height="40dp"  
  29.             android:paddingTop="5dp"  
  30.             android:text="GridView刷新"  
  31.             android:textColor="#ffffff"  
  32.             android:textSize="18sp"/>  
  33.     <View  
  34.         android:layout_width="match_parent"  
  35.         android:layout_height="1dp"  
  36.         android:background="#00B2EE"  
  37.         />  
  38.         <TextView  
  39.             android:id="@+id/menu_webview"  
  40.             android:layout_width="match_parent"  
  41.             android:layout_height="40dp"  
  42.             android:paddingTop="5dp"  
  43.             android:text="WebView刷新"  
  44.             android:textColor="#ffffff"  
  45.             android:textSize="18sp"/>  
  46.     <View  
  47.         android:layout_width="match_parent"  
  48.         android:layout_height="1dp"  
  49.         android:background="#00B2EE"  
  50.         />  
  51.     <TextView  
  52.         android:id="@+id/menu_code"  
  53.         android:layout_width="match_parent"  
  54.         android:layout_height="40dp"  
  55.         android:paddingTop="5dp"  
  56.         android:text="我的二维码"  
  57.         android:textColor="#ffffff"  
  58.         android:textSize="18sp"/>  
  59.     <View  
  60.         android:layout_width="match_parent"  
  61.         android:layout_height="1dp"  
  62.         android:background="#00B2EE"  
  63.         />  
  64.     </LinearLayout>  

gridview_fragment.xml文件如下

[html]  view plain copy print ?
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     xmlns:sat="http://schemas.android.com/apk/res-auto"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     android:paddingBottom="@dimen/activity_vertical_margin"  
  10.     tools:context=".MainActivity">  
  11.     <GridView  
  12.         android:id="@+id/gridview_fragment"  
  13.         android:layout_width="fill_parent"  
  14.         android:layout_height="fill_parent"  
  15.         android:columnWidth="100dp"  
  16.         android:gravity="center_horizontal"  
  17.         android:horizontalSpacing="1dp"  
  18.         android:numColumns="auto_fit"  
  19.         android:stretchMode="columnWidth"  
  20.         android:verticalSpacing="1dp"  
  21.         >  
  22.     </GridView>  
  23. </RelativeLayout>  
GridFragment.java文件如下

[html]  view plain copy print ?
  1. package com.example.chenyu.shaketofresh;  
  2.   
  3. import android.app.Fragment;  
  4. import android.app.Service;  
  5. import android.hardware.Sensor;  
  6. import android.hardware.SensorEvent;  
  7. import android.hardware.SensorEventListener;  
  8. import android.hardware.SensorManager;  
  9. import android.os.AsyncTask;  
  10. import android.os.Bundle;  
  11. import android.os.Vibrator;  
  12. import android.view.LayoutInflater;  
  13. import android.view.View;  
  14. import android.view.ViewGroup;  
  15. import android.widget.ArrayAdapter;  
  16. import android.widget.GridView;  
  17.   
  18. import java.util.LinkedList;  
  19.   
  20. /**  
  21.  * Created by Think on 2015/11/7.  
  22.  */  
  23. public class GridViewFragment extends Fragment implements SensorEventListener {  
  24.     private GridView gridView;  
  25.     private LinkedList<String> mListItems;  
  26.     private ArrayAdapter<String> mAdapter;  
  27.     private int mItemCount = 9;  
  28.     private SensorManager mSensorManager;//定义sensor管理器  
  29.     private Vibrator vibrator;//震动  
  30.   
  31.     @Override  
  32.     public void onResume() {  
  33.         super.onResume();  
  34.         //加速度传感器 注册监听  
  35.         mSensorManager.registerListener(this,  
  36.                 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
  37.                 //还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,  
  38.                 //根据不同应用,需要的反应速率不同,具体根据实际情况设定  
  39.                 SensorManager.SENSOR_DELAY_NORMAL);  
  40.     }  
  41.   
  42.     @Override  
  43.     public void onStop() {  
  44.         super.onStop();  
  45.         //取消注册  
  46.         mSensorManager.unregisterListener(this);  
  47.     }  
  48.     //重力传感器  
  49.     @Override  
  50.     public void onSensorChanged(SensorEvent event) {  
  51.         // TODO Auto-generated method stub  
  52.         int sensorType = event.sensor.getType();  
  53.         //values[0]:X轴,values[1]:Y轴,values[2]:Z轴  
  54.         float[] values = event.values;  
  55.         if (sensorType == Sensor.TYPE_ACCELEROMETER) {  
  56.               /*因为一般正常情况下,任意轴数值最大就在9.8~10之间,只有在你突然摇动手机  
  57.               *的时候,瞬时加速度才会突然增大或减少,所以,经过实际测试,只需监听任一轴的  
  58.               * 加速度大于14的时候,改变你需要的设置就OK了  
  59.               */  
  60.             if ((Math.abs(values[0]) > 14 || Math.abs(values[1]) > 14 || Math.abs(values[2]) > 14)) {  
  61.                 //摇动手机后,设置button上显示的字为空  
  62.                 new GetDataTask().execute();  
  63.             }  
  64.         }  
  65.     }  
  66.   
  67.     @Override  
  68.     public void onAccuracyChanged(Sensor sensor, int accuracy) {  
  69.         //当传感器精度改变时回调该方法,Do nothing.  
  70.     }  
  71.   
  72.     @Override  
  73.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  74.         View view = inflater.inflate(R.layout.gridview_fragment, container, false);  
  75.         initDatas();  
  76.         gridView = (GridView) view.findViewById(R.id.gridview_fragment);  
  77.         mAdapter = new ArrayAdapter<String>(getActivity(), R.layout.grid_item,  
  78.                 R.id.id_grid_item_text, mListItems);  
  79.         gridView.setAdapter(mAdapter);  
  80.         //获取传感器管理服务  
  81.         mSensorManager = (SensorManager) getActivity().getSystemService(Service.SENSOR_SERVICE);  
  82.         //震动  
  83.         vibrator = (Vibrator) getActivity().getSystemService(Service.VIBRATOR_SERVICE);  
  84.         return view;  
  85.     }  
  86.   
  87.     private void initDatas() {  
  88.         mListItems = new LinkedList<String>();  
  89.         for (int i = 0; i < mItemCount; i++) {  
  90.             mListItems.add(i + "");  
  91.         }  
  92.     }  
  93.   
  94.     private class GetDataTask extends AsyncTask<Void, Void, Void> {  
  95.         @Override  
  96.         protected Void doInBackground(Void... params) {  
  97.             //摇动手机后,再伴随震动提示~~  
  98.             vibrator.vibrate(500);  
  99.             return null;  
  100.         }  
  101.   
  102.         @Override  
  103.         protected void onPostExecute(Void result) {  
  104.             mListItems.add("" + mItemCount++);  
  105.             mAdapter.notifyDataSetChanged();  
  106.         }  
  107.     }  
  108. }  
GridView刷新之前的图片如下

当我手机摇一摇的时候伴随着震动,然后刷新了GridView如下图


第七步:实现手机摇一摇(WebView)震动刷新

WebView刷新的时候采用了彩色的进度条,细心的你一定会发现

progressbar.xml文件如下

[html]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.     <item android:id="@android:id/background">  
  4.         <shape>  
  5.             <corners android:radius="5dip" />  
  6.             <gradient  
  7.                 android:angle="0"  
  8.                 android:centerColor="#ff5a5d5a"  
  9.                 android:centerY="0.75"  
  10.                 android:endColor="#ff747674"  
  11.                 android:startColor="#ff9d9e9d" />  
  12.         </shape>  
  13.     </item>  
  14.     <item android:id="@android:id/secondaryProgress">  
  15.         <clip>  
  16.             <shape>  
  17.                 <corners android:radius="5dip" />  
  18.                 <gradient  
  19.                     android:angle="0"  
  20.                     android:centerColor="#29b6f6"  
  21.                     android:centerY="0.75"  
  22.                     android:endColor="#FF5F00"  
  23.                     android:startColor="#FF5F00" />  
  24.             </shape>  
  25.         </clip>  
  26.     </item>  
  27.     <item android:id="@android:id/progress">  
  28.         <clip>  
  29.             <shape>  
  30.                 <corners android:radius="5dip" />  
  31.                 <gradient  
  32.                     android:angle="0"  
  33.                     android:endColor="#8000ff00"  
  34.                     android:startColor="#FF4040" />  
  35.             </shape>  
  36.         </clip>  
  37.     </item>  
  38. </layer-list>  
webview_layout.xml文件如下

[html]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent" android:layout_height="match_parent">  
  4.     <ProgressBar  
  5.         style="?android:attr/progressBarStyleHorizontal"  
  6.         android:progressDrawable="@drawable/progressbar"  
  7.         android:id="@+id/myProgressBar"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="9px"  
  10.         />  
  11.     <WebView  
  12.         android:id="@+id/myWebView"  
  13.         android:layout_below="@id/myProgressBar"  
  14.         android:layout_width="match_parent"  
  15.         android:layout_height="match_parent"  
  16.         />  
  17. </RelativeLayout >  

webview_fragment.xml文件如下

[html]  view plain copy print ?
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     xmlns:sat="http://schemas.android.com/apk/res-auto"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     android:paddingBottom="@dimen/activity_vertical_margin"  
  10.     tools:context=".MainActivity">  
  11.     <ProgressBar  
  12.         style="?android:attr/progressBarStyleHorizontal"  
  13.         android:progressDrawable="@drawable/progressbar"  
  14.         android:id="@+id/myProgressBar"  
  15.         android:layout_width="match_parent"  
  16.         android:layout_height="9px"  
  17.         />  
  18.     <WebView  
  19.         android:id="@+id/webview_fragment"  
  20.         android:layout_below="@id/myProgressBar"  
  21.         android:layout_width="match_parent"  
  22.         android:layout_height="match_parent"  
  23.         />  
  24. </RelativeLayout>  

WebViewFragment.java文件如下

[html]  view plain copy print ?
  1. package com.example.chenyu.shaketofresh;  
  2.   
  3. import android.app.Fragment;  
  4. import android.app.Service;  
  5. import android.hardware.Sensor;  
  6. import android.hardware.SensorEvent;  
  7. import android.hardware.SensorEventListener;  
  8. import android.hardware.SensorManager;  
  9. import android.os.AsyncTask;  
  10. import android.os.Bundle;  
  11. import android.os.Vibrator;  
  12. import android.support.annotation.Nullable;  
  13. import android.view.LayoutInflater;  
  14. import android.view.View;  
  15. import android.view.ViewGroup;  
  16. import android.webkit.WebChromeClient;  
  17. import android.webkit.WebView;  
  18. import android.webkit.WebViewClient;  
  19. import android.widget.ProgressBar;  
  20.   
  21. import java.util.HashMap;  
  22. import java.util.Map;  
  23.   
  24. /**  
  25.  * Created by Think on 2015/11/7.  
  26.  */  
  27. public class WebViewFragment extends Fragment implements SensorEventListener {  
  28.     private WebView webView;  
  29.     private ProgressBar bar;  
  30.     public static String url = "http://blog.csdn.net/u011068702";  
  31.     private SensorManager mSensorManager; //定义sensor管理器  
  32.     private Vibrator vibrator;            //震动  
  33.   
  34.     @Override  
  35.     public void onResume() {  
  36.         super.onResume();  
  37.         //加速度传感器 注册监听  
  38.         mSensorManager.registerListener(this,  
  39.                 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
  40.                 //还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,  
  41.                 //根据不同应用,需要的反应速率不同,具体根据实际情况设定  
  42.                 SensorManager.SENSOR_DELAY_NORMAL);  
  43.     }  
  44.   
  45.     @Override  
  46.     public void onStop() {  
  47.         super.onStop();  
  48.         //取消注册  
  49.         mSensorManager.unregisterListener(this);  
  50.     }  
  51.     //可以得到传感器实时测量出来的变化值  
  52.     @Override  
  53.     public void onSensorChanged(SensorEvent event) {  
  54.         // TODO Auto-generated method stub  
  55.         int sensorType = event.sensor.getType();  
  56.         //values[0]:X轴,values[1]:Y轴,values[2]:Z轴  
  57.         float[] values = event.values;  
  58.         if (sensorType == Sensor.TYPE_ACCELEROMETER) {  
  59.               /*因为一般正常情况下,任意轴数值最大就在9.8~10之间,只有在你突然摇动手机  
  60.               *的时候,瞬时加速度才会突然增大或减少,所以,经过实际测试,只需监听任一轴的  
  61.               * 加速度大于14的时候,改变你需要的设置就OK了  
  62.               */  
  63.             if ((Math.abs(values[0]) > 14 || Math.abs(values[1]) > 14 || Math.abs(values[2]) > 14)) {  
  64.                 //摇动手机后,设置button上显示的字为空  
  65.                 new GetDataTask().execute();  
  66.             }  
  67.         }  
  68.     }  
  69.   
  70.     @Override  
  71.     public void onAccuracyChanged(Sensor sensor, int accuracy) {  
  72.         //当传感器精度改变时回调该方法,Do nothing.  
  73.     }  
  74.   
  75.     @Nullable  
  76.     @Override  
  77.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  78.         View view = inflater.inflate(R.layout.webview_fragment, container, false);  
  79.         webView = (WebView) view.findViewById(R.id.webview_fragment);  
  80.         bar = (ProgressBar) view.findViewById(R.id.myProgressBar);  
  81.         //加载水平彩色的progressbar  
  82.         webView.setWebChromeClient(new WebChromeClient() {  
  83.             @Override  
  84.             public void onProgressChanged(WebView view, int newProgress) {  
  85.                 if (newProgress == 100) {  
  86.                     bar.setVisibility(View.INVISIBLE);  
  87.                 } else {  
  88.                     if (View.INVISIBLE == bar.getVisibility()) {  
  89.                         bar.setVisibility(View.VISIBLE);  
  90.                     }  
  91.                     bar.setProgress(newProgress);  
  92.                 }  
  93.                 super.onProgressChanged(view, newProgress);  
  94.             }  
  95.   
  96.         });  
  97.         webView.loadUrl(url);  
  98.         //锁定客户端,不要点击跳到安卓内置浏览器里面去了  
  99.         webView.setWebViewClient(new WebViewClient() {  
  100.             @Override  
  101.             public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  102.                 webView.loadUrl(url);  
  103.                 return false;  
  104.             }  
  105.         });  
  106.         //获取传感器管理服务  
  107.         mSensorManager = (SensorManager) getActivity().getSystemService(Service.SENSOR_SERVICE);  
  108.         //震动  
  109.         vibrator = (Vibrator) getActivity().getSystemService(Service.VIBRATOR_SERVICE);  
  110.         return view;  
  111.     }  
  112.     private class GetDataTask extends AsyncTask<Void, Void, Void> {  
  113.         @Override  
  114.         protected Void doInBackground(Void... params) {  
  115.             Map<String, Object> map = new HashMap<String, Object>();  
  116.             return null;  
  117.         }  
  118.         @Override  
  119.         protected void onPostExecute(Void aVoid) {  
  120.             super.onPostExecute(aVoid);  
  121.             webView.getSettings().setBuiltInZoomControls(true);  
  122.             webView.getSettings().setSupportZoom(true);  
  123.             //加载需要显示的网页  
  124.             vibrator.vibrate(500);  
  125.             webView.reload();  
  126.         }  
  127.     }  
  128.   
  129. }  

第一次手机摇一摇震动刷新之后的效果图片如下(我设置的是的博客地址),并且在我的二维码那里生成了我博客的二维码,如果我的二维码那里填入合法的URL的话,再点击WebView摇一摇刷新的话就是刷新的我输入的URL的页面,并且生成输入URL的二维码。


第八步:实现手机摇出我的二维码


codeview_fragment.xml文件如下

[html]  view plain copy print ?
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     xmlns:sat="http://schemas.android.com/apk/res-auto"  
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  7.     android:paddingRight="@dimen/activity_horizontal_margin"  
  8.     android:paddingTop="@dimen/activity_vertical_margin"  
  9.     android:paddingBottom="@dimen/activity_vertical_margin"  
  10.     tools:context=".MainActivity">  
  11.    <EditText  
  12.        android:id="@+id/edit_url"  
  13.        android:layout_width="match_parent"  
  14.        android:layout_height="wrap_content"  
  15.        android:hint="输入想要摇一摇便生成二维码的合法url"  
  16.        />  
  17.     <ImageView  
  18.         android:id="@+id/image_code"  
  19.         android:layout_width="match_parent"  
  20.         android:layout_height="wrap_content"  
  21.         android:layout_below="@+id/edit_url"  
  22.         android:layout_marginTop="50dp"  
  23.         android:src="@drawable/code"/>  
  24. </RelativeLayout>  

code.png

CodeFragment.java文件如下
[html]  view plain copy print ?
  1. package com.example.chenyu.shaketofresh;  
  2.   
  3. import android.app.Fragment;  
  4. import android.app.Service;  
  5. import android.graphics.Bitmap;  
  6. import android.hardware.Sensor;  
  7. import android.hardware.SensorEvent;  
  8. import android.hardware.SensorEventListener;  
  9. import android.hardware.SensorManager;  
  10. import android.os.Bundle;  
  11. import android.os.Vibrator;  
  12. import android.support.annotation.Nullable;  
  13. import android.text.TextUtils;  
  14. import android.view.LayoutInflater;  
  15. import android.view.View;  
  16. import android.view.ViewGroup;  
  17. import android.widget.EditText;  
  18. import android.widget.ImageView;  
  19. import android.widget.Toast;  
  20.   
  21. import com.google.zxing.BarcodeFormat;  
  22. import com.google.zxing.EncodeHintType;  
  23. import com.google.zxing.WriterException;  
  24. import com.google.zxing.common.BitMatrix;  
  25. import com.google.zxing.qrcode.QRCodeWriter;  
  26.   
  27. import java.util.Hashtable;  
  28.   
  29. /**  
  30.  * Created by Think on 2015/11/8.  
  31.  */  
  32. public class CodeFragment extends Fragment implements SensorEventListener {  
  33.     private ImageView imageView;  
  34.     private EditText etUrl;  
  35.     public static String url;  
  36.     private SensorManager mSensorManager;//定义sensor管理器  
  37.     private Vibrator vibrator;           //震动  
  38.     private int QR_WIDTH = 500;          //二维码的宽  
  39.     private int QR_HEIGHT = 500;         //二维码的高  
  40.   
  41.     @Override  
  42.     public void onResume() {  
  43.         super.onResume();  
  44.         //加速度传感器 注册监听  
  45.         mSensorManager.registerListener(this,  
  46.                 mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
  47.                 //还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,  
  48.                 //根据不同应用,需要的反应速率不同,具体根据实际情况设定  
  49.                 SensorManager.SENSOR_DELAY_NORMAL);  
  50.     }  
  51.   
  52.     @Override  
  53.     public void onStop() {  
  54.         super.onStop();  
  55.         //取消注册  
  56.         mSensorManager.unregisterListener(this);  
  57.     }  
  58.     //可以得到传感器实时测量出来的变化值  
  59.     @Override  
  60.     public void onSensorChanged(SensorEvent event) {  
  61.         int sensorType = event.sensor.getType();  
  62.         //values[0]:X轴,values[1]:Y轴,values[2]:Z轴  
  63.         float[] values = event.values;  
  64.         if (sensorType == Sensor.TYPE_ACCELEROMETER) {  
  65.               /*因为一般正常情况下,任意轴数值最大就在9.8~10之间,只有在你突然摇动手机  
  66.               *的时候,瞬时加速度才会突然增大或减少,所以,经过实际测试,只需监听任一轴的  
  67.               * 加速度大于14的时候,改变你需要的设置就OK了  
  68.               */  
  69.             if ((Math.abs(values[0]) > 14 || Math.abs(values[1]) > 14 || Math.abs(values[2]) > 14)) {  
  70.                 //  生成二维码,至于验证合法的url我在这里就不写了,不是重点  
  71.                 url = etUrl.getText().toString();  
  72.                 if (!TextUtils.isEmpty(url)) {  
  73.                     WebViewFragment.url = url;  
  74.                     vibrator.vibrate(500);  
  75.                     createQRImage(url, imageView);  
  76.                 }  
  77.             }  
  78.         }  
  79.     }  
  80.   
  81.     @Override  
  82.     public void onAccuracyChanged(Sensor sensor, int accuracy) {  
  83.         //当传感器精度改变时回调该方法  
  84.     }  
  85.   
  86.     @Nullable  
  87.     @Override  
  88.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  89.         View view = inflater.inflate(R.layout.codeview_fragment, container, false);  
  90.         etUrl = (EditText) view.findViewById(R.id.edit_url);  
  91.         imageView = (ImageView) view.findViewById(R.id.image_code);  
  92.         createQRImage(WebViewFragment.url, imageView);  
  93.         //获取传感器管理服务  
  94.         mSensorManager = (SensorManager) getActivity().getSystemService(Service.SENSOR_SERVICE);  
  95.         //震动  
  96.         vibrator = (Vibrator) getActivity().getSystemService(Service.VIBRATOR_SERVICE);  
  97.         return view;  
  98.     }  
  99.   
  100.     //生成二维码  
  101.     public void createQRImage(String url, ImageView imageView) {  
  102.         try {  
  103.             //判断URL合法性  
  104.             if (url == null || "".equals(url) || url.length() < 1) {  
  105.                 Toast.makeText(getActivity(), "url不能为空", Toast.LENGTH_LONG);  
  106.                 return;  
  107.             }  
  108.             Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();  
  109.             hints.put(EncodeHintType.CHARACTER_SET, "utf-8");  
  110.             //图像数据转换,使用了矩阵转换  
  111.             BitMatrix bitMatrix = new QRCodeWriter().encode(url, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);  
  112.             int[] pixels = new int[QR_WIDTH * QR_HEIGHT];  
  113.             //下面这里按照二维码的算法,逐个生成二维码的图片,  
  114.             //两个for循环是图片横列扫描的结果  
  115.             for (int y = 0; y < QR_HEIGHT; y++) {  
  116.                 for (int x = 0; x < QR_WIDTH; x++) {  
  117.                     if (bitMatrix.get(x, y)) {  
  118.                         pixels[y * QR_WIDTH + x] = 0xff000000;  
  119.                     } else {  
  120.                         pixels[y * QR_WIDTH + x] = 0xffffffff;  
  121.                     }  
  122.                 }  
  123.             }  
  124.             //生成二维码图片的格式,使用ARGB_8888  
  125.             Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);  
  126.             bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);  
  127.             //显示到一个ImageView上面  
  128.             imageView.setImageBitmap(bitmap);  
  129.         } catch (WriterException e) {  
  130.             e.printStackTrace();  
  131.         }  
  132.     }  
  133. }  
我的二维码摇一摇之前的下面显示的二维码是我初始化的二维码(即我博客的二维码),然后我输入我的github的账号如下图

摇一摇震动刷新之后就变成我github账号的二维码了,如下图


最后去点击刷新WebView的时候会有如下图片




第九步:总结

  1、了解了重力传感器和震动相关知识

  2、复习了SlidingMenu 还有二维码相关的知识

  3、对Fragment有了更好的理解

  4、学会了多彩的水平ProgressBar

  5、把重力感应摇一摇和刷新结合在一起还是很好玩的,打破了常规的下拉刷新

  6、还有很多不足的地方,比如摇一摇刷新,只有手感,没有页面上的动画,以后会加进去,

        如果有感兴趣的小伙伴,一起参与吧,热烈欢迎。


如果你想看更好的效果,这个项目放在github的地址是  https://github.com/changechenyu/ShakeToFresh

如果你觉得很好玩或者有创意,就给我star呗  吐舌头


对了项目我已经打包了,觉得很好玩的小伙伴敢去下载吧,手机摇一摇震动刷新源代码,来吧,猛戳我。






   





















这篇关于手机摇一摇震动刷新(支持ListView GridView WebView)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1044025

相关文章

cell phone teardown 手机拆卸

tweezer 镊子 screwdriver 螺丝刀 opening tool 开口工具 repair 修理 battery 电池 rear panel 后盖 front and rear cameras 前后摄像头 volume button board 音量键线路板 headphone jack 耳机孔 a cracked screen 破裂屏 otherwise non-functiona

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

Science Robotics 首尔国立大学研究团队推出BBEX外骨骼,实现多维力量支持!

重复性举起物体可能会对脊柱和背部肌肉造成损伤,由此引发的腰椎损伤是工业环境等工作场所中一个普遍且令人关注的问题。为了减轻这类伤害,有研究人员已经研发出在举起任务中为工人提供辅助的背部支撑装置。然而,现有的这类装置通常无法在非对称性的举重过程中提供多维度的力量支持。此外,针对整个人体脊柱的设备安全性验证也一直是一个缺失的环节。 据探索前沿科技边界,传递前沿科技成果的X-robot投稿,来自首尔国立

想要从OPPO手机恢复数据?免费OPPO照片视频恢复软件

此实用程序可帮助那些寻找以下内容的用户: 在OPPO手机中格式化存储卡后可以恢复图片吗?我删除了 OPPO上的视频和图片,我感觉很糟糕,因为里面有我在拉斯维加斯拍摄的视频和照片 免费OPPO照片视频恢复软件 您能恢复OPPO上已删除的照片吗?我不小心格式化了OPPO SD 卡,有希望恢复已删除的照片吗? 救命!我在清理时删除了我的照片,我的问题是是否有任何免费软件可以从OPPO中恢复已

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

QtC++截图支持窗口获取

介绍 在截图工具中你会发现,接触到窗口后会自动圈出目标窗口,个别强大一点的还能进行元素识别可以自动圈出元素,那么今天简单分析一下QTc++如何获取窗口并圈出当前鼠标下的窗口。 介绍1.如何获取所有窗口2.比较函数3.实现窗口判断 结尾 1.如何获取所有窗口 1.我们需要调用windows接口EnumWindowsProc回调函数来获取所有顶级窗口,需要包含windows.

Nacos Config 配置中心支持配置共享

文章目录 一、什么是配置中心二、Nacos Config2.1 Nacos Config 工作原理 (★)2.2 Nacos Config 的使用2.3 动态刷新2.4 配置共享2.4.1 同一个微服务的不同环境之间共享配置2.4.2 不同微服务中间共享配置 一、什么是配置中心 微服务架构下关于配置文件的存在以下问题: 配置文件相对分散。在一个微服务架构下,配置文件会随

spring笔记 多线程的支持

spring的工作机制 136  属性编辑器 140 spring事件的体系结构 168 Bean间的关系 109 继承 依赖 引用     Bean的继承          1 为了简化初始化的属性注入;          2 子Bean和父Bean相同的属性值,使用子Bean的     Bean的依赖 Srping控制相互依赖的Bean之间,属性注入的顺序,防止出错  depend-on