当前位置:首页 » 安卓系统 » maskandroid

maskandroid

发布时间: 2022-09-13 11:03:28

① 如何修改android系统设置

  • 应用能够配置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应用程序的默认值

    • 开机图片:

      android-logo-mask.png
      android-logo-shine.png

      这两个图片一个在上一个在下

    • ./out/target/common/obj/java_LIBRARIES/android_stubs_current_intermediates/classes/assets/images/android-logo-shine.png
      ./frameworks/base/core/res/assets/images/android-logo-shine.png

      注意:如果源码没有make可以直接更改frameworks里的的图片就可以了

      然后直接make否则必须全更改并且不能make只能make firmwar

    • 默认开机墙纸的位置:

      default_wallpaper.jpg

    • ./out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes/res/drawable/default_wallpaper.jpg
      ./frameworks/base/core/res/res/drawable/default_wallpaper.jpg
      注意:这个设置和上面的一样这俩个都不能更改文件名

    • 更改PC机器删除硬件的文字kernel中
      drivers/usb/gadget/f_mass_storage.c
      fsg->vendor = "XXXXXXXXXXXXX";

    • 更改卷标:
      bootable/recovery/etc/init.rc
      setprop UserVolumeLabel "XXXXXXXXXXXXX"
      直接打包

    • 修改屏幕锁:

      (1)frameworks/base/packages/SettingsProvider/res/values/defaults.xml
      <integer name="def_screen_off_timeout">60000</integer>
      60000改成想要的时间如果是不锁为-1(2)frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardViewMediator.java
      private boolean mExternallyEnabled = true;
      将其修改成false,这样更改就不会再进入休眠状态了

    • 设定初始化主页:
      package/app/Browser/res/values/String.xml
      655行
      后面的应该是书签里的

    • 设定亮度0~255:
      frameworks/base/packages/SettingsProvider/res/values/defaults.xml
      def_screen_brightness-->这个值初始化好像是100多

    • 音量:
      frameworks/base/media/java/android/media/AudioManager.java
      数组DEFAULT_STREAM_VOLUME第4个值(最大我设置到30但是还是差2格才到最大--默认是11
      建议将数组里的所有的数值都设为最大就OK了)

    • 设置Google帐户,左上角提示“正在设置RK2818SDK”,要求改成“正在设置W9”:
      out argetproctsdkDemo oot 中default.prop文件第13行
      ro.proct.model=rk2818sdk改为 ro.proct.model=W9

    • 录音没有小时显示。要求增加:

      (1)SoundRecorder.java中: private void updateTimerView()
      把 String timeStr = String.format(mTimerFormat, time/60, time%60);
      改为:long hour=time/3600;
      String timeStr = String.format(mTimerFormat, hour, (time-hour*3600)/60, time%60);

      (2) esvalues中strings.xml改为:
      <string name="timer_format"><xliff:g id="format">%02d:%02d:%02d</xliff:g></string>

    • 去掉Bluetooth:

      (主界面->添加文件夹->Bluetooth received)
      ic_launcher_folder_bluetooth.png(72*72):
      在packagesappsBluetooth esdrawable-hdpi
      解决方法:删除out argetproctsdkDemosystemapp下的Bluetooth.apk

    • 充电锁屏时图片:
      frameworksasecore es esdrawable-hdpi:ic_lock_idle_charging.png

    • 去掉锁屏时显示充电百分比在:
      frameworksasecore es esvalues-zh-rCN中strings.xml 的lockscreen_plugged_in 括号中的内容及括号 !!

    • 去掉动态桌面背景选项:
      packageswallpapersBasic 中AndroidManifest.xml的<service>这些,如星系注释掉如下这些:
      <service
      android:label="@string/wallpaper_galaxy" android:name="com.android.wallpaper.galaxy.GalaxyWallpaper"
      android:permission="android.permission.BIND_WALLPAPER">
      <intent-filter>
      <action android:name="android.service.wallpaper.WallpaperService" />
      </intent-filter>
      <meta-data android:name="android.service.wallpaper" android:resource="@xml/galaxy" />
      </srvice>

    • 更改版本号:
      build/core/Makefile
      79行
      RK_VER := xxx

    • 更改界面布局
      位置:package/app/Launcher2/res/xml/default_workspace.xml
      注意:adb shell 里当你点击任意的一个apk的时候,在后台会输出
      I/ActivityManager(728): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.estrongs.android.pop/.view.FileExplorerActivity bnds=[294,373][393,478] }
      I/WindowManager(728): Setting rotation to 1, animFlags=0
      看上面“cmp=com.estrongs.android.pop”的部分就可以找到/前是包名/后面是类名-->这个是在default_workspace.xml里面需要用到的
      launcher:packageName="com.android.browser"
      launcher:className="com.android.browser.BrowserActivity"

    • 如何将pdf类的文件放到桌面上
      将自己制作的pdf帮助文档放置到桌面上使客人可以直接点击就浏览
      String urlString = "/system/app/Nvsbl P4Dv2 English Manual.pdf";
      Intent intent = new Intent();
      intent.setAction(android.content.Intent.ACTION_VIEW);
      intent.setDataAndType(Uri.fromFile(new File(urlString)),"application/pdf");
      startActivity(intent);
      finish();
      解释下:
      首先将pdf文档放到out/target/proct/sdkDemo/system/app下
      将固定地址给出urlString,使用Intent
      intent.setAction(android.content.Intent.ACTION_VIEW);启动View
      intent.setDataAndType(Uri.fromFile(new File(urlString)),"application/pdf");
      application/pdf可以指定别的格式包括音频,视频,图片等等但是没有试过有需要可以试试
      注意:这个方法很不到如果只放置一些图片还可以但是如果放置文件比较大那么打包出来的
      system.img文件会很大也就是占用本身的系统内存----->所以不推荐使用

    • 发现PIN解锁界面出现5秒之后就会自动进入睡眠,之后将无法再次解锁。目前解决方法:
      修改文件 frameworkspolicies.java
      将如下这行:
      protected static final int AWAKE_INTERVAL_DEFAULT_MS = 5000;
      修改为:

      protected static final int AWAKE_INTERVAL_DEFAULT_MS = 1000 * 60 * 5;

