手机摇一摇震动刷新(支持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呗  吐舌头


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






   





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值