Android学习笔记:摇一摇功能的实现

首先需要用到一个摇一摇的工具类

ShakeManager.java
 1 package com.wuxianedu.oschina.utils;
 2
 3 import android.content.Context;
 4 import android.hardware.Sensor;
 5 import android.hardware.SensorEvent;
 6 import android.hardware.SensorEventListener;
 7 import android.hardware.SensorManager;
 8
 9 /**
10  * 震动监听器
11  */
12 public class ShakeManager implements SensorEventListener {
13
14     private Context mContext;
15     private static final int SPEED_SHRESHOLD = 4500;//这个值越大需要越大的力气来摇晃手机
16     private static final int UPTATE_INTERVAL_TIME = 50;
17     private SensorManager sensorManager;
18     private Sensor sensor;
19     private ShakeListener shakeListener;
20     private float lastX;
21     private float lastY;
22     private float lastZ;
23     private long lastUpdateTime;
24
25     public ShakeManager(Context c) {
26         mContext = c;
27         start();
28     }
29
30     /**
31      * 启动
32      */
33     public void start() {
34         sensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
35         if (sensorManager != null) {
36             sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
37         }
38         if (sensor != null) {
39             sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);
40         }
41     }
42
43     /**
44      * 停止
45      */
46     public void stop() {
47         sensorManager.unregisterListener(this);
48     }
49
50     public void onSensorChanged(SensorEvent event) {
51         long currentUpdateTime = System.currentTimeMillis();
52         long timeInterval = currentUpdateTime - lastUpdateTime;
53         if (timeInterval < UPTATE_INTERVAL_TIME)
54             return;
55         lastUpdateTime = currentUpdateTime;
56
57         float x = event.values[0];
58         float y = event.values[1];
59         float z = event.values[2];
60
61         float deltaX = x - lastX;
62         float deltaY = y - lastY;
63         float deltaZ = z - lastZ;
64
65         lastX = x;
66         lastY = y;
67         lastZ = z;
68
69         double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ
70                 * deltaZ)
71                 / timeInterval * 10000;
72         if (speed >= SPEED_SHRESHOLD) {
73             shakeListener.onShake();
74         }
75     }
76
77     public void onAccuracyChanged(Sensor sensor, int accuracy) {}
78
79     public void setShakeListener(ShakeListener shakeListener) {
80         this.shakeListener = shakeListener;
81     }
82
83     public interface ShakeListener {
84         void onShake();
85     }
86
87 }

接下来我们在MainActivity.java中来使用

 1     private ShakeManager shake;
 2
 3         shake.setShakeListener(new ShakeManager.ShakeListener() {
 4             @Override
 5             public void onShake() {
 6                 QiStart();
 7                 shake.stop();
 8                 canrads.setVisibility(View.GONE);
 9                 soundPool.play(map.get(1),0.3f,0.3f,1,0,0);
10             }
11         });
12
13
14
15     /**
16      * 开始动画
17      */
18     private void QiStart() {
19         TranslateAnimation up = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f
20                 ,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,-0.3f);
21         up.setDuration(600L);
22         up.setRepeatCount(1);
23         up.setRepeatMode(Animation.REVERSE);
24         imageshang.startAnimation(up);
25
26         TranslateAnimation down = new TranslateAnimation(Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0f
27                 ,Animation.RELATIVE_TO_SELF,0f,Animation.RELATIVE_TO_SELF,0.3f);
28         down.setDuration(600L);
29         down.setRepeatCount(1);
30         down.setRepeatMode(Animation.REVERSE);
31         imagexia.startAnimation(down);
32
33         down.setAnimationListener(new Animation.AnimationListener() {
34             @Override
35             public void onAnimationStart(Animation animation) {
36
37             }
38             @Override
39             public void onAnimationEnd(Animation animation) {
40                 xian2.setVisibility(View.VISIBLE);
41                 new RequestClient(getContext(),requestConfig){
42
43                     @Override
44                     protected void loadSuccess(String result) {
45                         try {
46                             result = new String(result.getBytes("ISO-8859-1"),"UTF-8");
47                         } catch (UnsupportedEncodingException e) {
48                             e.printStackTrace();
49                         }
50                         shakeb = JSONParseUtil.parseObject(result,Shakeb.class);
51                         assert shakeb != null;
52                         String title = shakeb.getOwner()!=null ? shakeb.getOwner().getName():"";
53                         tv_neirong.setText(title);
54                         tv_biaoti.setText(shakeb.getDescription());
55                         tv_chakan.setText(String.valueOf(shakeb.getForks_count()));
56                         tv_xingxing.setText(String.valueOf(shakeb.getStars_count()));
57                         tv_disange.setText(String.valueOf(shakeb.getWatches_count()));
58                         //获取图片地址
59                         String imageUrl = shakeb.getOwner().getNew_portrait();
60                         ImageLoader imageLoader = ImageLoaderFactory.getImageLoader();
61                         //加载图片
62                         imageLoader.loadImage(imageUrl,roundImageView);
63                         //隐藏正在加载
64                         xian2.setVisibility(View.GONE);
65                         //播放声音
66                         soundPool.play(map.get(0),0.3f,0.3f,1,0,0);
67                         //显示推举项目
68                         canrads.setVisibility(View.VISIBLE);
69                         //摇一摇监听开始
70                         shake.start();
71                     }
72
73                     @Override
74                     protected void loadFail() {
75
76                     }
77                 }.get(RequestAPI.SHAKE);
78             }
79
80             @Override
81             public void onAnimationRepeat(Animation animation) {
82
83             }
84         });
85
86     }
 /**
     * 判断Fragment是否可见
     * @param hidden
     */
    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if(hidden){
            shake.stop();
        }else{
            shake.start();
        }
    }

