当前位置:操作系统 > 安卓/Android >>

anroid 利用方向传感器或者加速度传感器实现手机或者平板6个方向操作

最近项目里面要实现android设备6个方向操作远程设备移动,首先想到的是方向传感器,但是由于android设备的多样性,在测试过程中并不是所有的设备都有方向传感器,当没有方向传感器的话,就使用加速度传感器来实现,但是有一个缺点就是当水平移动的时候,就会有错误,其次就是项目中程序规定是横屏,然后手机和平板第一方向是不同的,手机默认竖屏正方向为0,现在横屏则方向为1,而平板默认就是横屏的,所以横屏正方向为0。

对于源码里面的


[java]
private float accDefaultX = 9999; 
private float accDefaultY = 9999; 
private float fBaseDefault = 9999; 

 private float accDefaultX = 9999;
 private float accDefaultY = 9999;
 private float fBaseDefault = 9999;是用来确定初始方向的,程序是按照开启传感器的方向为水平方向,如果需要使用现实中的水平方向为设备的水平方向,则可以去掉


[java]
if (accDefaultX == fBaseDefault) { 
                accDefaultX = fValues[0]; 
            } 
            if (accDefaultY == fBaseDefault) { 
                accDefaultY = fValues[1]; 
            } 
            mx = fValues[0] - accDefaultX; 
            my = fValues[1] - accDefaultY; 

if (accDefaultX == fBaseDefault) {
    accDefaultX = fValues[0];
   }
   if (accDefaultY == fBaseDefault) {
    accDefaultY = fValues[1];
   }
   mx = fValues[0] - accDefaultX;
   my = fValues[1] - accDefaultY;

 

源码如下:


[java]
package com.zhangjie.sensor; 
 
import android.app.Activity; 
import android.content.Context; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Display; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.WindowManager; 
import android.widget.Button; 
 
public class OriginSensor extends Activity implements SensorEventListener{ 
 
    public static final String TAG = "OriginSensor"; 
    private SensorManager mSensorManager; 
    private Sensor aSensor; 
    private WindowManager mWindowManager; 
    private Display mDisplay; 
    private int orientation = 0; 
    private float accDefaultX = 9999; 
    private float accDefaultY = 9999; 
    private float fBaseDefault = 9999; 
    private double angle = 25; 
    private float[] fValues = null; 
    public static int Sensor_Type = -1; 
    float mx, my; 
    Button clickButton; 
    boolean iscleck = false; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 
        mDisplay = mWindowManager.getDefaultDisplay(); 
        orientation = mDisplay.getOrientation(); 
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
        clickButton = new Button(this); 
        clickButton.setOnClickListener(new OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                if (!iscleck) { 
                    EnableSensor(); 
                    iscleck = true; 
                }else { 
                    DisableSensor(); 
                    iscleck = false; 
                } 
            } 
        }); 
        setContentView(clickButton); 
    } 
 
    public void EnableSensor(){ 
        if (Sensor_Type == -1) { 
            SelectSensorType(); 
            if (Sensor_Type == 2) { 
                //屏蔽功能  
            } 
        }else { 
            aSensor = mSensorManager.getDefaultSensor(Sensor_Type); 
            mSensorManager.registerListener(this, aSensor,SensorManager.SENSOR_DELAY_UI); 
        } 
        accDefaultX = fBaseDefault; //这样做的原因为每次重启,将重启的位置作为水平位置  
        accDefaultY = fBaseDefault; 
    } 
     
    public void DisableSensor(){ 
        mSensorManager.unregisterListener(this); 
        current_dir = 0; 
    } 
    /*
     * 优先选择方向传感器,如果没有方向传感器则选择加速度传感器,如果没有加速度传感器则屏蔽重力感应功能
     * Sensor_Type = 3 :方向传感器
     * Sensor_Type = 1 :加速度传感器
     * Sensor_Type = 2:屏蔽重力感应功能
     */ 
    public void SelectSensorType(){ 
  

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,