android 开机动画修改以及默认壁纸

  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)

120 180是指显示的分辨率 宽 高
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 的配置不协调,显得太小了。



你可能感兴趣的:(android,Integer,button,frameworks,delay,behavior)