② 如何修改android5.1系统bug

应用能够配置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应用程序的默认值
开机图片:
android-logo-mask.png
android-logo-shine.png
这两个图片一个在上一个在下
./out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes/assets/images/android-logo-shine.png
./frameworks/base/core/res/assets/images/android-logo-shine.png
注意:如果源码没有make可以直接更改frameworks里的的图片就可以了
然后直接make否则必须全更改并且不能make只能make firmwar
默认开机墙纸的位置:
default_wallpaper.jpg
./out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes/res/drawable/default_wallpaper.jpg
./frameworks/base/core/res/res/drawable/default_wallpaper.jpg
注意:这个设置和上面的一样这俩个都不能更改文件名
更改PC机器删除硬件的文字kernel中
drivers/usb/gadget/f_mass_storage.c
fsg->vendor = "XXXXXXXXXXXXX";
更改卷标:
bootable/recovery/etc/init.rc
setprop UserVolumeLabel "XXXXXXXXXXXXX"
直接打包
修改屏幕锁:
(1)frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<integer name="def_screen_off_timeout">60000</integer>
60000改成想要的时间如果是不锁为-1(2)frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardViewMediator.java
private boolean mExternallyEnabled = true;
将其修改成false,这样更改就不会再进入休眠状态了
设定初始化主页:
package/app/Browser/res/values/String.xml
655行
后面的应该是书签里的
设定亮度0~255:
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
def_screen_brightness-->这个值初始化好像是100多
音量:
frameworks/base/media/java/android/media/AudioManager.java
数组DEFAULT_STREAM_VOLUME第4个值(最大我设置到30但是还是差2格才到最大--默认是11
建议将数组里的所有的数值都设为最大就OK了)
设置Google帐户,左上角提示“正在设置RK2818SDK”,要求改成“正在设置W9”:
out\target\proct\sdkDemo\root 中default.prop文件第13行
ro.proct.model=rk2818sdk 改为 ro.proct.model=W9
录音没有小时显示。要求增加:
packages\apps\SoundRecorder\src\com\android\soundrecorder
(1)SoundRecorder.java中: private void updateTimerView()
把 String timeStr = String.format(mTimerFormat, time/60, time%60);
改为:long hour=time/3600;
String timeStr = String.format(mTimerFormat, hour, (time-hour*3600)/60, time%60);
(2) \res\values中strings.xml改为:
<string name="timer_format"><xliff:g id="format">%02d:%02d:%02d</xliff:g></string>
去掉Bluetooth:
(主界面->添加文件夹->Bluetooth received)
ic_launcher_folder_bluetooth.png(72*72):
在\packages\apps\Bluetooth\res\drawable-hdpi
解决方法:删除\out\target\proct\sdkDemo\system\app下的Bluetooth.apk
充电锁屏时图片:
frameworks\base\core\res\res\drawable-hdpi:ic_lock_idle_charging.png
去掉锁屏时显示充电百分比在:
frameworks\base\core\res\res\values-zh-rCN中strings.xml 的lockscreen_plugged_in 括号中的内容及括号 !!
去掉动态桌面背景选项:
packages\wallpapers\Basic 中AndroidManifest.xml的<service>这些,如星系注释掉如下这些:
<service
android:label="@string/wallpaper_galaxy" android:name="com.android.wallpaper.galaxy.GalaxyWallpaper"
android:permission="android.permission.BIND_WALLPAPER">
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data android:name="android.service.wallpaper" android:resource="@xml/galaxy" />
</srvice>
更改版本号:
build/core/Makefile
79行
RK_VER := xxx
更改界面布局
位置:package/app/Launcher2/res/xml/default_workspace.xml
注意:adb shell 里当你点击任意的一个apk的时候,在后台会输出
I/ActivityManager( 728): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.estrongs.android.pop/.view.FileExplorerActivity bnds=[294,373][393,478] }
I/WindowManager( 728): Setting rotation to 1, animFlags=0
看上面“cmp=com.estrongs.android.pop”的部分就可以找到/前是包名/后面是类名-->这个是在default_workspace.xml里面需要用到的
launcher:packageName="com.android.browser"
launcher:className="com.android.browser.BrowserActivity"
如何将pdf类的文件放到桌面上
将自己制作的pdf帮助文档放置到桌面上使客人可以直接点击就浏览
String urlString = "/system/app/Nvsbl P4Dv2 English Manual.pdf";
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(urlString)),"application/pdf");
startActivity(intent);
finish();
解释下:
首先将pdf文档放到out/target/proct/sdkDemo/system/app下
将固定地址给出urlString,使用Intent
intent.setAction(android.content.Intent.ACTION_VIEW);启动View
intent.setDataAndType(Uri.fromFile(new File(urlString)),"application/pdf");
application/pdf可以指定别的格式包括音频,视频,图片等等但是没有试过有需要可以试试
注意:这个方法很不到如果只放置一些图片还可以但是如果放置文件比较大那么打包出来的
system.img文件会很大也就是占用本身的系统内存----->所以不推荐使用
发现PIN解锁界面出现5秒之后就会自动进入睡眠,之后将无法再次解锁。目前解决方法:
修改文件 frameworks\policies\base\phone\com\android\internal\policy\impl\KeyguardViewMediator.java
将如下这行:
protected static final int AWAKE_INTERVAL_DEFAULT_MS = 5000;
修改为:
protected static final int AWAKE_INTERVAL_DEFAULT_MS = 1000 * 60 * 5;

