編輯:關於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); }
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); // 獲得當前手機支持的所有傳感器 Listsensors = 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) { } }
Android4.4 fence機制分析 在任何一個系統中,無可避免的都會跟各種buffers打交道,最經典的模式就是消費-生產者模式,一個獨立的buffer在它們之間
首先借用郭神的一張圖平時我們初始化一個activity的使用會用到下面的代碼: @Override protected void onCreate(Bundle
我們在常用的電商或者旅游APP中,例如美團,手機淘寶等等,都能夠看的到有那種下拉式的二級列表菜單。具體如圖所示: 上面兩張圖就是美團的一個二級列表菜單的一個展
這個演示展示了Heap Viewer工具的基本用法。Heap Viewer實時報告你的應用程序已經分配了什麼類型的對象,多少個,和它們在堆內存中的大小。它的優勢:獲取你的
國際慣例,先來效果圖 在閱讀本文章之前,請確定熟悉【Scrol