摇一摇Listener

1、摇一摇Listener

 

package com.tangzq;

 

import android.content.Context;

import android.hardware.Sensor;

import android.hardware.SensorEvent;

import android.hardware.SensorEventListener;

import android.hardware.SensorManager;

import android.util.Log;

 

/**

 * 一个检测手机摇晃的监听器

 */

public class ShakeListener implements SensorEventListener {

String TAG="ShakeListener";

// 速度阈值,当摇晃速度达到这值后产生作用

private static final int SPEED_SHRESHOLD = 3000;

// 两次检测的时间间隔

private static final int UPTATE_INTERVAL_TIME = 70;

// 传感器管理器

private SensorManager sensorManager;

// 传感器

private Sensor sensor;

// 重力感应监听器

private OnShakeListener onShakeListener;

// 上下文

private Context mContext;

// 手机上一个位置时重力感应坐标

private float lastX;

private float lastY;

private float lastZ;

// 上次检测时间

private long lastUpdateTime;

 

// 构造器

public ShakeListener(Context c) {

// 获得监听对象

mContext = c;

start();

}

 

// 开始

public void start() {

// 获得传感器管理器

sensorManager = (SensorManager) mContext

.getSystemService(Context.SENSOR_SERVICE);

if (sensorManager != null) {

// 获得重力传感器

sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

}

// 注册

if (sensor != null) {

sensorManager.registerListener(this, sensor,

SensorManager.SENSOR_DELAY_GAME);

}

 

}

 

// 停止检测

public void stop() {

sensorManager.unregisterListener(this);

}

 

// 设置重力感应监听器

public void setOnShakeListener(OnShakeListener listener) {

onShakeListener = listener;

}

 

// 重力感应器感应获得变化数据

public void onSensorChanged(SensorEvent event) {

// 现在检测时间

long currentUpdateTime = System.currentTimeMillis();

// 两次检测的时间间隔

long timeInterval = currentUpdateTime - lastUpdateTime;

// 判断是否达到了检测时间间隔

if (timeInterval < UPTATE_INTERVAL_TIME)

return;

// 现在的时间变成last时间

lastUpdateTime = currentUpdateTime;

 

// 获得x,y,z坐标

float x = event.values[0];

float y = event.values[1];

float z = event.values[2];

 

// 获得x,y,z的变化值

float deltaX = x - lastX;

float deltaY = y - lastY;

float deltaZ = z - lastZ;

 

// 将现在的坐标变成last坐标

lastX = x;

lastY = y;

lastZ = z;

 

double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ

* deltaZ)

/ timeInterval * 10000;

Log.v(TAG, "===========log===================");

// 达到速度阀值,发出提示

if (speed >= SPEED_SHRESHOLD) {

onShakeListener.onShake();

}

}

 

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

 

// 摇晃监听接口

public interface OnShakeListener {

public void onShake();

}

}

2、摇一摇主界面Activity

 

package com.tangzq;

 

import android.app.Activity;

import android.content.Intent;

import android.location.Criteria;

import android.location.Location;

import android.location.LocationListener;

import android.location.LocationManager;

import android.os.Bundle;

import android.util.Log;

import android.view.Window;

import android.widget.ListView;

import android.widget.Toast;

 

import com.tangzq.ShakeListener.OnShakeListener;

 

public class YaoYiYaoActivity extends Activity {

ListView mListview;

ShakeListener mShakeListener = null;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);// 不显示程序的标题栏

setContentView(R.layout.shack);

initRes();

findViews();

setListeners();

}

 

private void initRes() {

}

 

private void findViews() {

mShakeListener = new ShakeListener(this);

}

 

 

 

private void setListeners() {

 

mShakeListener.setOnShakeListener(new OnShakeListener() {

public void onShake() {

try {

Location location = getLocation();

Bundle b = new Bundle();

b.putDouble("latitude", location.getLatitude());

b.putDouble("longitude", location.getLongitude());

Intent intent = new Intent(YaoYiYaoActivity.this,AfterShakedActivity.class).putExtras(b);

startActivity(intent);

YaoYiYaoActivity.this.finish();

} catch (Exception e) {

Toast.makeText(YaoYiYaoActivity.this, e.getMessage(),

Toast.LENGTH_SHORT).show();

}

}

});

}

 

///**

// * 获得adapter数据

// * 

// * @return

// */

//private ArrayList<HashMap<String, Object>> getAdapteValues() {

