androidmma編譯
Ⅰ Settings: android 組件如何響應語言變化
這篇博客主要是在研究 Settings 源碼時所激發的,把自己的經驗拿出來分享一番!我在設置語言之後,發現有些地方的語言還是沒有改變,這個時候想起了 onConfigurationChanged 方法,先來看看這個方法。public interface ComponentCallbacks
這個介麵包括兩個方法,其中一個就是onConfigurationChanged 方法。Activity、Service、ContentProvider 都實現了這個介面,所以在代碼中,我們可以重寫這個方法,便於回調處理。那麽,這個方法何時才會被回調呢?abstract voidonConfigurationChanged(Configuration newConfig)
Called by the system when the device configuration changes while your component is running.
"touchscreen", "keyboard", "keyboardHidden",
"navigation", "screenLayout", "fontScale", "uiMode",
"orientation", "screenSize", "smallestScreenSize"]
這里需要提醒一下,如果使用 Activity 配合 onConfigurationChanged 方法,需要在其 menifest.xml 中添加:android:configChanges 屬性。所以,如果你有需要可以在上面的三大組件中重寫該方法,做你自己的邏輯處理!如果,在 Settings 裡面改變語言之後,在我們其它的 App 中可以注冊某個廣播就可以接收到這種變化,就更好了!恩,當然可以!注冊一個廣播:IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); registerReceiver(receiver, filter); 接收廣播:private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if("android.intent.action.CONFIGURATION_CHANGED".equals(action)) { // to do } } };別忘記在合適的位置取消注冊:unregisterReceiver(receiver);
這樣做的話,要比直接重寫onConfigurationChanged 方法,更加靈活,因為有些沒有實現這個介面的android組件一大把,但是接收廣播對於大多數組件來說還還是比較簡單的!在以後的博客中,我和大家交流一下關於自定義的View如何接收廣播!關於Intent.ACTION_CONFIGURATION_CHANGED,可以參考 sdk 文檔。有的人說,我現在只關心設備語言變化的那個 action,到底有木有?有!Intent.ACTION_LOCALE_CHANGED
如果你有興趣,可以參考 /frameworks/base/services/java/com/android/server/am/ActivityManagerService.java,關鍵代碼如下: /** * Do either or both things: (1) change the current configuration, and (2) * make sure the given activity is running with the (now) current * configuration. Returns true if the activity has been left running, or * false if starting is being destroyed to match the new * configuration. */ public boolean updateConfigurationLocked(Configuration values, ActivityRecord starting) { int changes = 0; boolean kept = true; if (values != null) { Configuration newConfig = new Configuration(mConfiguration); changes = newConfig.updateFrom(values); if (changes != 0) { if (DEBUG_SWITCH || DEBUG_CONFIGURATION) { Slog.i(TAG, "Updating configuration to: " + values); } EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes); if (values.locale != null) { saveLocaleLocked(values.locale, !values.locale.equals(mConfiguration.locale), values.userSetLocale); } mConfigurationSeq++; if (mConfigurationSeq =0; i--) { ProcessRecord app = mLruProcesses.get(i); try { if (app.thread != null) { if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending to proc " + app.processName + " new config " + mConfiguration); app.thread.scheleConfigurationChanged(mConfiguration); } } catch (Exception e) { } } Intent intent = new Intent(Intent.ACTION_CONFIGURATION_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_REPLACE_PENDING); broadcastIntentLocked(null, null, intent, null, null, 0, null, null, null, false, false, MY_PID, Process.SYSTEM_UID); if ((changes&ActivityInfo.CONFIG_LOCALE) != 0) { broadcastIntentLocked(null, null, new Intent(Intent.ACTION_LOCALE_CHANGED), null, null, 0, null, null, null, false, false, MY_PID, Process.SYSTEM_UID); } } } if (changes != 0 && starting == null) { // If the configuration changed, and the caller is not already // in the process of starting an activity, then find the top // activity to check if its configuration needs to change. starting = mMainStack.topRunningActivityLocked(null); } if (starting != null) { kept = mMainStack.(starting, changes); if (kept) { // If this didn't result in the starting activity being // destroyed, then we need to make sure at this point that all // other activities are made visible. if (DEBUG_SWITCH) Slog.i(TAG, "Config didn't destroy " + starting + ", ensuring others are correct."); mMainStack.ensureActivitiesVisibleLocked(starting, changes); } } if (values != null && mWindowManager != null) { mWindowManager.setNewConfiguration(mConfiguration); } return kept; } 代碼中有關於,上面提到的兩個 Intent Action.另外,保存設置 locale 信息的源碼: /** * Save the locale. You must be inside a synchronized (this) block. */ private void saveLocaleLocked(Locale l, boolean isDiff, boolean isPersist) { if(isDiff) { SystemProperties.set("user.language", l.getLanguage()); SystemProperties.set("user.region", l.getCountry()); } if(isPersist) { SystemProperties.set("persist.sys.language", l.getLanguage()); SystemProperties.set("persist.sys.country", l.getCountry()); SystemProperties.set("persist.sys.localevar", l.getVariant()); } }android 系統會發出很多廣播,但是這麽多 action,如何記住
Ⅱ 當前公式 : FYSJ (指標畫線公式) 錯誤句 : 詳細信息 : 引用指標FYSJ時出現自我調用的情況或者FYSJ未通過
N:=7.5;
MMA30:=EMA(CLOSE,30);
強弱界定:=IF(PERIOD=0,EMA(CLOSE,900),DRAWNULL),COLORWHITE,LINETHICK2;
分時價量線:=SUM(C*V,240)/SUM(V,240),COLORYELLOW,LINETHICK1;
實時漲幅限制:=(C/DYNAINFO(3)-1)*100;
{買賣力度}
買入力度:='FYSJ.買入力度';
賣出力度:='FYSJ.賣出力度';
買賣力度:=SUM((買入力度-賣出力度),0),COLORAAAA00,NODRAW;
買賣力度比:=買賣力度/SUM((買入力度+賣出力度),0)*50,NODRAW,COLORFFFFFF,LINETHICK2;
買賣力度比設置:=買賣力度比+50;
買賣力度比限制:IF(買賣力度比設置>80,80,IF(買賣力度比設置<20,20,買賣力度比設置));
DRAWBAND(買賣力度比限制,RGB(208,188,58),50,RGB(8,58,18));
分時力度線:=SUM(C*買賣力度比限制,240)/SUM(買賣力度比限制,240),COLORYELLOW,LINETHICK2;
買賣力度參考線0:=MA(買賣力度比限制,8)*1.062,COLORRED;
買賣力度參考線:MA(買賣力度比限制,8)*1.091,COLORRED;
買賣力度參考線2:=MA(買賣力度比限制,5)*1.191,COLORCYAN;
平安分時關注:=買賣力度參考線<50 AND CROSS(買賣力度比限制,50);
平安分時追漲:=(CROSS(買賣力度比限制,買賣力度參考線) OR (CROSS(買賣力度比限制,買賣力度參考線0) AND 買賣力度比限制>70)) AND (買賣力度比限制>50) AND (MMA30>強弱界定 OR 分時價量線>強弱界定 OR C>MAX(MMA30,強弱界定)) AND C>分時價量線 AND V>MA(V,20) AND DYNAINFO(17)>=1.2 AND 實時漲幅限制<N;
STICKLINE(平安分時關注,50,60,1,0),COLOR0000FF;
STICKLINE(FILTER(平安分時追漲,20),50,65,1,0),COLORMAGENTA;
DRAWICON(CROSS(買賣力度比限制,買賣力度參考線) AND 買賣力度比限制>50 AND (V>MA(V,20) OR V=HHV(V,20)),66,1);
DRAWTEXT(FILTER(平安分時關注,20),62,'平安關注'),COLORRED;
DRAWTEXT(FILTER(平安分時追漲,20),67,'平安追漲'),COLORMAGENTA;
DRAWICON(FROMOPEN<=20 AND 買賣力度比限制>60 AND CROSS(買賣力度參考線,買賣力度比限制),70,9);
{計算收益、已爆分鍾}
PA1:=BARSSINCE(平安分時追漲)+1;
首次追漲價:=REF(C,PA1-1),NODRAW;
追漲收益:(DYNAINFO(7)-首次追漲價)/首次追漲價*100,NODRAW;
PA2:=BARSSINCE(平安分時關注)+1;
首次關注價:=REF(C,PA2-1),NODRAW;
關注收益:(DYNAINFO(7)-首次關注價)/首次關注價*100,NODRAW;
Ⅲ 安卓編譯報錯:missing and no known to make it
編譯過程中報錯提示如下:
make: *** No rule to make target `out/target/common/obj/JAVA_LIBRARIES/libprotobuf-Java-2.3.0-nano_intermediates/javalib.jar', needed by `out/target/common/obj/APPS/Launcher3_intermediates/classes-full-debug.jar'. Stop.
原生的SDK居然報錯,沒辦法只能著手分析了。從字面分析來看是編譯需要的protobuf jar包沒有build進去導致的,先看看是哪個相關的包。
host-libprotobuf-java-2.3.0-nano.jar這個jar包沒編譯出來,看了下源碼的mk文件,是有相關的編譯配置的,於是想想是不是有編譯依賴包相關的指令,
網上一找,還真有mma,於是mma一敲,嘩啦啦的過了。
網上有很多介紹的文章是在eclips中導入應用進行編譯的,此處就不作分析了。回頭有空研究下這些個編譯指令。。。
Ⅳ android 2048怎麼配色
1、容器我們准備自定義ViewGroup ,叫做Game2048Layout ; 裡面的塊塊自定義View ,叫做Game2048Item
接下來從簡單的開始:
2、Game2048Item
Game2048Item是個View,並且需要哪些屬性呢?
首先得有個number,顯示數字嘛,然後繪制的時候根據number繪制背景色;還需要呢?嗯,需要正方形邊長,再考慮下,這個邊長應該Item自己控制么?顯然不是的,Game2048Layout 是個n*n的面板,這個n是不確定的,所以Item的邊長肯定是Game2048Layout 計算好傳入的。這樣必須的屬性就這兩個。
3、Game2048Layout
Game2048Layout是個容器,我們觀察下,裡面View是個 n*n的排列,我們准備讓其繼承RelativeLayout ; 這樣可以通過設置Item的RIGHT_OF之類的屬性進行定位;
我們在onMeasure裡面得到Layout的寬和高,然後根據n*n,生成一定數目的Item,為其設置寬和高,放置到Layout中,這樣整個游戲的布局就做好了;繪制的細節上:Item間有橫向與縱向的間距,所以需要設置這個值,叫做mMargin。然後Item的邊長 = ( Layout邊長 - (n-1)*mMagin ) / n ;
剩下的就是onTouchEvent裡面去判斷用戶手勢了,然後就行各種邏輯操作了~
Ⅳ android加速度感測器怎麼使用
Android 是面向智能手機和其他攜帶型設備的最受歡迎的操作系統(OS)之一。它為多種感測器提供了標準的API 介面,包括加速度計。加速度計的標准API 定義了原始加速度數據的坐標系統。用戶必須將從感測器中讀取的原始數據轉換為標准單位,並使其符合系統定義的坐標方向。本文介紹了Android 中的坐標系統是如何定義的,以及如何在Android 系統的驅動代碼中對3 軸加速度計數據的方向和坐標進行轉換。本文討論的示例代碼基於飛思卡爾的Android 2.2 和2.3 驅動程序,加速度計則以飛思卡爾的MMA8452Q 加速度感測器為例。
關鍵詞:加速度計,感測器驅動,Android
一部智能手機或便攜設備應具有Wi-Fi 和互聯網功能,能夠運行應用軟體等諸多特徵,而且一定會具有內置感測器。高端智能手機可能集成接近感測器,環境光感測器,3 軸加速度計,以及磁力計等多種感測器。 Android 2.3 添加了一些支持多種新型感測器的API,包括陀螺儀、旋轉向量、線性加速度、重力和氣壓感測器等。應用軟體可以使用這些新型感測器,將它們組合起來,就可以實現高精確度的高級運動檢測功能。
3 軸加速度計或低g 值感測器是Android API 支持的感測器之一,具有特定的坐標系統,可以給應用程序提供標準的介面數據。坐標空間的定義與手機屏幕的默認方向有關
Ⅵ 如何在android的驅動程序中對加速度感測器的數據進行方向和坐標的轉
一部智能手機或便攜設備應具有Wi-Fi 和互聯網功能,能夠運行應用軟體等諸多特徵,而且一定會具有內置感測器。高端智能手機可能集成接近感測器,環境光感測器,3
軸加速度計,以及磁力計等多種感測器。 Android 2.3
添加了一些支持多種新型感測器的API,包括陀螺儀、旋轉向量、線性加速度、重力和氣壓感測器等。應用軟體可以使用這些新型感測器,將它們組合起來,就可以實現高精確度的高級運動檢測功能。
3 軸加速度計或低g 值感測器是Android API
支持的感測器之一,具有特定的坐標系統,可以給應用程序提供標準的介面數據。坐標空間的定義與手機屏幕的默認方向有關,如圖1所示。
圖
1. 3 軸加速度計的Android 坐標系統
在Android 坐標系統中,坐標原點位於屏幕的左下角,X 軸水平指向右側,Y 軸垂直指向頂部,Z
軸指向屏幕前方。在該系統中,屏幕後方的坐標具有負的Z 軸值。Android 加速度計數據定義為:
Sensor.TYPE_ACCELEROMETER
所有數值都採用SI
標准單位(m/s2),測量手機的加速度值,並減去重力加速度分量。
values[0]:x 軸上的加速度值減去Gx
values[1]:y
軸上的加速度值減去Gy
values[2]:z 軸上的加速度值減去Gz
例如,當設備平放在桌上並推著其左側向右移動時,x
軸加速度值為正。當設備平放在桌上時,加速度值為+9.81,這是用設備的加速度值 (0 m/s2) 減去重力加速度值 (-9.81 m/s2)得到的。
當設備平放在桌上放,並以加速度A m/s2 朝天空的方向推動時,加速度值等於A+9.81,這是用設備加速度值(+A
m/s2)減去重力加速度值(-9.81 m/s2)得到的。
表 1
列出了與設備的各個位置相對應的感測器的加速度值讀數。用戶可以用下表檢查加速度計的方向與系統坐標是否一致。
在 Android HAL 文件中改變 X、Y 和Z 軸的方向
在 HAL
文件中,會有一組宏定義,用於把從感測器中讀取的加速度數據轉換為標准單位(m/s2)。如以下代碼:
// conversion of
acceleration data to SI units (m/s^2)
#define CONVERT_A (GRAVITY_EARTH /
LSG)
#define CONVERT_A_X (-CONVERT_A)
#define CONVERT_A_Y (CONVERT_A)
#define CONVERT_A_Z (CONVERT_A)
在這個宏定義中,常量GRAVITY_EARTH
是一個標准重力加速度值,即9.81m/s2,LSG為一個重力加速度值的最小有效計數值,例如,MMA8452
在正常模式下的讀數為1024。因此,CONVERT_A 用於把從加速度感測器中讀取的數據,從數字讀數轉換為標准重力加速度單位。
通過分別修改CONVERT_A_X、CONVERT_A_Y 和CONVERT_A_Z,我們可以輕松地改變X、Y 和Z
軸的方向。如果該軸的方向與系統定義相反,可以使用(-CONVERT_A)來改變其方向。如果方向一致,就使用(CONVERT_A),則保持方向不變。
這個宏定義位於FSL Android 9 (Android 2.2)驅動程序的HAL文件sensor.c 中。對於FSLAndroid 10
(Android 2.3),您可以在』libsensors』文件夾的HAL 文件Sensor.h 中找到它。
在 Android 2.2 HAL
文件中交換X 軸和Y 軸
在某些情況下,X 和Y 軸必須進行交換,以便使感測器數據的坐標與系統坐標保持一致。
對於 FSL
Android 9 (Android 2.2)驅動程序來說,X 軸和Y 軸的交換非常簡單。首先,在HAL 文件sensor.c
中,在函數sensor_poll() 中找到以下代碼:
switch (event.code) {
case ABS_X:
sSensors.acceleration.x = event.value * CONVERT_A_X;
break;
case
ABS_Y:
sSensors.acceleration.y = event.value * CONVERT_A_Y;
break;
case ABS_Z:
sSensors.acceleration.z = event.value * CONVERT_A_Z;
break;
}
然後,根據如下所示修改代碼:
switch (event.code) {
case
ABS_X:
sSensors.acceleration.y = event.value * CONVERT_A_Y;
break;
case ABS_Y:
sSensors.acceleration.x = event.value * CONVERT_A_X;
break;
case ABS_Z:
sSensors.acceleration.z = event.value *
CONVERT_A_Z;
break;
}
在 Android 2.3 的HAL 文件中交換X 軸和Y 軸
在
Android 2.3 的HAL 文件中交換X 軸和Y 軸會更加復雜些,因為它具有更復雜的HAL文件結構。所有HAL
文件都位於文件夾『libsensors』中。文件AccelSensor.cpp 中的兩個函數需要修改。
首先,修改函數AccelSensor()的代碼,如下所示:
if
(accel_is_sensor_enabled(SENSOR_TYPE_ACCELEROMETER)) {
mEnabled |=
1<<accelerometer; if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_X),
&absinfo)) {
mPendingEvents[Accelerometer].acceleration.y =
absinfo.value * CONVERT_A_Y;
}
if (!ioctl(data_fd,
EVIOCGABS(EVENT_TYPE_ACCEL_Y), &absinfo)) {
mPendingEvents[Accelerometer].acceleration.x = absinfo.value * CONVERT_A_X;
}
if (!ioctl(data_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Z), &absinfo)) {
mPendingEvents[Accelerometer].acceleration.z = absinfo.value * CONVERT_A_Z;
}
}
然後,修改函數processEvent()的代碼,如下所示:
void
AccelSensor::processEvent(int code, int value)
{
switch (code) {
case EVENT_TYPE_ACCEL_X:
mPendingMask |= 1<<accelerometer; mPendingEvents[Accelerometer].acceleration.y = value * CONVERT_A_Y;
break;
case EVENT_TYPE_ACCEL_Y:
mPendingMask |= 1<<accelerometer; mPendingEvents[Accelerometer].acceleration.x = value * CONVERT_A_X;
break;
case EVENT_TYPE_ACCEL_Z:
mPendingMask |= 1<<accelerometer; mPendingEvents[Accelerometer].acceleration.z = value * CONVERT_A_Z;
break;
}
}
完成後,X 軸和Y 軸的數據就互相交換了。
在 Kernel 驅動文件中交換X 軸和Y 軸
X 軸和Y 軸的數據交換可以在底層的Linux 驅動中,在剛開始讀取感測器數據時實施。通過這種方法,無論感測器晶元以何種方式安裝在PCB
中,或者使用各種不同類型的感測器,HAL 文件都可以保持一致。
對於 Android 2.2 和2.3
來說,執行該操作的最便捷的方式是修改函數report_abs()中的代碼。在該函數中,感測器數據通過調用函數mma8452_read_data()讀取,如下所示(當使用的感測器為MMA8452Q
時):
if (mma8452_read_data(&x,&y,&z) != 0) {
//DBG("mma8452 data read failed
");
return; }
X 軸和Y
軸可以通過以下方式輕松交換:
if (mma8452_read_data(&y,&x,&z) != 0) {
//DBG("mma8452 data read failed
");
return; }
對於 Android
2.2,MMA8452 的Kernel 驅動文件為mma8452.c;對於Android 2.3,驅動文件是『hwmon』文件夾中的mxc_mma8452.c。
在 Kernel 驅動文件中改變 X、Y 和Z 軸的方向
感測器數據的方向也可以在Kernel
驅動文件中更改。以下帶有注釋的語句可以添加到函數report_abs()中,從而改變數據方向:
if
(mma8452_read_data(&y,&x,&z) != 0) {
//DBG("mma8452 data read
failed
");
return;
}
x *= -1; //Reverse X direction
y *= -1;
//Reverse Y direction
z *= -1; //Reverse Z direction
input_report_abs(mma8452_idev->input, ABS_X, x);
input_report_abs(mma8452_idev->input, ABS_Y, y);
input_report_abs(mma8452_idev->input, ABS_Z, z);
input_sync(mma8452_idev->input);
總結
Android
系統已經為加速度計定義了坐標系統,因此用戶必須轉換從實際感測器中讀取的數據,從而與其保持一致。無論是否需要轉換,都應檢查X、Y 和Z
軸的方向以及X-Y軸坐標。我們可以更改HAL 文件或Kernel 驅動文件來改變軸的方向,或交換X 和Y 軸,但是不要同時修改HAL 文件和Kernel 驅動。
找找
Ⅶ 安卓編譯報錯:missing and no known to make it
編譯過程中報錯提示如下:
make:
***
No
rule
to
make
target
`out/target/common/obj/JAVA_LIBRARIES/libprotobuf-Java-2.3.0-nano_intermediates/javalib.jar',
needed
by
`out/target/common/obj/APPS/Launcher3_intermediates/classes-full-debug.jar'.
Stop.
原生的SDK居然報錯,沒辦法只能著手分析了。從字面分析來看是編譯需要的protobuf
jar包沒有build進去導致的,先看看是哪個相關的包。
host-libprotobuf-java-2.3.0-nano.jar這個jar包沒編譯出來,看了下源碼的mk文件,是有相關的編譯配置的,於是想想是不是有編譯依賴包相關的指令,
網上一找,還真有mma,於是mma一敲,嘩啦啦的過了。
網上有很多介紹的文章是在eclips中導入應用進行編譯的,此處就不作分析了。回頭有空研究下這些個編譯指令。。。
Ⅷ android 7.0 launcher3 編譯報錯:
編譯過程中報錯提示如下:
make: *** No rule to make target `out/target/common/obj/JAVA_LIBRARIES/libprotobuf-Java-2.3.0-nano_intermediates/javalib.jar', needed by `out/target/common/obj/APPS/Launcher3_intermediates/classes-full-debug.jar'. Stop.
原生的SDK居然報錯,沒辦法只能著手分析了。從字面分析來看是編譯需要的protobuf jar包沒有build進去導致的,先看看是哪個相關的包。
host-libprotobuf-java-2.3.0-nano.jar這個jar包沒編譯出來,看了下源碼的mk文件,是有相關的編譯配置的,於是想想是不是有編譯依賴包相關的指令,
網上一找,還真有mma,於是mma一敲,嘩啦啦的過了。
網上有很多介紹的文章是在eclips中導入應用進行編譯的,此處就不作分析了。回頭有空研究下這些個編譯指令。。。
Ⅸ 三字代碼MMX和MMA的區別
摘要 m:編譯整個系統。