true为不可见
时间: 2024-08-01 22:43:52

Android学习笔记:摇一摇功能的实现的相关文章

Android学习笔记_78_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

Android学习笔记(四一):SQLite的使用

SQLite是非常流行的嵌入式关系型数据库,轻载,速度快,而且是开源.在Android中,runtime提供SQLite,所以我们可以使用SQLite,而且是全集的SQLite.SQLite提供SQL接口,和一般的数据库一样.但是Android的API不采用JDBC,JDBC消耗太多的资源. SQLite支持绝大部分SQL-92标准,不支持:FOREIGN KEY constraints, nested transactions, RIGHT OUTER JOIN, FULL OUTER JOI

Android学习笔记(1)——电话拨号器

搬运自本人博客:Android学习笔记(1)--电话拨号器 程序的实现过程非常简单,大体分为以下几步: 确定程序的功能,大致确定好UI界面. 通过调整xml文件参数让界面更加美观. 在Activity文件编写代码,完成对应的事件等. 对于电话拨号器,我们最后的界面大致如下: 对应的布局文件如下,采用的是相对布局. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <Relative

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出

在<Effective Java 2nd Edition>中,第6条"消除过期的对象引用"提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象池.缓存中的过期对象都有可能引发内存泄露的问题.书中还提到可以用 WeakHashMap来作为缓存的容器可以有效解决这一问题.之前也确实遇到过类似问题,但是没有接触过"弱引用"相关的问题,于是查阅了一些资料. <Java 理论与实践: 用弱引用堵住内存泄漏>

Android学习笔记(十八)——使用意图筛选器和实现浏览网页(附源码)

使用意图筛选器 点击下载源码 1.创建一个Intents项目,给该项目添加一个新类,命名为MyBrowserActivity,在res/layout文件夹下新增一个browser.xml: 2.在AndroidManifest.xml文件中添加如下代码: 添加权限: <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="a

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

android学习笔记——使用QuickContactBadge关联联系人

本文大部分内容来自<疯狂android讲义>. QuickContactBadge继承了ImageView,因此它的本质也是图片,也可以通过android:src属性指定它显示的图片.QuickcontactBadge额外增加的功能是:该图片可以关联到手机中指定联系人,当用户单击该图片时,系统将会打开相应联系人的联系方式界面. 为了让QuickContactBadge与特定联系人关联,可以调用如下方法进行关联. assignContactFromEmail(String emailAddres

udacity android学习笔记: lesson 3

udacity android学习笔记: lesson 3 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 联系:1307316一九六八 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. tips:https://code.csdn.net/titer1/pat_aha/blob/master/Markdown/an

android学习笔记——计时器实现

根据android疯狂讲义来写写代码,在博客里面将这些写过的代码汇总一下.实现的功能很简单:就是一个简单的计时器,点击启动按钮会开始计时,当计时到20秒时会自动停止计时. 界面如下: 界面代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="