③ android开发设置屏蔽录制

项目开发中,为了用户信息的安全,会有禁止页面被截屏、录屏的需求。
这类资料,在网上有很多,一般都是通过设置Activity的Flag解决,如:

//禁止页面被截屏、录屏getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);

这种设置可解决一般的防截屏、录屏的需求。
如果页面中有弹出Popupwindow,在录屏视频中的效果是:

非Popupwindow区域为黑色
但Popupwindow区域仍然是可以看到的

如下面两张Gif图所示:

未设置FLAG_SECURE,录屏的效果,如下图(git图片中间的水印忽略):

设置了FLAG_SECURE之后,录屏的效果,如下图(git图片中间的水印忽略):

④ 如何把android-logo-mask.png从system.img提取出来

下载logo 然后通过RE管理器 Android手机默认的开机画面看的时间长了肯定会有点审美疲劳,能不能实现我们自定义修改Android手机的开机画面呢,这当然是可以的,谁叫我们用的是智能手机呢?下面来介绍一下如何在Android手机中修改开机画面的第二屏,这样你就可以天天更换你的Android开机画面了,下面我们介绍的这种方法是在不刷机的情况下进行,所以可以完全放心。 用任何一个软件(91助手. 安卓助手. 甚至手机自带的文件管理器)提取出手机里system/framework文件夹下的framework-res.apk文件。前提请将电脑改为显示文件后缀。把提取出来的framework-res.apk拷贝到电脑里, 直接修改后缀为framework-res.zip文件。用rar直接打开. 找到framework-res\assets\images下的andriod-logo-mask.png。修改此图片(修改此图片你需要借助一些图片处理软件来进行,比如Photoshop或者是Fireworks等都可以)高度宽度不改动。修改字就可以了字体镂空.,保存为png文件。修改完成后保存,拖回zip文件包中。替换原andriod-logo-mask.png文件即可。把framework-res.zip再改回framework-res.apk. 放到内存卡里. 用sufbs替换手机里的framework-res.apk(就是最开始提取出来的那个文件),就这样就完成了修改Android手机开机画面第二屏的图片,是不是很简单?

