Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android高分段進階攻略(1)傳感器

android高分段進階攻略(1)傳感器

編輯:關於Android編程

題記:許多小伙伴都叫我寫個android的教程,我覺得網上已經有很多很棒的教程了,特別是老羅和Mars的視頻都非常棒,我只是個小菜鳥,何德何能做個教程了,很多時候我已經和大家說不要私信給我,但是還是有很多人私信於我,在此我覺得許多問題不是我一個人能解決的,大家可以在論壇發貼,讓大家一起解決。不過既然大家那麼信任我,我就寫些項目經歷和大家分享,簡單的基礎我就不說了,直接從項目開始吧,文章可能時斷時續的上傳,因為我也遇到了許多問題,待大神看了以後指導,關於相關demo,由於涉及到版權問題和來自貧困山區的我,有些比較好的demo可能需要付費才能下載,知識產權嘛,順便捐贈下貧困山區的我,文章可能不是很專業,因為我也是邊研究邊和大家分享的,順便讓我能更好的學習android,好的,多的不說了,android高分段進階攻略從現在開始。

我們是什麼時候開始知道有傳感器這兒玩意的,其實是iphone第一代,隨著越來越多的應用開始和硬件掛接,提高用戶體驗性,傳感器開始由不靠譜變得大勢所趨,傳感器有些什麼了,方向,重力,加速度,光線,磁場,臨近性,溫度等。而android中所有傳感器都要依賴於android.hardware.SensorEventListener接口,那麼我們現在來看看sdk裡面是怎麼寫的:

public interface SensorEventListener   
  
{  
  
    public void onSensorChanged(SensorEvent event);  
  
    public void onAccuracyChanged(Sensor sensor, int accuracy);      
  
}  

這個接口其實簡單,只有兩個方法,從字面上看我們也能知道,當傳感器發生變化的時候,會調用onSensorChanged這個方法,所以重點在於理解這個方法,然後我就來看看它傳入的參數SensorEvent event,繼續查看關於SensorEvent 的sdk,不難發現SensorEvent 有4個屬性:

public int accuracy、public Sensor、public long timestamp、public final float[ ] values

而全文大部分篇幅都是用來描述values這個屬性,因為values是用來描述傳感器的值,關於這個values我以前在網上找到了相關資料,雖然我已經不記得那位大神的ID了,但是還是謝謝他能分享這些。

在方向傳感器中values變量的3個值都表示度數,它們的含義如下:

values[0]:該值表示方位,也就是手機繞著Z軸旋轉的角度。0表示北(North);90表示東(East);180表示南(South);270表示西(West)。如果values[0]的值正好是這4個值,並且手機是水平放置,表示手機的正前方就是這4個方向。可以利用這個特性來實現電子羅盤。
values[1]:該值表示傾斜度,或手機翹起的程度。當手機繞著X軸傾斜時該值發生變化。values[1]的取值范圍是-180≤values[1] ≤180。假設將手機屏幕朝上水平放在桌子上,這時如果桌子是完全水平的,values[1]的值應該是0(由於很少有桌子是絕對水平的,因此,該值很可能不為0,但一般都是-5和5之間的某個值)。這時從手機頂部開始抬起,直到將手機沿X軸旋轉180度(屏幕向下水平放在桌面上)。在這個旋轉過程中,values[1]會在0到-180之間變化,也就是說,從手機頂部抬起時,values[1]的值會逐漸變小,直到等於-180。如果從手機底部開始抬起,直到將手機沿X軸旋轉180度,這時values[1]會在0到180之間變化。也就是values[1]的值會逐漸增大,直到等於180。可以利用values[1]和下面要介紹的values[2]來測量桌子等物體的傾斜度。
values[2]:表示手機沿著Y軸的滾動角度。取值范圍是-90≤values[2]≤90。假設將手機屏幕朝上水平放在桌面上,這時如果桌面是平的,values[2]的值應為0。將手機左側逐漸抬起時,values[2]的值逐漸變小,直到手機垂直於桌面放置,這時values[2]的值是-90。將手機右側逐漸抬起時,values[2]的值逐漸增大,直到手機垂直於桌面放置,這時values[2]的值是90。在垂直位置時繼續向右或向左滾動,values[2]的值會繼續在-90至90之間變化。


在加速傳感器中,values變量的3個元素值分別表示X、Y、Z軸的加速值。例如,水平放在桌面上的手機從左側向右側移動,values[0]為負值;從右向左移動,values[0]為正值。


