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 的配置不协调,显得太小了。



更多相关文章

  1. android 实用sax 读取xml文件内容
  2. Android 打开相机、相册获取图片文件,支持Android 9.0系统
  3. 解决 android 在sd卡新建文件后需要重启才能找到
  4. android中调用系统功能 来显示本地相册图片 拍照 视频 音频功能
  5. Android中欢迎界面背景图片放大效果
  6. Android遍历文件Listfile返回值为null问题解决方法适用Android8.
  7. Android上传文件至PHP服务器
  8. Android分享图片
  9. android JNI处理图片的例子

随机推荐

  1. Android开发中立即停止AsyncTask和Thread
  2. Android中的预定义样式
  3. Android ListView getView()方法重复调用
  4. Issues with db4o in latest versions of
  5. Android Studio(三):设置Android Studio编
  6. Lua学习 2) —— Android与Lua互调
  7. 编译Android内核模块
  8. Android MapView 申请apiKey
  9. 调整 FMX Android 文字显示「锯齿」效果
  10. 如何在android中实现圆角显示