⑤ android 在view上的指定位置画了一个图片,怎么实现这个图片的拖拽

你先继承 VIEW . 然后重写以下函数 就可以实现拖拽的功能了.
至于要显示图片,你可以直接在 onDraw里面描绘出来就好

@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub

final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) getLayoutParams();
_xDelta = X - lParams.leftMargin;
_yDelta = Y - lParams.topMargin;
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) getLayoutParams();
layoutParams.leftMargin = X - _xDelta;
layoutParams.topMargin = Y - _yDelta;
//layoutParams.rightMargin = -250;
//layoutParams.bottomMargin = -250;
HanoiItem.this.setLayoutParams(layoutParams); //自己继承VIEW的this
break;
}
invalidate();
return true;
}

至于位置,你就可以直接new VIEW 之后直接 用 VIEW.set**实现的啊

⑥ android accessibilityservice 服务问题

利用Android辅助工具类AccessibilityService可以获取手机当前页面的信息,用户的操作事件等等.首先新建一个类继承AccessibilityService:[html] view plain

  • <spanstyle="font-family:TimesNewRoman;font-size:14px;">{

  • privatefinalStringTAG="MyAccessibilityService";

  • @Override

  • (AccessibilityEventevent){

  • inteventType=event.getEventType();

  • StringeventTypeName="";

  • switch(eventType){

  • caseAccessibilityEvent.TYPE_VIEW_CLICKED:

  • eventTypeName="TYPE_VIEW_CLICKED";

  • break;

  • caseAccessibilityEvent.TYPE_VIEW_FOCUSED:

  • eventTypeName="TYPE_VIEW_FOCUSED";

  • break;

  • caseAccessibilityEvent.TYPE_VIEW_LONG_CLICKED:

  • eventTypeName="TYPE_VIEW_LONG_CLICKED";

  • break;

  • caseAccessibilityEvent.TYPE_VIEW_SELECTED:

  • eventTypeName="TYPE_VIEW_SELECTED";

  • break;

  • caseAccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:

  • eventTypeName="TYPE_VIEW_TEXT_CHANGED";

  • break;

  • caseAccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:

  • eventTypeName="TYPE_WINDOW_STATE_CHANGED";

  • break;

  • caseAccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:

  • eventTypeName="TYPE_NOTIFICATION_STATE_CHANGED";

  • break;

  • caseAccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_END:

  • eventTypeName="TYPE_TOUCH_EXPLORATION_GESTURE_END";

  • break;

  • caseAccessibilityEvent.TYPE_ANNOUNCEMENT:

  • eventTypeName="TYPE_ANNOUNCEMENT";

  • break;

  • caseAccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START:

  • eventTypeName="TYPE_TOUCH_EXPLORATION_GESTURE_START";

  • break;

  • caseAccessibilityEvent.TYPE_VIEW_HOVER_ENTER:

  • eventTypeName="TYPE_VIEW_HOVER_ENTER";

  • break;

  • caseAccessibilityEvent.TYPE_VIEW_HOVER_EXIT:

  • eventTypeName="TYPE_VIEW_HOVER_EXIT";

  • break;

  • caseAccessibilityEvent.TYPE_VIEW_SCROLLED:

  • eventTypeName="TYPE_VIEW_SCROLLED";

  • break;

  • caseAccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED:

  • eventTypeName="TYPE_VIEW_TEXT_SELECTION_CHANGED";

  • break;

  • caseAccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:

  • eventTypeName="TYPE_WINDOW_CONTENT_CHANGED";

  • break;

  • }

  • Log.i(TAG,"eventType:"+eventType);

  • Log.i(TAG,"eventTypeName:"+eventTypeName);

  • }

  • @Override

  • publicvoidonInterrupt(){

  • //TODOAuto-generatedmethodstub

  • }

  • }</span>

  • 然后新建一个xml配置文件来配置我们的MyAccessibility类:
  • accessibilityservice.xml :

    [html] view plain

  • <spanstyle="font-family:TimesNewRoman;font-size:14px;"><?xmlversion="1.0"encoding="utf-8"?>

  • <accessibility-servicexmlns:android="http://schemas.android.com/apk/res/android"

  • android:accessibilityEventTypes="typeAllMask"

  • android:accessibilityFeedbackType="feedbackGeneric"

  • android:accessibilityFlags="flagDefault"

  • android:canRetrieveWindowContent="true"

  • android:description="@string/app_name"

  • android:settingsActivity="com.example.xxx.android.accessibility.ServiceSettingsActivity"/></span>

  • android:accessibilityEventTypes="typeAllMask",相应所有的事件,就是MyAccessibility类中swich中的那些事件.
  • android:accessibilityFeedbackType="feedbackGeneric",手机用什么方式将信息反馈给用户,语音震动等等,这里默认;

    android:canRetrieveWindowContent="true",允许获取手机页面中的信息

    android:settingsActivity中com.example.xxx是你的应用的包名

    然后将这个xml配置文件配置到项目中:

    [html] view plain

  • <spanstyle="font-family:TimesNewRoman;font-size:14px;"><service

  • android:name="com.example.xxx.MyAccessibilityService"

  • android:enabled="true"

  • android:exported="true"

  • android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">

  • <intent-filter>

  • <actionandroid:name="android.accessibilityservice.AccessibilityService"/>

  • </intent-filter>

  • <meta-data

  • android:name="android.accessibilityservice"

  • android:resource="@xml/accessibilityservice"/>

  • </service></span>

  • 然后在我们手机的设置中的辅助功能里,打开这个辅助服务就可以了.
  • 利用这个类我们可以获取当前手机页面的信息,包括控件ID,控件值;当前类的名称以及用户的一些操作和手机状态的变化. 所以利用这些可以做手机自动安装软件,模拟点击,手机自动滑屏等.

    public void onAccessibilityEvent(AccessibilityEvent event){}

    通过这个event我们可以得到:

    event.getEventType()-当前事件的类型; event.getClassName()-当前类的名称; event.getSource()-当前页面中的节点信息,等等.更详细信查看官方API

    遍历获取窗口中所有的节点信息也可以用这个方法:

    [html] view plain

  • <spanstyle="font-family:TimesNewRoman;font-size:14px;">publicvoidgetInfo(){

  • AccessibilityNodeInfoinfo=getRootInActiveWindow();

  • if(info!=null){

  • if(info.getChildCount()==0){

  • Log.i(TAG,"控件名称:"+info.getClassName());

  • Log.i(TAG,"控件中的值:"+info.getText());

  • Log.i(TAG,"控件的ID:"+info.getViewIdResourceName());

  • Log.i(TAG,"点击是否出现弹窗:"+info.canOpenPopup());

  • }else{

  • for(inti=0;i<info.getChildCount();i++){

  • if(info.getChild(i)!=null){

  • recycle(info.getChild(i));

  • }

  • }

  • }

  • }

  • }</span>

  • 不过这个方法对当前的SDK版本有一定的要求,需要API level19及以上.

