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