提交 81de9607 编写于 作者: 门心叼龙's avatar 门心叼龙

code perfect

上级 fe0ae2f0
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MarkdownProjectSettings" wasCopied="true">
<PreviewSettings splitEditorLayout="SPLIT" splitEditorPreview="PREVIEW" useGrayscaleRendering="false" zoomFactor="1.0" maxImageWidth="0" showGitHubPageIfSynced="false" allowBrowsingInPreview="false" synchronizePreviewPosition="true" highlightPreviewType="NONE" highlightFadeOut="5" highlightOnTyping="true" synchronizeSourcePosition="true" verticallyAlignSourceAndPreviewSyncPosition="true" showSearchHighlightsInPreview="false" showSelectionInPreview="true" openRemoteLinks="true" replaceUnicodeEmoji="false" lastLayoutSetsDefault="false">
<PanelProvider>
<provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.panel" providerName="Default - Swing" />
</PanelProvider>
</PreviewSettings>
<ParserSettings gitHubSyntaxChange="false" emojiShortcuts="1" emojiImages="0">
<PegdownExtensions>
<option name="ABBREVIATIONS" value="false" />
<option name="ANCHORLINKS" value="true" />
<option name="ASIDE" value="false" />
<option name="ATXHEADERSPACE" value="true" />
<option name="AUTOLINKS" value="true" />
<option name="DEFINITIONS" value="false" />
<option name="DEFINITION_BREAK_DOUBLE_BLANK_LINE" value="false" />
<option name="FENCED_CODE_BLOCKS" value="true" />
<option name="FOOTNOTES" value="false" />
<option name="HARDWRAPS" value="false" />
<option name="HTML_DEEP_PARSER" value="false" />
<option name="INSERTED" value="false" />
<option name="QUOTES" value="false" />
<option name="RELAXEDHRULES" value="true" />
<option name="SMARTS" value="false" />
<option name="STRIKETHROUGH" value="true" />
<option name="SUBSCRIPT" value="false" />
<option name="SUPERSCRIPT" value="false" />
<option name="SUPPRESS_HTML_BLOCKS" value="false" />
<option name="SUPPRESS_INLINE_HTML" value="false" />
<option name="TABLES" value="true" />
<option name="TASKLISTITEMS" value="true" />
<option name="TOC" value="false" />
<option name="WIKILINKS" value="false" />
</PegdownExtensions>
<ParserOptions>
<option name="ADMONITION_EXT" value="false" />
<option name="ATTRIBUTES_EXT" value="false" />
<option name="COMMONMARK_LISTS" value="true" />
<option name="DUMMY" value="false" />
<option name="EMOJI_SHORTCUTS" value="true" />
<option name="ENUMERATED_REFERENCES_EXT" value="false" />
<option name="FLEXMARK_FRONT_MATTER" value="false" />
<option name="GFM_LOOSE_BLANK_LINE_AFTER_ITEM_PARA" value="false" />
<option name="GFM_TABLE_RENDERING" value="true" />
<option name="GITBOOK_URL_ENCODING" value="false" />
<option name="GITHUB_LISTS" value="false" />
<option name="GITHUB_WIKI_LINKS" value="false" />
<option name="GITLAB_EXT" value="false" />
<option name="GITLAB_MATH_EXT" value="false" />
<option name="GITLAB_MERMAID_EXT" value="false" />
<option name="HEADER_ID_NON_ASCII_TO_LOWERCASE" value="false" />
<option name="HEADER_ID_NO_DUPED_DASHES" value="false" />
<option name="JEKYLL_FRONT_MATTER" value="false" />
<option name="MACROS_EXT" value="false" />
<option name="NO_TEXT_ATTRIBUTES" value="false" />
<option name="PARSE_HTML_ANCHOR_ID" value="false" />
<option name="PLANTUML_FENCED_CODE" value="false" />
<option name="PUML_FENCED_CODE" value="false" />
<option name="SIM_TOC_BLANK_LINE_SPACER" value="true" />
</ParserOptions>
</ParserSettings>
<HtmlSettings headerTopEnabled="false" headerBottomEnabled="false" bodyTopEnabled="false" bodyBottomEnabled="false" embedUrlContent="false" addPageHeader="true" embedImages="false" embedHttpImages="false" imageUriSerials="false" addDocTypeHtml="true" noParaTags="false" plantUmlConversion="0" mathConversion="-1">
<GeneratorProvider>
<provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.generator" providerName="Default Swing HTML Generator" />
</GeneratorProvider>
<headerTop />
<headerBottom />
<bodyTop />
<bodyBottom />
</HtmlSettings>
<CssSettings previewScheme="UI_SCHEME" cssUri="" isCssUriEnabled="false" isCssUriSerial="true" isCssTextEnabled="false" isDynamicPageWidth="true">
<StylesheetProvider>
<provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.css" providerName="Default Swing Stylesheet" />
</StylesheetProvider>
<ScriptProviders />
<cssText />
<cssUriHistory />
</CssSettings>
<AnnotatorSettings targetHasSpaces="true" linkCaseMismatch="true" wikiCaseMismatch="true" wikiLinkHasDashes="true" notUnderWikiHome="true" targetNotWikiPageExt="true" notUnderSourceWikiHome="true" targetNameHasAnchor="true" targetPathHasAnchor="true" wikiLinkHasSlash="true" wikiLinkHasSubdir="true" wikiLinkHasOnlyAnchor="true" linkTargetsWikiHasExt="true" linkTargetsWikiHasBadExt="true" notUnderSameRepo="true" targetNotUnderVcs="false" linkNeedsExt="true" linkHasBadExt="true" linkTargetNeedsExt="true" linkTargetHasBadExt="true" wikiLinkNotInWiki="true" imageTargetNotInRaw="true" repoRelativeAcrossVcsRoots="true" multipleWikiTargetsMatch="true" unresolvedLinkReference="true" linkIsIgnored="true" anchorIsIgnored="true" anchorIsUnresolved="true" anchorLineReferenceIsUnresolved="true" anchorLineReferenceFormat="true" anchorHasDuplicates="true" abbreviationDuplicates="true" abbreviationNotUsed="true" attributeIdDuplicateDefinition="true" attributeIdNotUsed="true" footnoteDuplicateDefinition="true" footnoteUnresolved="true" footnoteDuplicates="true" footnoteNotUsed="true" macroDuplicateDefinition="true" macroUnresolved="true" macroDuplicates="true" macroNotUsed="true" referenceDuplicateDefinition="true" referenceUnresolved="true" referenceDuplicates="true" referenceNotUsed="true" referenceUnresolvedNumericId="true" enumRefDuplicateDefinition="true" enumRefUnresolved="true" enumRefDuplicates="true" enumRefNotUsed="true" enumRefLinkUnresolved="true" enumRefLinkDuplicates="true" simTocUpdateNeeded="true" simTocTitleSpaceNeeded="true" />
<HtmlExportSettings updateOnSave="false" parentDir="" targetDir="" cssDir="css" scriptDir="js" plainHtml="false" imageDir="" copyLinkedImages="false" imageUniquifyType="0" targetPathType="2" targetExt="" useTargetExt="false" noCssNoScripts="false" useElementStyleAttribute="false" linkToExportedHtml="true" exportOnSettingsChange="true" regenerateOnProjectOpen="false" linkFormatType="HTTP_ABSOLUTE" />
<LinkMapSettings>
<textMaps />
</LinkMapSettings>
</component>
</project>
\ No newline at end of file
......@@ -5,89 +5,6 @@
<configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" />
</configurations>
</component>
<component name="MarkdownProjectSettings" wasCopied="true">
<PreviewSettings splitEditorLayout="SPLIT" splitEditorPreview="PREVIEW" useGrayscaleRendering="false" zoomFactor="1.0" maxImageWidth="0" showGitHubPageIfSynced="false" allowBrowsingInPreview="false" synchronizePreviewPosition="true" highlightPreviewType="NONE" highlightFadeOut="5" highlightOnTyping="true" synchronizeSourcePosition="true" verticallyAlignSourceAndPreviewSyncPosition="true" showSearchHighlightsInPreview="false" showSelectionInPreview="true" openRemoteLinks="true" replaceUnicodeEmoji="false" lastLayoutSetsDefault="false">
<PanelProvider>
<provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.panel" providerName="Default - Swing" />
</PanelProvider>
</PreviewSettings>
<ParserSettings gitHubSyntaxChange="false" emojiShortcuts="1" emojiImages="0">
<PegdownExtensions>
<option name="ABBREVIATIONS" value="false" />
<option name="ANCHORLINKS" value="true" />
<option name="ASIDE" value="false" />
<option name="ATXHEADERSPACE" value="true" />
<option name="AUTOLINKS" value="true" />
<option name="DEFINITIONS" value="false" />
<option name="DEFINITION_BREAK_DOUBLE_BLANK_LINE" value="false" />
<option name="FENCED_CODE_BLOCKS" value="true" />
<option name="FOOTNOTES" value="false" />
<option name="HARDWRAPS" value="false" />
<option name="HTML_DEEP_PARSER" value="false" />
<option name="INSERTED" value="false" />
<option name="QUOTES" value="false" />
<option name="RELAXEDHRULES" value="true" />
<option name="SMARTS" value="false" />
<option name="STRIKETHROUGH" value="true" />
<option name="SUBSCRIPT" value="false" />
<option name="SUPERSCRIPT" value="false" />
<option name="SUPPRESS_HTML_BLOCKS" value="false" />
<option name="SUPPRESS_INLINE_HTML" value="false" />
<option name="TABLES" value="true" />
<option name="TASKLISTITEMS" value="true" />
<option name="TOC" value="false" />
<option name="WIKILINKS" value="false" />
</PegdownExtensions>
<ParserOptions>
<option name="ADMONITION_EXT" value="false" />
<option name="ATTRIBUTES_EXT" value="false" />
<option name="COMMONMARK_LISTS" value="true" />
<option name="DUMMY" value="false" />
<option name="EMOJI_SHORTCUTS" value="true" />
<option name="ENUMERATED_REFERENCES_EXT" value="false" />
<option name="FLEXMARK_FRONT_MATTER" value="false" />
<option name="GFM_LOOSE_BLANK_LINE_AFTER_ITEM_PARA" value="false" />
<option name="GFM_TABLE_RENDERING" value="true" />
<option name="GITBOOK_URL_ENCODING" value="false" />
<option name="GITHUB_LISTS" value="false" />
<option name="GITHUB_WIKI_LINKS" value="false" />
<option name="GITLAB_EXT" value="false" />
<option name="GITLAB_MATH_EXT" value="false" />
<option name="GITLAB_MERMAID_EXT" value="false" />
<option name="HEADER_ID_NON_ASCII_TO_LOWERCASE" value="false" />
<option name="HEADER_ID_NO_DUPED_DASHES" value="false" />
<option name="JEKYLL_FRONT_MATTER" value="false" />
<option name="MACROS_EXT" value="false" />
<option name="NO_TEXT_ATTRIBUTES" value="false" />
<option name="PARSE_HTML_ANCHOR_ID" value="false" />
<option name="PLANTUML_FENCED_CODE" value="false" />
<option name="PUML_FENCED_CODE" value="false" />
<option name="SIM_TOC_BLANK_LINE_SPACER" value="true" />
</ParserOptions>
</ParserSettings>
<HtmlSettings headerTopEnabled="false" headerBottomEnabled="false" bodyTopEnabled="false" bodyBottomEnabled="false" embedUrlContent="false" addPageHeader="true" embedImages="false" embedHttpImages="false" imageUriSerials="false" addDocTypeHtml="true" noParaTags="false" plantUmlConversion="0" mathConversion="-1">
<GeneratorProvider>
<provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.generator" providerName="Default Swing HTML Generator" />
</GeneratorProvider>
<headerTop />
<headerBottom />
<bodyTop />
<bodyBottom />
</HtmlSettings>
<CssSettings previewScheme="UI_SCHEME" cssUri="" isCssUriEnabled="false" isCssUriSerial="true" isCssTextEnabled="false" isDynamicPageWidth="true">
<StylesheetProvider>
<provider providerId="com.vladsch.idea.multimarkdown.editor.swing.html.css" providerName="Default Swing Stylesheet" />
</StylesheetProvider>
<ScriptProviders />
<cssText />
<cssUriHistory />
</CssSettings>
<AnnotatorSettings targetHasSpaces="true" linkCaseMismatch="true" wikiCaseMismatch="true" wikiLinkHasDashes="true" notUnderWikiHome="true" targetNotWikiPageExt="true" notUnderSourceWikiHome="true" targetNameHasAnchor="true" targetPathHasAnchor="true" wikiLinkHasSlash="true" wikiLinkHasSubdir="true" wikiLinkHasOnlyAnchor="true" linkTargetsWikiHasExt="true" linkTargetsWikiHasBadExt="true" notUnderSameRepo="true" targetNotUnderVcs="false" linkNeedsExt="true" linkHasBadExt="true" linkTargetNeedsExt="true" linkTargetHasBadExt="true" wikiLinkNotInWiki="true" imageTargetNotInRaw="true" repoRelativeAcrossVcsRoots="true" multipleWikiTargetsMatch="true" unresolvedLinkReference="true" linkIsIgnored="true" anchorIsIgnored="true" anchorIsUnresolved="true" anchorLineReferenceIsUnresolved="true" anchorLineReferenceFormat="true" anchorHasDuplicates="true" abbreviationDuplicates="true" abbreviationNotUsed="true" attributeIdDuplicateDefinition="true" attributeIdNotUsed="true" footnoteDuplicateDefinition="true" footnoteUnresolved="true" footnoteDuplicates="true" footnoteNotUsed="true" macroDuplicateDefinition="true" macroUnresolved="true" macroDuplicates="true" macroNotUsed="true" referenceDuplicateDefinition="true" referenceUnresolved="true" referenceDuplicates="true" referenceNotUsed="true" referenceUnresolvedNumericId="true" enumRefDuplicateDefinition="true" enumRefUnresolved="true" enumRefDuplicates="true" enumRefNotUsed="true" enumRefLinkUnresolved="true" enumRefLinkDuplicates="true" simTocUpdateNeeded="true" simTocTitleSpaceNeeded="true" />
<HtmlExportSettings updateOnSave="false" parentDir="" targetDir="" cssDir="css" scriptDir="js" plainHtml="false" imageDir="" copyLinkedImages="false" imageUniquifyType="0" targetPathType="2" targetExt="" useTargetExt="false" noCssNoScripts="false" useElementStyleAttribute="false" linkToExportedHtml="true" exportOnSettingsChange="true" regenerateOnProjectOpen="false" linkFormatType="HTTP_ABSOLUTE" />
<LinkMapSettings>
<textMaps />
</LinkMapSettings>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
......
......@@ -12,7 +12,7 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".AsyncTaskActivity"></activity>
<activity android:name=".AsyncTaskActivity" ></activity>
<activity android:name=".bitmap.test.TestCacheActivity"></activity>
<activity android:name=".TestAsyncTaskActivity" />
......@@ -28,7 +28,7 @@
android:enabled="true"
android:exported="true" />
<activity android:name=".TestServiceActivity" android:hardwareAccelerated="true"/>
<activity android:name=".TestServiceActivity" android:hardwareAccelerated="true" android:screenOrientation="portrait" android:taskAffinity="com.test.aaa" />
<activity android:name=".WindowManagerActivity" />
<activity android:name=".test.view1.SticyLayout2Activity" />
<activity android:name=".test.view1.ExpandableListView2Activity" />
......
......@@ -4,6 +4,7 @@ import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import com.mxdl.customview.thread.MyAsyncTask;
......@@ -17,11 +18,11 @@ public class AsyncTaskActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_async_task);
AsyncTask<String, Integer, String> execute = new MyAsyncTask().execute("www.baidu.com");
new MyAsyncTask().execute("www.baidu.com1");
new MyAsyncTask().execute("www.baidu.com2");
new MyAsyncTask().execute("www.baidu.com3");
new MyAsyncTask().execute("www.baidu.com4");
// AsyncTask<String, Integer, String> execute = new MyAsyncTask().execute("www.baidu.com");
// new MyAsyncTask().execute("www.baidu.com1");
// new MyAsyncTask().execute("www.baidu.com2");
// new MyAsyncTask().execute("www.baidu.com3");
// new MyAsyncTask().execute("www.baidu.com4");
// ExecutorService executorService = Executors.newFixedThreadPool(3);
// for(int i = 0; i < 10; i++){
......@@ -33,9 +34,13 @@ public class AsyncTaskActivity extends AppCompatActivity {
// }
// });
// }
test((String)null);
test((String) null);
}
public void test(String str){
public void test(String str) {
}
}
### 1.什么是Activity启动的标准模式?都会经历那些生命周期的函数?
标准模式是指用户和Activity之间正常交互所所经历的生命周期
* onCreate:第一次被被打开的时候
* onStart:被看见的时候
* onRestart:当再次被打开的时候
* onResume:当获取用户焦点的时候
* onPause:失去用户焦点的时候
* onStop:当被完全遮挡的时候
* onDestroy:当被销毁的时候
### 2.什么是Activity启动的异常模式?都会经历那些生命周期?
当内存不够用或系统配置发生变化的时候Activity会销毁并重启,系统配置发生变化主要是指手机横竖屏发生变化,软件盘的隐藏等情况
* 1.onSaveInstanceState
* 2.onStop
* 3.onDestroy
* 4.onCreate
* 5.onStart
* 6.onRestoreInstanceState
### 3.怎么指定Activity在横竖屏切换的时候不敏感?
通过在清单文件里面给Activity设置configChanges属性即可,具体配置如下:android:configChanges="orientation|keyboardHidden|screenSize"
默认情况下Activity在横竖屏切换时会重启,配置了此属性Activity会横竖屏切换,但是不会不会重启
### 4.怎么为Activity指定为横屏或竖屏?
给Activity配置android:screenOrientation="portrait"属性即可
### 5.Activity启动都有哪些模式?在清单文件里面配置和在代码里面指定到底有何不同?
standard:标准模式
singleTop:栈顶复用模式
singleTask:栈内复用模式
singleInstance:单例模式
其中标准模式和栈顶复用模、单例模式比较好理解,
在清单文件里面不能配置clearTop属性,在代码里面不能指定singleInstance模式
### 6.前台任务栈有Activity:AB,后台任务栈有Activity:CD,且CD的启动模式都是singleTask,现在启动Activity D,此时后退任务栈的的顺序是什么?
### 7.怎么给Activity指定单独的任务栈?怎么查看任务栈的?
通过taskAffinity属性可以直接指定它所在任务栈,但是该属性必须要和singleTask模式配合使用才能起作用,否则配置无效
* adb shell dumpsys activity 查看任务栈
### 8.Activity的启动意图都有哪些?
* 显示意图:明确指定要启动的组件的类名和包名
* 隐式意图:没有明确指定要启动组件的类名和包名
### 9.隐式意图需要配置目标组件的InterFilter,这个过滤器都有哪些信息?配置都有哪些规则
* action:请求目标组建所要完成的动作,可以配置多个
* category:请求目标组件所附加的类别信息,可以配置多个
* data:完成这个的动作许要的数据,包括两部分:URI和MimeType可以配置多个
* URI的标准结构:<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
配置完毕通过Intent打开目标组件的时候,必须要配置一个Action且能匹配上,Category可以不用配置,如果配了则必须要匹配上,否则也会打开失败
Intent会默认添加上android.intent.category.default这个Category,URI默认的scheme为content或file
### 1.在Android开发中怎么使用多进程?
只能在AndroidMinifest.xml中给四大组件通过配置android:progress属性来指定它所在的进程,也就是说无法给某一个线程或者具体的实体类来指定它所在的进程
* 方式1:“:remote”
* 方式2:“com.android.test”
有冒号的表示这是当前应用的私有进程,其他应用的组件比可能和她运行在同一个进程中,不带冒号的表示他是一个全局进程它能和其他应用的组件跑在同一个进程中,可以通过adb shell ps来查看进程
### 2.同一个应用中开启了多进程会造成哪些问题?
* 静态成员失效
* 单例失效
* 线程同步机制失效
* SharedPreference的可靠性会降低
* Application会多次被创建
### 2.怎么通过Serializable来序列化和反序列化一个对象?
```
//序列化过程
User user = new User(0,"jake",true);
ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("cache.txt"));
out.writeObject(user);
out.close();
//反序列化过程
ObjectInputStream in = new ObjectInputStream( new FileInputStream("cache.txt"));
User newUser = (User) in.readObject();
in.close();
```
### 3.Parcelable和Serializable他们的作用是什么?有什么区别?
通过这两个接口可以完成对象的序列化,因为只有通过序列化的对象才可以通过Intent和Binder实现对象的跨进程传输
* Serializable是磁盘序列化,java提供的,使用方便,但是开销大
* Parcelable是内存序列化,Android提供的,使用复杂,但是效率很高
### 4.什么是Binder?什么是Binder的死亡代理?
Binder它是Android给我们提供的跨进程通信手段,可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder
Binder的死亡代理是指,当服务端由于意外终止运行,此时客户端可以通过死亡代理得到通知而删除之前的代理,对服务进行重新的绑定
```
private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
@Override
public void binderDied() {
if (mBookManager == null) {
return;
}
mBookManager.asBinder().unlinkToDeath(mDeathRecipient, 0);
mBookManager = null;
// TODO:这里重新绑定远程Service
}
};
mService=IMessageBoxManager.Stub.asInterface(binder);
binder.linkToDeath(mDeathRecipient,0);
```
### 5.什么是AIDL?
AIDL的全称是Android Interface Description Language,即Android接口描述语言,它是Android给我们提供的一个工具,通过他可以很方便的生成IPC代码,实现跨进程通信。
### 6.Android中的跨进程通信方式都有哪些?
* 使用Bundle
* 使用共享文件
* 使用Messenger
* 使用AIDL
* 使用ContentProvider
* 使用Socket
### 7.什么Binder连接池?
Binder连接池就是将多个Binder服务通过一个接口服务来提供,避免了创建多个Service的问题
### 1.什么是View?什么是ViewGroup?他们关系如何?
View表示一个控件,它具有用户界面显示功能,不管是简单的TextView、Button,还是复杂的LinearLayout、ListView
他们共同的基类都是View,ViewGroup表示一个控件组,ViewGroup继承于View,这就意味着View不但可以表示一个控件,也可以表示多个控件组成的控件组
### 2.View都有哪些表示位置的参数?
* left:左上角的横坐标
* top:左上角的纵坐标
* right:右下角的横坐标
* bottom:右下角的纵坐标
###### 3.这些坐标位置都是相对于父容器而言的,是一种相对坐标,都不可变表示原始位置
* width = right - left
* height = bottom - top
* x:也表示左上角的横坐标,可变的
* y: 也表示左上角的纵坐标,可变的
* translationX:View左上角相对于父容器的在x轴上的偏移距离
* translationY:View左上角相对于父容器的在y轴上的偏移距离
* x = left + translationX
* y = top + translationY
### 4.MotionEvent是什么?
MotionEvent表示手指触摸屏幕所产生的一系列事件。
* ACION_DOWN:表示手指触摸屏幕的一瞬间
* ACTION_UP:表示手指离开屏幕的一瞬间
* ACTION_MOVE: 表示手指在屏幕上的移动
我们可以通过MotionEvent获取手指在屏幕上触摸的位置的坐标
* getX(): 表示相对于View左上角的横坐标
* getY(): 表示相对于View左上角的纵坐标
* getRawX(): 表示相对于屏幕左上角的横坐标
* getRawY(): 表示相对于屏幕左上角的纵坐标
### 5.TouchSlop表示什么?
TouchSlop它是一个常量,表示系统所能识别的最小滑动距离,它和设备有关,不同的设备可能这个值大小可能不一样
* ViewConfiguration.get(getContext()).getScaledTouchSlop()。
### 6.VelocityTracker是什么?
VelocityTracker表示手指在滑动过程中的速度,包括水平方向的速度和垂直方向的速度
```
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();
velocityTracker.clear();
velocityTracker.recycle();
```
### 7.GestureDetector是什么?
GestureDetector是一个手势检测器,用来识别用户的手势行为,如单击、双击、长按、快速滑动、拖动等
```
GestureDetector mGestureDetector = new GestureDetector(this);
//解决长按屏幕后无法拖动的现象
mGestureDetector.setIsLongpressEnabled(false);
boolean consume = mGestureDetector.onTouchEvent(event);
return consume;
```
### 7.Scroller是什么?它的工作原理?
通过Scroller可以实现View的平滑移动,Scroller本身并不能实现平滑移动,它必须借助View的computeScroll方法才能实现平滑移动
它的标准模板代码如下:
```
Scroller scroller = new Scroller(mContext);
// 缓慢滚动到指定位置
private void smoothScrollTo(int destX,int destY) {
int scrollX = getScrollX();
int delta = destX -scrollX;
// 1000ms内滑向destX,效果就是慢慢滑动
mScroller.startScroll(scrollX,0,delta,0,1000);
invalidate();
}
@Override public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
postInvalidate();
}
}
```
### 8.View的scrollTo和scrollBy有何区别?
* scrollTo是绝对移动
* scrollBy是相对移动
scrollBy内部调用了scrollTo
### 9.View的mScrollX和mScrollY分别表示什么,正负何如?
* mScrollX:表示View的左边缘和View内容左边缘在水平方向上的距离
* mScrollY: 表示View的上边缘和View内容的上边缘在垂直方向上的距离
* mScrollX+:表示View的左边缘在View内容左边缘的右边,反之亦然
* mScrollY+:表示View的上边缘在View内容上边缘的下边,反之亦然
### 10.实现View的移动都有哪些方法?他们的区别是什么?
* scrollTo/scrollBy: 操作简单,适合View内容的移动
* 动画:操作简单,可以实现复杂的移动,移动是View本身
```
ObjectAnimator.ofFloat(targetView,"translationX",0,100).setDuration(100).start();
//==================================
final int startX = 0;
final int deltaX = 100;
ValueAnimator animator = ValueAnimator.ofInt(0,1).setDuration(1000);
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override public void onAnimationUpdate(ValueAnimator animator) {
float fraction = animator.getAnimatedFraction();
mButton1.scrollTo(startX + (int) (deltaX * fraction),0);
}
});
animator.start();
```
* 改变布局参数:操作复杂
```
MarginLayoutParams params = (MarginLayoutParams)mButton1.getLayoutParams();
params.width += 100; params.leftMargin += 100;
mButton1.requestLayout();
//或者mButton1.setLayoutParams(params);
```
### 11.简述View事件分发流程?
### 12.View的滑动冲突都有哪些场景?怎么解决?
* 内部滑动和外部滑动方向一致
* 内部滑动和外部滑动方向不一致
* 上述两种情况的嵌套
* 外部拦截法
* 内部拦截法
### ViewRoot的作用是什么?
ViewRoot对应的是ViewRootImpl,它是链接WindowManager和DecorView的纽带,View绘制的三大流程都是通过ViewRoot来完成的。
### MeasureSpec是什么?
MeasureSpec包含了父控件对子控件的布局要求,他是一个一个32位整形数字,前两位表示测试模式,都30为表示
测量大小
* UNSPECIFIED:未定义
* EXACTLY: 精确的
* AT_MOST: 至多的
### 简述View绘制的三大流程?
* onMeasure:确定控件的大小
* onLayout:确定控件的位置
* onDraw:绘制控件
### 简述View的draw的过程?
* 1.绘制背景
* 2.如果必要锁定画布
* 3.绘制View的内容
* 4.绘制子View
* 5.如果必要恢复画布
* 6.绘制View的装饰
### 自定义View的分类?
* 1.继承View
* 2.组合View
* 3.自绘View
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册