⑦ 如何把android-logo-mask.png从system.img提取出来

1.这个是系统包里面的文件,你手机出现了什么意外停止,就表示手机系统不稳定了;
2.去你手机型号官网下载刷机包里面,寻找;

⑧ MotionEvent的ACTION_MASK属性什么意思

ACTION_MASK在Android中是应用于多点触摸操作,字面上的意思大概是动作掩码的意思吧。
在onTouchEvent(MotionEvent event)中,使用switch (event.getAction())可以处理ACTION_DOWN和ACTION_UP事件;使用switch (event.getAction() & MotionEvent.ACTION_MASK)就可以处理处理多点触摸的ACTION_POINTER_DOWN和ACTION_POINTER_UP事件。

⑨ Android 的void android.view.Window.setFlags(int flags, int mask) 的两个参数有啥意义

应该设置的值

应该被改变的设置值的位

这样如果setVisiability设置了其他值比如4564654是没效果的


使用这些位操作可以确定以前是是什么状态将要变成什么状态,便于控制进行正确的操作

例如从gone到invisible需要重新布局,从visiable到invisible就不需要布局只需要重绘


例如:Visiablity系统中:


如publicstaticfinalintGONE=0x00000008;

publicstaticfinalintVISIBLE=0x00000000;

VISIBILITY_MASK控制的标志位

不同的mask代表不用的功能,他们的位也是不同的

staticfinalintVISIBILITY_MASK=0x0000000C;=00000001100


拿View中setVisiability(Gone)为例假设旧的值是Visiable=0x00000000


@RemotableViewMethod

publicvoidsetVisibility(intvisibility){

setFlags(visibility,VISIBILITY_MASK);

if(mBGDrawable!=null)mBGDrawable.setVisible(visibility==VISIBLE,false);

}


old保存mViewFlags之前的值,


old和mViewFlags异或后得到一个新的changed凡是为1说明发送了变化,就需要View系统进行调整了!


在setFlag函数中

flags=0x0000000100

intold=mViewFlags;//旧的flag=0x00000000

mViewFlags=(mViewFlags&~mask)|(flags&mask);//新的flag

0x00000000&~(00000001100)|&00000001100=0x0000000100

intchanged=mViewFlags^old;=0x0000000100

if(changed==0){

return;//hey!没有变化!直接return!

}


flags&VISIBILITY_MASK=1

if((flags&VISIBILITY_MASK)==VISIBLE){//不执行显示操作


if((changed&GONE)!=0){//changed&GONE=1

needGlobalAttributesUpdate(false);

requestLayout();//重新布局


if(((mViewFlags&VISIBILITY_MASK)==GONE)){//成立开始清除view的cache重绘

if(hasFocus())clearFocus();

destroyDrawingCache();

if(mParentinstanceofView){

//GONEviewsnoopinvalidation,soinvalidatetheparent

((View)mParent).invalidate(true);

}

//

//

mPrivateFlags|=DRAWN;

}

if(mAttachInfo!=null){

mAttachInfo.mViewVisibilityChanged=true;

}

}

热点内容
传奇荣耀脚本 发布:2025-01-07 05:53:14 浏览:979
为什么安卓手机连接不了苹果耳机 发布:2025-01-07 05:37:49 浏览:75
c语言mfc 发布:2025-01-07 05:33:18 浏览:592
自己搭建邮件服务器ddns 发布:2025-01-07 05:19:29 浏览:205
光驱无法访问指定设备 发布:2025-01-07 05:17:19 浏览:104
如何删除人人网的访问记录 发布:2025-01-07 05:02:47 浏览:281
清华编译原理第2版答案pdf 发布:2025-01-07 04:48:03 浏览:936
pythonweb框架对比 发布:2025-01-07 04:48:00 浏览:606
交叉编译应用程序示例 发布:2025-01-07 04:47:59 浏览:649
华为t系列存储 发布:2025-01-07 04:36:40 浏览:909