天天看點

從指南針到動手搭建自己的第一台計算機

大約在1948年,美國數學家John Wilder Tukey(生于1915年)提前認識到二進制數将在未來幾年中随着計算機的流行而發揮更大的作用。他決定創造一個新的、更短的詞來代替使用起來很不靈活的五音節詞—binary digit。他曾經考慮用bigit或binit,但最後還是選用了短小、簡單、精巧且非常可愛的單詞bit(比特)來代替binary digit這個詞。

——《編碼:隐匿在計算機軟硬體背後的語言》

這周三我終于把郭霖大神的鴻篇巨制、Android開發的入門書籍《第一行代碼》看完了,如果從我教育訓練結束就開始看這本書算起的話,也有将近四個月的時間了,這其中的曲折我也不想再說。從周四開始我看了這本Charles Petzold寫的《編碼:隐匿在計算機軟硬體背後的語言》。整本書的感想等我全部讀完了之後再寫,不過就目前我已經看過的100頁來說,作者從如何在晚上用手電筒與小夥伴交流寫到了電報器的原理,然後我就在第8章的結尾看到了比特一詞的來源,還是很激動的,幹脆放在了這篇文章的開頭。

《第一行代碼》中呢,有一章是專門講解手機中内置的傳感器的,其中有一個練習,隻用不到100行的代碼外加兩張圖檔,就能制作一個簡易的指南針,還是很有意思的。

圖檔素材如下:

從指南針到動手搭建自己的第一台計算機

效果如下

從指南針到動手搭建自己的第一台計算機

代碼如下

public class MainActivity extends Activity {

    private SensorManager sensorManager;

    private ImageView compassImg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        compassImg = (ImageView) findViewById(R.id.compass_img);
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        Sensor magneticSensor = sensorManager
                .getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        Sensor accelerometerSensor = sensorManager
                .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(listener, magneticSensor,
                SensorManager.SENSOR_DELAY_GAME);
        sensorManager.registerListener(listener, accelerometerSensor,
                SensorManager.SENSOR_DELAY_GAME);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (sensorManager != null) {
            sensorManager.unregisterListener(listener);
        }
    }

    private SensorEventListener listener = new SensorEventListener() {

        float[] accelerometerValues = new float[];

        float[] magneticValues = new float[];

        private float lastRotateDegree;

        @Override
        public void onSensorChanged(SensorEvent event) {
            // 判斷目前是加速度傳感器還是地磁傳感器
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                // 注意指派時要調用clone()方法
                accelerometerValues = event.values.clone();
            } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
                // 注意指派時要調用clone()方法
                magneticValues = event.values.clone();
            }
            float[] values = new float[];
            float[] R = new float[];
            SensorManager.getRotationMatrix(R, null, accelerometerValues,
                    magneticValues);
            SensorManager.getOrientation(R, values);
            float rotateDegree = -(float) Math.toDegrees(values[]);
            if (Math.abs(rotateDegree - lastRotateDegree) > ) {
                RotateAnimation animation = new RotateAnimation(
                        lastRotateDegree, rotateDegree,
                        Animation.RELATIVE_TO_SELF, f,
                        Animation.RELATIVE_TO_SELF, f);
                animation.setFillAfter(true);
                compassImg.startAnimation(animation);
                lastRotateDegree = rotateDegree;
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }

    };

}
           

布局如下

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/compass_img"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:layout_centerInParent="true"
        android:src="@drawable/compass" />

    <ImageView
        android:id="@+id/arrow_img"
        android:layout_width="60dp"
        android:layout_height="110dp"
        android:layout_centerInParent="true"
        android:src="@drawable/arrow" />

</RelativeLayout>
           

ps:最後說一點自己的感想,本來我都要放棄部落格周更的思路了,一是因為我本來水準就不高,幾乎是沒有東西可寫,二是即使有東西可寫,也幾乎全是拾人牙慧的東西,寫起來又實在沒啥意思,更沒啥收獲。然後特意找了一篇為什麼要堅持寫部落格的文章來看,突然發現即使有一天我能寫出高品質的文章或者是解決了什麼有難度的技術問題了之後,我也是懶得把它寫出來的,是以幹脆從現在倒逼自己周更,有技術難點寫技術難點,沒技術難點就寫寫自己這周學到了什麼,這都沒有的話像上篇文章一樣開開腦洞也是好的。

以上!

繼續閱讀