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:编译整个系统。