maskandroid
① 如何修改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類:
<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中的那些事件.
<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>
- 然後在我們手機的設置中的輔助功能里,打開這個輔助服務就可以了.
<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及以上.
accessibilityservice.xml :
[html] view plain
android:accessibilityFeedbackType="feedbackGeneric",手機用什麼方式將信息反饋給用戶,語音震動等等,這里默認;
android:canRetrieveWindowContent="true",允許獲取手機頁面中的信息
android:settingsActivity中com.example.xxx是你的應用的包名
然後將這個xml配置文件配置到項目中:
[html] view plain
利用這個類我們可以獲取當前手機頁面的信息,包括控制項ID,控制項值;當前類的名稱以及用戶的一些操作和手機狀態的變化. 所以利用這些可以做手機自動安裝軟體,模擬點擊,手機自動滑屏等.
public void onAccessibilityEvent(AccessibilityEvent event){}
通過這個event我們可以得到:
event.getEventType()-當前事件的類型; event.getClassName()-當前類的名稱; event.getSource()-當前頁面中的節點信息,等等.更詳細信查看官方API
遍歷獲取窗口中所有的節點信息也可以用這個方法:
[html] view plain
⑦ 如何把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;
}
}