linux logo 和android 开机动画修改 http://blog.csdn.net/liucheng2009/article/details/6720990
主要过程分析:
BootAnimation::readyToRun()
==> 程序会尝试打开/data/local/bootanimation.zip和/system/media/bootanimation.zip文件
如果2个文件都不存在,那么mAndroidAnimation将为true
mAndroidAnimation = false;
status_t err = mZip.open("/data/local/bootanimation.zip");
if (err != NO_ERROR) {
err = mZip.open("/system/media/bootanimation.zip");
if (err != NO_ERROR) {
mAndroidAnimation = true;
}
}
于是最终将在下面threadLoop()函数中
BootAnimation::threadLoop()
if (mAndroidAnimation) {
r = Android(); // 执行android字体闪动的图片
} else {
r = movie(); // 执行bootanimation.zip中提供的动画图片
}
==> BootAnimation::Android()会加载"androidsrc\frameworks\base\core\res\assets\images\android-logo-mask.png"和"android-logo-shine.png"
==> BootAnimation::movie()会加载bootanimation.zip中的内容
--------------------
在frameworks\base\data\sounds文件夹里面添加你的bootanimation.zip和你的开机音乐bootanimation.MP3,重要的操作在于修改Android.mk,需要在里面添加$(LOCAL_PATH)/bootanimation.mp3:system/media/bootanimation.mp3 \
$(LOCAL_PATH)/bootanimation.zip:system/media/bootanimation.zip
就会把你的bootanimation.zip,bootanimation.MP3放到out\target\product\...\system/media/下面了。
android 开机画面定制 bootanimation 2011-04-21 17:48
关于如何向android2.1版本定制加入自己的开机动画 frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp SurfaceFlinger::readyToRun() ==> property_set("ctl.start", "bootanim"); // start boot animation system/core/rootdir/init.rc:327:service bootanim /system/bin/bootanimation frameworks/base/cmds/bootanimation/Android.mk:30:LOCAL_MODULE:= bootanimation frameworks/base/cmds/bootanimation/BootAnimation.cpp BootAnimation::readyToRun() ==> 程序会尝试打开/data/local/bootanimation.zip和/system/media/bootanimation.zip文件 如果2个文件都不存在,那么mAndroidAnimation将为true mAndroidAnimation = false; status_t err = mZip.open("/data/local/bootanimation.zip"); if (err != NO_ERROR) { err = mZip.open("/system/media/bootanimation.zip"); if (err != NO_ERROR) { mAndroidAnimation = true; } } 于是最终将在下面threadLoop()函数中 BootAnimation::threadLoop() if (mAndroidAnimation) { r = android(); // 执行android字体闪动的图片 } else { r = movie(); // 执行bootanimation.zip中提供的动画图片 } ==> BootAnimation::android()会加载"images/android-logo-mask.png"和"images/android-logo-shine.png" ==> BootAnimation::movie()会加载bootanimation.zip中的内容 而bootanimation.zip中内容格式为 bootanimation.zip |-- desc.txt |-- part0 `-- part1 其中desc.txt为描述文件 120 180 30 p 1 0 part0 p 0 0 part1 120和180分别对应图像宽、高像素数,30表示将按照30fps速度播放图片 p表示part,也就是含有png图片的目录为part0(part1) 120180是指显示的分辨率 宽 高 30是一秒的帧数 p后面的数字是指播放次数 0为循环 后面那位数字 一般为0 pause If pause = 10, it will show the last frame and then sleep 10/fps seconds before continuing with the animation.阶段切换间隔 制作bootanimation.zip注意 首先从里面的图片说起 图片一定要转换成PNG格式,建议找到的图片要和自己机子的分辨率一样,如果不是也可以的 有可能变形 注意图片的大小要统一(如果不会做连接的图片组 直接找个适合自己分辨率的动态图片分解出PNG格式的静态图片,用ImageReady可以批量导出) 建立part1 part2或android文件夹 放进一组连接的图片组 开始压缩成ZIP格式名字一定要bootanimation.zip压缩方式一定是存储 压缩完了看下大小一般最大的2MB左右 太大了用JPEG Imager压缩下 压缩图片很好的 然后part0,part1目录下内容结构为 |-- desc.txt |-- part0 | `-- bootanim_static_0000.png `-- part1 |-- bootanim_0000.png |-- bootanim_0001.png |-- bootanim_0002.png |-- bootanim_0003.png |-- bootanim_0004.png |-- bootanim_0005.png |-- bootanim_0006.png `-- bootanim_0007.png 最后我们来压缩 对于linux下的压缩方法为:(加入-0的意思是indicates no compression (store all files)) luther@gliethttp:~/bootanim$ zip -0 -r ../bootanimation.zip * adding: desc.txt (stored 0%) adding: part0/ (stored 0%) adding: part0/bootanim_static_0000.png (stored 0%) adding: part1/ (stored 0%) adding: part1/bootanim_00003.png (stored 0%) adding: part1/bootanim_00007.png (stored 0%) adding: part1/bootanim_00002.png (stored 0%) adding: part1/bootanim_00004.png (stored 0%) adding: part1/bootanim_00008.png (stored 0%) adding: part1/bootanim_00001.png (stored 0%) adding: part1/bootanim_00005.png (stored 0%) adding: part1/bootanim_00006.png (stored 0%) 对于windows的压缩方法为: 使用winrar找包,选择ZIP格式,压缩标准要选“储存” 一切搞定,将bootanimation.zip放到/system/media/或者/data/local/目录下即可 1、在播放动画时,有时候会出现白屏现象,这是由于在文件夹中除了图片文件外,还有有隐藏的图片的缓存临时文件Thumbs.db,找到并删除掉。可以通过串口来把修改好的文件替换掉系统中的。 2、如果part1部分文件不能循环播放,是由于在desc.txt中,最后需要有回车。 一般system目录是只读的,在根目录下使用mount命令改变system的属性: mount -o remount system system 之后sysem目录变成可读写的,就可以编辑了。 |
嵌入式Linux开机Logo的制作
2.6内核LOGO的制作方法
在LINUX下一般图片使用PNG格式比较多,这里就以PNG格式为例,不是PNG格式的图片,可以用GIMP转换一下:
首先将png图片转成pnm
# pngtopnm utulinux_logo.png > utulinux_logo.pnm
然后将pnm图片的颜色数限制在224
# pnmquant 224 utulinux_logo.pnm > utulinux_logo_224.pnm
最后将pnm图片转换成我们需要的ppm
# pnmtoplainpnm utulinux_logo_224.pnm > utulinux_logo_224.ppm
然utulinux_logo_224.ppm替换linuxsrc/drivers/video/logo中对应的图像就OK了。
Android中默认壁纸的修改
在Android中对壁纸的管理是通过WallpaperManager.java来处理的,在做系统开发的时候可能会涉及到修改默认的壁纸,默认的壁纸路径为:
./android-2.2/frameworks/base/core/res/res/drawable/default_wallpaper.jpg
我们可能会在系统的壁纸选择中加入我们自己的壁纸,系统壁纸是Launcher模块中加入的,我们只需要修改:
./packages/apps/Launcher2/res/values-mdpi/wallpapers.xml
在其中加入我们修改的壁纸的
<item>wallpaperName</item>
即可。
Android Settings中的默认设置
Settings应用能够配置Android系统的各种设置,这些设置的默认值都是由frameworks中的SettingsProvider从数据库中读取的,那么第一闪开机的时候这些数据都是从哪儿来的呢? frameworks/base/packages/SettingsProvider/res/values/defaults.xml这个文件就是用来存储Android系统的默认设置 例如: <integer name="def_screen_off_timeout">600000</integer>设置关屏超时时间的默认值 <integer name="def_screen_brightness">102</integer> 设置亮度的默认值 <bool name="def_install_non_market_apps">false</bool>设置是否允许安装非Market应用程序的默认值 在frameworks/base/core/res/res/values/config.xml里面的配置项config_automatic_brightness_available设置为true,缺省是false 【转】Android自动调整亮度,自动转屏和重力感应的设置 2012-04-13 12:12 源地址:http://www.devdiv.com/home.php?mod=space&uid=83792&do=blog&id=3881 一)Setting相关处理 Settings->display->auto rotate(自动旋转屏幕) /packages/apps/Settings/res/values/strings.xml <string name="accelerometer_title">Auto-rotate screen</string> packages/apps/Settings/res/xml/display_settings.xml <CheckBoxPreference android:key="accelerometer"android:title="@string/accelerometer_title"/> packages/apps/Settings/src/com/android/settings/DisplaySettings.java mAccelerometer.setChecked(Settings.System.getInt( if (preference == mAccelerometer) { getContentResolver(), Settings.System.putInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0) != 0); Settings.System.ACCELEROMETER_ROTATION, mAccelerometer.isChecked() ? 1 : 0); Settings.System.ACCELEROMETER_ROTATION表示重力感应,横竖屏切换} 二)自动转屏的实现 frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java void observe() { ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.END_BUTTON_BEHAVIOR), false, this); resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR), false, this); resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.ACCELEROMETER_ROTATION), false, this); int accelerometerDefault = Settings.System.getInt(resolver, Settings.System.ACCELEROMETER_ROTATION, DEFAULT_ACCELEROMETER_ROTATION); if (mAccelerometerDefault != accelerometerDefault) { mAccelerometerDefault = accelerometerDefault; updateOrientationListenerLp(); } MyOrientationListener mOrientationListener; packages/apps/Phone/src/com/android/phone/AccelerometerListener.java private void onSensorEvent(double x, double y, double z) { 。。。 setOrientation(orientation); } 2)加速度(accelerometer)是否就是重力感应 自动调整亮度说明 自动调整亮度,即:当阳光很强时,由于外界亮度大,需要加亮屏幕,才能看清,否则觉得屏幕昏暗;当外界光线很弱时,屏幕只需要低一点的亮度就够看清了,否则觉得刺眼。 要启动自动调整亮度, 1)首先,必须配置config.xml 在frameworks/base/core/res/res/values/config.xml里面的配置项config_automatic_brightness_available设置为true,缺省是false 2)在第一步设置之后,Settings->display->亮度设置,界面上会多出一个“自动调整亮度”选择框,如果选择框打勾,则表示真正启动了自动亮度调整 以下是自动亮度调整的代码跟踪 PowerManagerService.java systemReady方法里面代码片段是 if (mUseSoftwareAutoBrightness) { if (mDebugLightSensor) Log.d(TAG, "mUseSoftwareAutoBrightness=true"); mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); enableLightSensor(true); } (mUseSoftwareAutoBrightness从frameworks/base/core/res/res/values/config.xml里面的配置项config_automatic_brightness_available获取, 如果为true,则调用enableLightSensor(true); enableLightSensor函数会调用 mSensorManager.registerListener(mLightListener, mLightSensor,SensorManager.SENSOR_DELAY_NORMAL); 其中mSensorManager是PowerManagerService中的SensorManager对象成员变量, mLightListener是注册的监听器类SensorEventListener对象,如果亮度变化,会触发其方法的调用, mLightSensor是PowerManagerService中的LightSensor对象成员变量,代表光传感器。 SensorEventListener类定义如下 SensorEventListener mLightListener = new SensorEventListener() { public void onSensorChanged(SensorEvent event) { synchronized (mLocks) { // ignore light sensor while screen is turning off if (isScreenTurningOffLocked()) { Log.d(TAG, "ScreenTurningOffLocked, just return."); return; } int value = (int)event.values[0]; //从event里面获取当前数据,亮度大概在0到二十几 long milliseconds = SystemClock.elapsedRealtime(); if (mDebugLightSensor) { Log.d(TAG, "onSensorChanged: light value: " + value); } mHandler.removeCallbacks(mAutoBrightnessTask); if (mLightSensorValue != value) { //mLightSensorValue是当前的屏幕亮度 if (mLightSensorValue == -1 || milliseconds < mLastScreenOnTime + mLightSensorWarmupTime) { // process the value immediately if screen has just turned on lightSensorChangedLocked(value); //屏幕刚刚打开 } else { // delay processing to debounce the sensor mLightSensorPendingValue = value; //mLightSensorPendingValue是准备要设置的亮度 mHandler.postDelayed(mAutoBrightnessTask, LIGHT_SENSOR_DELAY); //在mAutoBrightnessTask任务里面延后处理 } } else { mLightSensorPendingValue = -1; } } } 。。。 }; mAutoBrightnessTask这个AutoBrightnessTask线程的run方法里面调用 private void lightSensorChangedLocked(int value) //此value的就是即将要设置的亮度值 mScreenBrightness.setTargetLocked(lcdValue, AUTOBRIGHTNESS_ANIM_STEPS, INITIAL_SCREEN_BRIGHTNESS, (int)mScreenBrightness.curValue) 然后启动mLightAnimator 说明,除了设置config_automatic_brightness_available为true之外,还必须设置其他一些数据项,否则运行时报异常 2124行getAutoBrightnessValue的return values[i];报错 参考$ANDROID_ROOT/device/htc/passion-common/overlay/frameworks/base/core/res/res/values/config.xml的内容,修改$ANDROID_ROOT/frameworks/base/core/res/res/values/config.xml 一共有以下几个配置项数据需要配置 config_autoBrightnessLevels -保存在PowerManagerService的mAutoBrightnessLevels变量中 config_autoBrightnessLcdBacklightValues --mLcdBacklightValues config_autoBrightnessButtonBacklightValues <integer-array name="config_autoBrightnessLevels"> config_autoBrightnessKeyboardBacklightValues <item>200</item> 以上每个项里面有多个子项,用于提供给数组的数据。 <item>400</item> 设置完之后,运行时不报异常,打印日志如下: <item>1000</item> <item>3000</item> 01-08 02:14:48.319: DEBUG/PowerManagerService(131): onSensorChanged: light value: 7</integer-array> 01-08 02:14:50.322: DEBUG/PowerManagerService(131): lightSensorChangedLocked 7 01-08 02:14:50.322: DEBUG/PowerManagerService(131): lcdValue 25 <!-- Array of output values for LCD backlight corresponding to the LUX values 01-08 02:14:50.322: DEBUG/PowerManagerService(131): buttonValue 255 in the config_autoBrightnessLevels array. This array should have size one greater 01-08 02:14:50.322: DEBUG/PowerManagerService(131): keyboardValue 0 than the size of the config_autoBrightnessLevels array. 但看上去并没有根据外界亮度改变屏幕和键盘等亮度,所以代码还待分析。This must be overridden in platform specific overlays --> <integer-array name="config_autoBrightnessLcdBacklightValues"> 重新分析LightSensorChangedLocked方法里面的代码片段 <item>25</item>int lcdValue = getAutoBrightnessValue( <item>55</item>(mIsDocked ? value : mHighestLightSensorValue), //第一个参数取二者的最大值 <item>70</item> mLcdBacklightValues); <item>70</item> <item>250</item> </integer-array> private int getAutoBrightnessValue(int sensorValue, int[] values) { try { int i; for (i = 0; i < mAutoBrightnessLevels.length; i++) { if (sensorValue < mAutoBrightnessLevels[i]) { break; } } return values[i]; } catch (Exception e) { // guard against null pointer or index out of bounds errors Slog.e(TAG, "getAutoBrightnessValue", e); return 255; } } 此段代码的意思是,如果传入的sensorValue比config_autoBrightnessLevels的第i个值要小,则获得值是config_autoBrightnessLcdBacklightValues的第i个值 目前传入的sensorValue总是比config_autoBrightnessLevels的第一个值要小,所以每次lcdValue得到的值都是config_autoBrightnessLcdBacklightValues的第一个值 所以亮度一直都没实际变动。 前面根据日志,onSensorChanged方法里面每次获取当前亮度在0到20几之间,似乎和config_autoBrightnessLevels 的配置不协调,显得太小了。 | |
- TextView属性总结
- android中调用系统功能 来显示本地相册图片 拍照 视频 音频功能
- android中LayoutParams设置参数的理解
- Android开发学习:ImageView的scaletype属性
- Android(安卓)打开相机、相册获取图片文件,支持Android(安卓)9.0
- Android中欢迎界面背景图片放大效果
- 几个标签属性的意义
- android 项目中规范使用SharedPreferences
- android 模拟器中启用相机API支持
随机推荐
-
Android练习—修改背景颜色
-
Android性能检测--traceview工具各个参数
-
Android(安卓)示例之 notepad
-
delphi android 中 Toast 的实现(老外写
-
android 相机 前后摄像头判断
-
android studio更新提示网络连接失败的解
-
Android(安卓)MediaScannerJNI源码详解
-
android朗读英文
-
android webview 使用
-
Android(安卓)缩放图片