在重力傳感器中,重力傳感器與加速度傳感器使用同一套坐標系。values數組中三個元素分別表示了X、Y、Z軸的重力大小。


在光線傳感器中,alues數組只有第一個元素(values[0])有意義。表示光線的強度。最大的值是120000.0f。


在陀螺儀傳感器中,陀螺儀傳感器的類型常量是Sensor.TYPE_GYROSCOPE。values數組的三個元素表示的含義如下:values[0]:延X軸旋轉的角速度。 values[1]:延Y軸旋轉的角速度。 values[2]:延Z軸旋轉的角速度。 當手機逆時針旋轉時,角速度為正值,順時針旋轉時,角速度為負值。


介紹完基本的傳感器類型後,我們開始嘗試編寫的我們的第一個傳感器。具體思路如下:

1、實例化傳感器借口

2、獲得傳感器管理接口

3、注冊傳感器


public class MainActivity extends Activity implements SensorEventListener  
{  
    private TextView tvAccelerometer;  
    private TextView tvMagentic;  
    private TextView tvLight;  
    private TextView tvOrientation;  
    private TextView tvSensors;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        //  獲得SensorManager對象  
        SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);  
  
        //  注冊加速度傳感器  
        sensorManager.registerListener(this,  
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),  
                SensorManager.SENSOR_DELAY_FASTEST);  
  
        //  注冊磁場傳感器  
        sensorManager.registerListener(this,  
                sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),  
                SensorManager.SENSOR_DELAY_FASTEST);  
  
        //  注冊光線傳感器  
        sensorManager.registerListener(this,  
                sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),  
                SensorManager.SENSOR_DELAY_FASTEST);  
  
        //  注冊方向傳感器  
        sensorManager.registerListener(this,  
                sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),  
                SensorManager.SENSOR_DELAY_FASTEST);  
  
        tvAccelerometer = (TextView) findViewById(R.id.tvAccelerometer);  
        tvMagentic = (TextView) findViewById(R.id.tvMagentic);  
        tvLight = (TextView) findViewById(R.id.tvLight);  
        tvOrientation = (TextView) findViewById(R.id.tvOrientation);  
        tvSensors = (TextView)findViewById(R.id.tvSensors);  
          
        //  獲得當前手機支持的所有傳感器  
        List sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);  
        for(Sensor sensor:sensors)  
        {  
            //  輸出當前傳感器的名稱  
            tvSensors.append(sensor.getName() + "\n");  
        }  
    }  
    @Override  
    public void onSensorChanged(SensorEvent event)  
    {  
        //  通過getType方法獲得當前傳回數據的傳感器類型  
        switch (event.sensor.getType())  
        {  
            case Sensor.TYPE_ACCELEROMETER:            //  處理加速度傳感器傳回的數據  
                String accelerometer = "加速度\n" + "X:" + event.values[0] + "\n"  
                        + "Y:" + event.values[1] + "\n" + "Z:" + event.values[2] + "\n";  
                tvAccelerometer.setText(accelerometer);  
                break;  
            case Sensor.TYPE_LIGHT:                    //  處理光線傳感器傳回的數據  
                tvLight.setText("亮度:" + event.values[0]);  
                break;  
            case Sensor.TYPE_MAGNETIC_FIELD:            //  處理磁場傳感器傳回的數據  
                String magentic = "磁場\n" + "X:" + event.values[0] + "\n" + "Y:"  
                        + event.values[1] + "\n" + "Z:" + event.values[2] + "\n";  
                tvMagentic.setText(magentic);  
                break;  
            case Sensor.TYPE_ORIENTATION:                //  處理方向傳感器傳回的數據  
                String orientation = "方向\n" + "X:" + event.values[0] + "\n"  
                        + "Y:" + event.values[1] + "\n" + "Z:" + event.values[2] + "\n";  
                tvOrientation.setText(orientation);  
                break;  
        }  
    }  
    @Override  
    public void onAccuracyChanged(Sensor sensor, int accuracy)  
    {  
    }  
}  

由於這個例子過於簡單,代碼也是網上找的教學代碼,所以demo我就不寫了,今天就先給大家介紹下傳感器的原理,下次我們就開始進階使用傳感器,介紹個我以前做的計步器app,希望大家能喜歡,敬請下回分解。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved