天天看点

从指南针到动手搭建自己的第一台计算机

大约在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:最后说一点自己的感想,本来我都要放弃博客周更的思路了,一是因为我本来水平就不高,几乎是没有东西可写,二是即使有东西可写,也几乎全是拾人牙慧的东西,写起来又实在没啥意思,更没啥收获。然后特意找了一篇为什么要坚持写博客的文章来看,突然发现即使有一天我能写出高质量的文章或者是解决了什么有难度的技术问题了之后,我也是懒得把它写出来的,所以干脆从现在倒逼自己周更,有技术难点写技术难点,没技术难点就写写自己这周学到了什么,这都没有的话像上篇文章一样开开脑洞也是好的。

以上!

继续阅读