//// 获取默认商家促销信息

//ArrayList<PromotionMessage> list = new ArrayList<PromotionMessage>();

//if (list != null && list.size() != 0) {

//ArrayList<HashMap<String, Object>> values = new ArrayList<HashMap<String, Object>>();

//for (int i = 0; i < list.size(); i++) {

//HashMap<String, Object> item = new HashMap<String, Object>();

//PromotionMessage m = list.get(i);

//item.put("item_paymessage", m.getTitle());

//values.add(item);

//}

//return values;

//}

//return null;

//}

 

/**

* 获取经度维度

*/

public Location getLocation() {

// 获取到LocationManager对象

LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

// 创建一个Criteria对象

Criteria criteria = new Criteria();

// 设置粗略精确度

criteria.setAccuracy(Criteria.ACCURACY_COARSE);

// 设置是否需要返回海拔信息

criteria.setAltitudeRequired(false);

// 设置是否需要返回方位信息

criteria.setBearingRequired(false);

// 设置是否允许付费服务

criteria.setCostAllowed(true);

// 设置电量消耗等级

criteria.setPowerRequirement(Criteria.POWER_HIGH);

// 设置是否需要返回速度信息

criteria.setSpeedRequired(false);

// 根据设置的Criteria对象,获取最符合此标准的provider对象

String currentProvider = locationManager

.getBestProvider(criteria, true);

Log.e("Location", "currentProvider: " + currentProvider);

if (currentProvider == null) {

currentProvider = LocationManager.NETWORK_PROVIDER;

}

Location currentLocation = locationManager

.getLastKnownLocation(currentProvider);

if (currentLocation == null) {

locationManager.requestLocationUpdates(currentProvider, 0, 0,

locationListener);

}

// 直到获得最后一次位置信息为止,如果未获得最后一次位置信息,则显示默认经纬度

// 每隔3秒获取一次位置信息

while (true) {

currentLocation = locationManager

.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

if (currentLocation != null) {

Log.e("Location", "Latitude: " + currentLocation.getLatitude());

Log.e("Location",

"Longitude: " + currentLocation.getLongitude());

return currentLocation;

}

try {

Thread.sleep(3);

} catch (InterruptedException e) {

Log.e("Location", e.getMessage());

}

}

}

 

/**

* 创建位置监听器

*/

private LocationListener locationListener = new LocationListener() {

@Override

public void onLocationChanged(Location location) {

Log.e("Location", "onLocationChanged");

Log.e("Location",

"onLocationChanged Latitude" + location.getLatitude());

Log.e("Location",

"onLocationChanged location" + location.getLongitude());

}

 

@Override

public void onProviderDisabled(String provider) {

Log.e("Location", "onProviderDisabled");

}

 

@Override

public void onProviderEnabled(String provider) {

Log.e("Location", "onProviderEnabled");

}

 

@Override

public void onStatusChanged(String provider, int status, Bundle extras) {

Log.e("Location", "onStatusChanged");

}

};

 

@Override

protected void onDestroy() {

super.onDestroy();

if (mShakeListener != null) {

mShakeListener.stop();

}

}

}

3、摇一摇主界面shake.xml

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

 

    <TextView

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:layout_gravity="center_vertical"

        android:gravity="center_vertical|center_horizontal"

        android:text="摇一摇"

        android:textColor="#3A7EBD"

        android:textSize="36dp" />

 

    <ImageView

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:src="@drawable/shake" />

</LinearLayout>

 

4、摇一摇跳转Activity

package com.tangzq;

 

import android.app.Activity;

import android.graphics.Color;

import android.os.Bundle;

import android.view.Gravity;

import android.widget.TextView;

 

public class AfterShakedActivity extends Activity{

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

TextView tv=new TextView(this);

tv.setText("哈哈,你摇成功了,xiangxi信息");

tv.setBackgroundDrawable(getResources().getDrawable(R.drawable.smile));

tv.setTextSize(32);

tv.setTextColor(Color.MAGENTA);

//tv.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL);

tv.setGravity(Gravity.CENTER_HORIZONTAL);

//tv.setGravity();

setContentView(tv);

}

}


参照:

http://blog.csdn.net/fuzhengchao/article/details/6736908

http://www.cnblogs.com/wisekingokok/archive/2011/09/05/2167755.html

posted @ 2013-06-12 22:02  火腿骑士  阅读(163)  评论(0编辑  收藏  举报