Android系统开发遇到问题总结
<svg xmlns="http://www.w3.org/2000/svg" style="display: none"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></path>
</svg>
<p></p>
<div class="toc">
<h3>Android系统框架问题汇总</h3>
<ul><li>概述</li><li><ul><li>SystemUI 相关。</li><li><ul><li>keyguard</li><li>状态栏和导航栏颜色的 Tint</li></ul>
</li><li>WindowManagerService</li><li>通过 adb 控制应用全屏和状态栏导航栏</li><li>查看Android 系统环境变量</li><li>插入链接与图片</li><li>如何插入一段漂亮的代码片</li><li>生成一个适合你的列表</li><li>创建一个表格</li><li><ul><li>设定内容居中、居左、居右</li><li>SmartyPants</li></ul>
</li><li>创建一个自定义列表</li><li>如何创建一个注脚</li><li>注释也是必不可少的</li><li>KaTeX数学公式</li><li>新的甘特图功能,丰富你的文章</li><li>UML 图表</li><li>FLowchart流程图</li><li>导出与导入</li><li><ul><li>导出</li><li>导入</li></ul>
</li></ul>
</li></ul>
</div>
<p></p>
<h1>概述</h1>
<p>这里的文章主要是介绍关于我在开发和debug一些Android系统框架代码中遇到的问题,有不妥之处大家一起讨论。<br> 开发环境:Android O、P 、Q。<br> 开发工具:AndroidStudio、codeblock。</p>
<h2>SystemUI 相关。</h2>
<h3>keyguard</h3>
<ol><li>关于判断是否锁屏的方法isKeyguardLocked当设置密码锁屏时才会返回true。</li></ol>
<pre><code class="prism language-java"><span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">isKeyguardLocked</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token function">keyguardOn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<ol start="2"><li>关于锁屏界面显示应用或三方窗口需要添加FLAG_SHOW_WHEN_LOCKED标签。</li></ol>
<pre><code class="prism language-java"> <span class="token comment">/** Window flag: special flag to let windows be shown when the screen
* is locked. This will let application windows take precedence over
* key guard or any other lock screens. Can be used with
* {@link #FLAG_KEEP_SCREEN_ON} to turn screen on and display windows
* directly before showing the key guard window.Can be used with
* {@link #FLAG_DISMISS_KEYGUARD} to automatically fully dismisss
* non-secure keyguards.This flag only applies to the top-most
* full-screen window.
* @deprecated Use {@link android.R.attr#showWhenLocked} or
* {@link android.app.Activity#setShowWhenLocked(boolean)} instead to prevent an
* unintentional double life-cycle event.
*/</span>
<span class="token annotation punctuation">@Deprecated</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> FLAG_SHOW_WHEN_LOCKED <span class="token operator">=</span> <span class="token number">0x00080000</span><span class="token punctuation">;</span>
</code></pre>
<ol start="3"><li>keyguard上控制导航栏三个按钮Recent、HOME、back。<br> Android O 上是默认不显示 Recent键</li></ol>
<pre><code class="prism language-java"><span class="token comment">// SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java</span>
<span class="token keyword">void</span> <span class="token function">adjustStatusBarLocked</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>mStatusBarManager <span class="token operator">==</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span>
mStatusBarManager <span class="token operator">=</span> <span class="token punctuation">(</span>StatusBarManager<span class="token punctuation">)</span>
mContext<span class="token punctuation">.</span><span class="token function">getSystemService</span><span class="token punctuation">(</span>Context<span class="token punctuation">.</span>STATUS_BAR_SERVICE<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>mStatusBarManager <span class="token operator">==</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span>
Log<span class="token punctuation">.</span><span class="token function">w</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> <span class="token string">"Could not get status bar manager"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token comment">// Disable aspects of the system/status/navigation bars that must not be re-enabled by</span>
<span class="token comment">// windows that appear on top, ever</span>
<span class="token keyword">int</span> flags <span class="token operator">=</span> StatusBarManager<span class="token punctuation">.</span>DISABLE_NONE<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>mShowing<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// Permanently disable components not available when keyguard is enabled</span>
<span class="token comment">// (like recents). Temporary enable/disable (e.g. the "back" button) are</span>
<span class="token comment">// done in KeyguardHostView.</span>
flags <span class="token operator">|=</span> StatusBarManager<span class="token punctuation">.</span>DISABLE_RECENT<span class="token punctuation">;</span><span class="token comment">//默认屏蔽Recent键。</span>
<span class="token keyword">boolean</span> isDisableSearch <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
<span class="token comment">// if (mLockScreenMediatorExt != null) {</span>
<span class="token comment">// isDisableSearch = mLockScreenMediatorExt.disableSearch(mContext);</span>
<span class="token comment">// }</span>
<span class="token comment">/// M: Disable search view for alarm boot</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>PowerOffAlarmManager<span class="token punctuation">.</span><span class="token function">isAlarmBoot</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">||</span> isDisableSearch<span class="token punctuation">)</span> <span class="token punctuation">{</span>
flags <span class="token operator">|=</span> StatusBarManager<span class="token punctuation">.</span>DISABLE_SEARCH<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isShowingAndNotOccluded</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
flags <span class="token operator">|=</span> StatusBarManager<span class="token punctuation">.</span>DISABLE_HOME<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
mStatusBarManager<span class="token punctuation">.</span><span class="token function">disable</span><span class="token punctuation">(</span>flags<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>Android P 上是默认打开<br> // SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java</p>
<pre><code class="prism language-java"> <span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">adjustStatusBarLocked</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token function">adjustStatusBarLocked</span><span class="token punctuation">(</span><span class="token boolean">false</span> <span class="token comment">/* forceHideHomeRecentsButtons */</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">adjustStatusBarLocked</span><span class="token punctuation">(</span><span class="token keyword">boolean</span> forceHideHomeRecentsButtons<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token keyword">int</span> flags <span class="token operator">=</span> StatusBarManager<span class="token punctuation">.</span>DISABLE_NONE<span class="token punctuation">;</span>
<span class="token comment">/// M: Disable search view for alarm boot</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>mShowing <span class="token operator">&&</span> PowerOffAlarmManager<span class="token punctuation">.</span><span class="token function">isAlarmBoot</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
flags <span class="token operator">|=</span> StatusBarManager<span class="token punctuation">.</span>DISABLE_SEARCH<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>forceHideHomeRecentsButtons <span class="token operator">||</span> <span class="token function">isShowingAndNotOccluded</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
flags <span class="token operator">|=</span> StatusBarManager<span class="token punctuation">.</span>DISABLE_HOME <span class="token operator">|</span> StatusBarManager<span class="token punctuation">.</span>DISABLE_RECENT<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
mStatusBarManager<span class="token punctuation">.</span><span class="token function">disable</span><span class="token punctuation">(</span>flags<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p>Android Q 上与P基本相同,但没有disable_search.</p>
<pre><code class="prism language-java"><span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">adjustStatusBarLocked</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token number">1907</span> <span class="token function">adjustStatusBarLocked</span><span class="token punctuation">(</span><span class="token boolean">false</span> <span class="token comment">/* forceHideHomeRecentsButtons */</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token number">1908</span> <span class="token punctuation">}</span>
<span class="token number">1909</span>
<span class="token number">1910</span> <span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">adjustStatusBarLocked</span><span class="token punctuation">(</span><span class="token keyword">boolean</span> forceHideHomeRecentsButtons<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token number">1911</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>mStatusBarManager <span class="token operator">==</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token number">1912</span> mStatusBarManager <span class="token operator">=</span> <span class="token punctuation">(</span>StatusBarManager<span class="token punctuation">)</span>
<span class="token number">1913</span> mContext<span class="token punctuation">.</span><span class="token function">getSystemService</span><span class="token punctuation">(</span>Context<span class="token punctuation">.</span>STATUS_BAR_SERVICE<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token number">1914</span> <span class="token punctuation">}</span>
<span class="token number">1915</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>mStatusBarManager <span class="token operator">==</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token number">1916</span> Log<span class="token punctuation">.</span><span class="token function">w</span><span class="token punctuation">(</span>TAG<span class="token punctuation">,</span> <span class="token string">"Could not get status bar manager"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token number">1917</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token number">1918</span> <span class="token comment">// Disable aspects of the system/status/navigation bars that must not be re-enabled by</span>
<span class="token number">1919</span> <span class="token comment">// windows that appear on top, ever</span>
<span class="token number">1920</span> <span class="token keyword">int</span> flags <span class="token operator">=</span> StatusBarManager<span class="token punctuation">.</span>DISABLE_NONE<span class="token punctuation">;</span>
<span class="token number">1921</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>forceHideHomeRecentsButtons <span class="token operator">||</span> <span class="token function">isShowingAndNotOccluded</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token number">1922</span> flags <span class="token operator">|=</span> StatusBarManager<span class="token punctuation">.</span>DISABLE_HOME <span class="token operator">|</span> StatusBarManager<span class="token punctuation">.</span>DISABLE_RECENT<span class="token punctuation">;</span>
<span class="token number">1923</span> <span class="token punctuation">}</span>
<span class="token number">1931</span> mStatusBarManager<span class="token punctuation">.</span><span class="token function">disable</span><span class="token punctuation">(</span>flags<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token number">1932</span> <span class="token punctuation">}</span>
<span class="token number">1933</span> <span class="token punctuation">}</span>
</code></pre>
<h3>状态栏和导航栏颜色的 Tint</h3>
<p>系统的systemui的颜色排除我们自己设定颜色外,系统是在窗口计算的过程中回去更新systemuiflag,主要在 <strong>PhoneWindowManager</strong>这个类中的 <kbd>updateSystemUiVisibilityLw(…)</kbd> 这其中还有flag的计算。</p>
<h2>WindowManagerService</h2>
<ol><li> <p>当你的窗口使用了toast这种东西,窗口生命周期会被toast延长,在窗口计算的过程中 windowstate 会在toast消失后消失。</p> </li><li> <p>窗口的flag <strong>public static final int FLAG_SLIPPERY = 0x20000000;</strong> 是允许move事件传递给隔壁老王窗口。</p> </li></ol>
<pre><code class="prism language-cpp"><span class="token comment">// frameworks/native/services/inputflinger/InputDispatcher.cpp</span>
<span class="token keyword">int32_t</span> InputDispatcher<span class="token operator">::</span><span class="token function">findTouchedWindowTargetsLocked</span><span class="token punctuation">(</span>nsecs_t currentTime<span class="token punctuation">,</span>
<span class="token keyword">const</span> MotionEntry<span class="token operator">*</span> entry<span class="token punctuation">,</span> Vector<span class="token operator"><</span>InputTarget<span class="token operator">></span><span class="token operator">&</span> inputTargets<span class="token punctuation">,</span> nsecs_t<span class="token operator">*</span> nextWakeupTime<span class="token punctuation">,</span>
<span class="token keyword">bool</span><span class="token operator">*</span> outConflictingPointerActions<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">enum</span> InjectionPermission <span class="token punctuation">{</span>
INJECTION_PERMISSION_UNKNOWN<span class="token punctuation">,</span>
INJECTION_PERMISSION_GRANTED<span class="token punctuation">,</span>
INJECTION_PERMISSION_DENIED
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
<span class="token comment">// Check whether touches should slip outside of the current foreground window.</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>maskedAction <span class="token operator">==</span> AMOTION_EVENT_ACTION_MOVE<span class="token comment">//一定是move事件。</span>
<span class="token operator">&&</span> entry<span class="token operator">-</span><span class="token operator">></span>pointerCount <span class="token operator">==</span> <span class="token number">1</span>
<span class="token operator">&&</span> mTempTouchState<span class="token punctuation">.</span><span class="token function">isSlippery</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//判断符合条件</span>
<span class="token comment">//得到坐标值</span>
<span class="token keyword">int32_t</span> x <span class="token operator">=</span> <span class="token keyword">int32_t</span><span class="token punctuation">(</span>entry<span class="token operator">-</span><span class="token operator">></span>pointerCoords<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getAxisValue</span><span class="token punctuation">(</span>AMOTION_EVENT_AXIS_X<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">int32_t</span> y <span class="token operator">=</span> <span class="token keyword">int32_t</span><span class="token punctuation">(</span>entry<span class="token operator">-</span><span class="token operator">></span>pointerCoords<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getAxisValue</span><span class="token punctuation">(</span>AMOTION_EVENT_AXIS_Y<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//分别找到原配和小三</span>
sp<span class="token operator"><</span>InputWindowHandle<span class="token operator">></span> oldTouchedWindowHandle <span class="token operator">=</span>
mTempTouchState<span class="token punctuation">.</span><span class="token function">getFirstForegroundWindowHandle</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
sp<span class="token operator"><</span>InputWindowHandle<span class="token operator">></span> newTouchedWindowHandle <span class="token operator">=</span>
<span class="token function">findTouchedWindowAtLocked</span><span class="token punctuation">(</span>displayId<span class="token punctuation">,</span> x<span class="token punctuation">,</span> y<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>oldTouchedWindowHandle <span class="token operator">!=</span> newTouchedWindowHandle
<span class="token operator">&&</span> newTouchedWindowHandle <span class="token operator">!=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token macro property">#<span class="token directive keyword">if</span> DEBUG_FOCUS</span>
<span class="token function">ALOGD</span><span class="token punctuation">(</span><span class="token string">"Touch is slipping out of window %s into window %s."</span><span class="token punctuation">,</span>
oldTouchedWindowHandle<span class="token operator">-</span><span class="token operator">></span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">c_str</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
newTouchedWindowHandle<span class="token operator">-</span><span class="token operator">></span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">c_str</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token macro property">#<span class="token directive keyword">endif</span></span>
<span class="token comment">// Make a slippery exit from the old window.休了原配</span>
mTempTouchState<span class="token punctuation">.</span><span class="token function">addOrUpdateWindow</span><span class="token punctuation">(</span>oldTouchedWindowHandle<span class="token punctuation">,</span>
InputTarget<span class="token operator">::</span>FLAG_DISPATCH_AS_SLIPPERY_EXIT<span class="token punctuation">,</span> <span class="token function">BitSet32</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Make a slippery entrance into the new window.//小三进门考核</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>newTouchedWindowHandle<span class="token operator">-</span><span class="token operator">></span><span class="token function">getInfo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">supportsSplitTouch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
isSplit <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int32_t</span> targetFlags <span class="token operator">=</span> InputTarget<span class="token operator">::</span>FLAG_FOREGROUND
<span class="token operator">|</span> InputTarget<span class="token operator">::</span>FLAG_DISPATCH_AS_SLIPPERY_ENTER<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>isSplit<span class="token punctuation">)</span> <span class="token punctuation">{</span>
targetFlags <span class="token operator">|</span><span class="token operator">=</span> InputTarget<span class="token operator">::</span>FLAG_SPLIT<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">isWindowObscuredAtPointLocked</span><span class="token punctuation">(</span>newTouchedWindowHandle<span class="token punctuation">,</span> x<span class="token punctuation">,</span> y<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
targetFlags <span class="token operator">|</span><span class="token operator">=</span> InputTarget<span class="token operator">::</span>FLAG_WINDOW_IS_OBSCURED<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
BitSet32 pointerIds<span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>isSplit<span class="token punctuation">)</span> <span class="token punctuation">{</span>
pointerIds<span class="token punctuation">.</span><span class="token function">markBit</span><span class="token punctuation">(</span>entry<span class="token operator">-</span><span class="token operator">></span>pointerProperties<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">//小三进门</span>
mTempTouchState<span class="token punctuation">.</span><span class="token function">addOrUpdateWindow</span><span class="token punctuation">(</span>newTouchedWindowHandle<span class="token punctuation">,</span> targetFlags<span class="token punctuation">,</span> pointerIds<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
</code></pre>
<ol start="3"><li>窗口的flag FLAG_NOT_TOUCHABLE、FLAG_NOT_FOCUSABLE、FLAG_NOT_TOUCH_MODAL 为什么not_touchable的窗口不接收事件,因为底层根本就不发给他。</li></ol>
<pre><code class="prism language-c++">sp<InputWindowHandle> InputDispatcher::findTouchedWindowAtLocked(int32_t displayId,
int32_t x, int32_t y) {
// Traverse windows from front to back to find touched window.
size_t numWindows = mWindowHandles.size();
for (size_t i = 0; i < numWindows; i++) {//遍历window集合
sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
const InputWindowInfo* windowInfo = windowHandle->getInfo();
if (windowInfo->displayId == displayId) {
int32_t flags = windowInfo->layoutParamsFlags;
if (windowInfo->visible) {//不可见不参与
if (!(flags & InputWindowInfo::FLAG_NOT_TOUCHABLE)) {//没有nottouchable属性
//如果是isTouchModal不管落没落在窗口上都给窗口,否则必须落在窗口上,不然就给下一层窗口。
bool isTouchModal = (flags & (InputWindowInfo::FLAG_NOT_FOCUSABLE
| InputWindowInfo::FLAG_NOT_TOUCH_MODAL)) == 0;
if (isTouchModal || windowInfo->touchableRegionContainsPoint(x, y)) {
// Found window.
return windowHandle;
}
}
}
}
}
return NULL;
}
</code></pre>
<ol start="4"><li>自由控制窗口可点击区域</li></ol>
<blockquote>
<p>结合not_focusable和not_touch_modal我们可以自由定制窗口某个区域可点击,其他区域传下去。<br> 英文可自己翻译</p>
</blockquote>
<pre><code class="prism language-java"><span class="token comment">//home/dongchunyang/code_dcy/android_source/Q_r/frameworks/base/core/java/android/view/ViewTreeObserver.java</span>
<span class="token comment">/**
* Option for {@link #setTouchableInsets(int)}: the entire window frame
* can be touched.
*/</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> TOUCHABLE_INSETS_FRAME <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token comment">/**
* Option for {@link #setTouchableInsets(int)}: the area inside of
* the content insets can be touched.
*/</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> TOUCHABLE_INSETS_CONTENT <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token comment">/**
* Option for {@link #setTouchableInsets(int)}: the area inside of
* the visible insets can be touched.
*/</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> TOUCHABLE_INSETS_VISIBLE <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token comment">/**
* Option for {@link #setTouchableInsets(int)}: the area inside of
* the provided touchable region in {@link #touchableRegion} can be touched.
*/</span>
<span class="token annotation punctuation">@UnsupportedAppUsage</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> TOUCHABLE_INSETS_REGION <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>
<span class="token comment">/**
* Set which parts of the window can be touched: either
* {@link #TOUCHABLE_INSETS_FRAME}, {@link #TOUCHABLE_INSETS_CONTENT},
* {@link #TOUCHABLE_INSETS_VISIBLE}, or {@link #TOUCHABLE_INSETS_REGION}.
*/</span>
<span class="token annotation punctuation">@UnsupportedAppUsage</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setTouchableInsets</span><span class="token punctuation">(</span><span class="token keyword">int</span> val<span class="token punctuation">)</span> <span class="token punctuation">{</span>
mTouchableInsets <span class="token operator">=</span> val<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>上面第3条中有这么个判断<br> if (isTouchModal || windowInfo->touchableRegionContainsPoint(x, y)) {</p>
<pre><code class="prism language-cpp"><span class="token comment">//这个windowinfo 就是我们的window,而这个touchableRegion就是我们在java层给window设定好的信息。</span>
<span class="token keyword">bool</span> InputWindowInfo<span class="token operator">::</span><span class="token function">touchableRegionContainsPoint</span><span class="token punctuation">(</span><span class="token keyword">int32_t</span> x<span class="token punctuation">,</span> <span class="token keyword">int32_t</span> y<span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> touchableRegion<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span>y<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p><strong>看一下栗子</strong></p>
<blockquote>
<p>OnComputeInternalInsetsListener 是当视图树发生改变时调用的。</p>
</blockquote>
<pre><code class="prism language-java"><span class="token keyword">private</span> <span class="token keyword">final</span> OnComputeInternalInsetsListener mOnComputeInternalInsetsListener <span class="token operator">=</span> info <span class="token operator">-</span><span class="token operator">></span> <span class="token punctuation">{</span>
<span class="token comment">// When the nav bar is in 2-button or 3-button mode, or when IME is visible in fully</span>
<span class="token comment">// gestural mode, the entire nav bar should be touchable.</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">isGesturalMode</span><span class="token punctuation">(</span>mNavBarMode<span class="token punctuation">)</span> <span class="token operator">||</span> mImeVisible<span class="token punctuation">)</span> <span class="token punctuation">{</span>
info<span class="token punctuation">.</span><span class="token function">setTouchableInsets</span><span class="token punctuation">(</span>InternalInsetsInfo<span class="token punctuation">.</span>TOUCHABLE_INSETS_FRAME<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//触摸区域是整个窗口</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
info<span class="token punctuation">.</span><span class="token function">setTouchableInsets</span><span class="token punctuation">(</span>InternalInsetsInfo<span class="token punctuation">.</span>TOUCHABLE_INSETS_REGION<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//触摸区域取决于全局变量touchableRegion</span>
ButtonDispatcher imeSwitchButton <span class="token operator">=</span> <span class="token function">getImeSwitchButton</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>imeSwitchButton<span class="token punctuation">.</span><span class="token function">getVisibility</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> VISIBLE<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// If the IME is not up, but the ime switch button is visible, then make sure that</span>
<span class="token comment">// button is touchable</span>
<span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> loc <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">int</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
View buttonView <span class="token operator">=</span> imeSwitchButton<span class="token punctuation">.</span><span class="token function">getCurrentView</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
buttonView<span class="token punctuation">.</span><span class="token function">getLocationInWindow</span><span class="token punctuation">(</span>loc<span class="token punctuation">)</span><span class="token punctuation">;</span>
info<span class="token punctuation">.</span>touchableRegion<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>loc<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> loc<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> loc<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">+</span> buttonView<span class="token punctuation">.</span><span class="token function">getWidth</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
loc<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> buttonView<span class="token punctuation">.</span><span class="token function">getHeight</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//修改区域。</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
info<span class="token punctuation">.</span>touchableRegion<span class="token punctuation">.</span><span class="token function">setEmpty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//置空,全不可点</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
</code></pre>
<h2>通过 adb 控制应用全屏和状态栏导航栏</h2>
<pre><code class="prism language-xml">settings put global policy_controlimmersive.status=-com.android.calendar
</code></pre>
<p>‘-’ 是黑名单,不加该符号是白名单。</p>
<h2>查看Android 系统环境变量</h2>
<blockquote>
<p>Android 里有这样几个方法</p>
</blockquote>
<ol><li>System.getenv(“SECOND_STORAGE_TYPE”) // java环境里</li><li>getenv(“ANDROID_ROOT”) // native 环境里</li></ol>
<p>这些信息可以通过 adb shell 进入手机环境进行<mark>查看与修改</mark></p>
<pre><code> 1. adb shell
2. export
会输出
ANDROID_ROOT
SECOND_STORAGE_TYPE
.........
3. echo $ANDROID_ROOT //查看
4.export ANDROID_ROOT=xxxxxx //修改
</code></pre>
<p><s>删除文本</s></p>
<blockquote>
<p>引用文本</p>
</blockquote>
<p>H<sub>2</sub>O is是液体。</p>
<p>2<sup>10</sup> 运算结果是 1024.</p>
<h2>插入链接与图片</h2>
<p>链接: link.</p>
<p>图片: <img src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw" alt="Alt"></p>
<p>带尺寸的图片: <img src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw" alt="Alt" width="30" height="30"></p>
<p>居中的图片: <img src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center" alt="Alt"></p>
<p>居中并且带尺寸的图片: <img src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center" alt="Alt" width="30" height="30"></p>
<p>当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。</p>
<h2>如何插入一段漂亮的代码片</h2>
<p>去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 <code>代码片</code>.</p>
<pre><code class="prism language-javascript"><span class="token comment">// An highlighted block</span>
<span class="token keyword">var</span> foo <span class="token operator">=</span> <span class="token string">'bar'</span><span class="token punctuation">;</span>
</code></pre>
<h2>生成一个适合你的列表</h2>
<ul><li>项目
<ul><li>项目
<ul><li>项目</li></ul> </li></ul> </li></ul>
<ol><li>项目1</li><li>项目2</li><li>项目3</li></ol>
<ul><li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled"> 计划任务</li><li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" checked="true" disabled="disabled"> 完成任务</li></ul>
<h2>创建一个表格</h2>
<p>一个简单的表格是这么创建的:</p>
<table><thead><tr><th>项目</th><th>Value</th></tr></thead><tbody><tr><td>电脑</td><td>$1600</td></tr><tr><td>手机</td><td>$12</td></tr><tr><td>导管</td><td>$1</td></tr></tbody></table>
<h3>设定内容居中、居左、居右</h3>
<p>使用<code>:---------:</code>居中<br> 使用<code>:----------</code>居左<br> 使用<code>----------:</code>居右</p>
<table><thead><tr><th align="center">第一列</th><th align="right">第二列</th><th align="left">第三列</th></tr></thead><tbody><tr><td align="center">第一列文本居中</td><td align="right">第二列文本居右</td><td align="left">第三列文本居左</td></tr></tbody></table>
<h3>SmartyPants</h3>
<p>SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:</p>
<table><thead><tr><th>TYPE</th><th>ASCII</th><th>HTML</abbr></th></tr></thead><tbody><tr><td>Single backticks</td><td><code>'Isn't this fun?'</code></td><td>‘Isn’t this fun?’</td></tr><tr><td>Quotes</td><td><code>"Isn't this fun?"</code></td><td>“Isn’t this fun?”</td></tr><tr><td>Dashes</td><td><code>-- is en-dash, --- is em-dash</code></td><td>– is en-dash, — is em-dash</td></tr></tbody></table>
<h2>创建一个自定义列表</h2>
<dl>
Markdown
<dd>
Text-to-
HTML</abbr> conversion tool
</dd>
Authors
<dd>
John
</dd>
<dd>
Luke
</dd>
</dl>
<h2>如何创建一个注脚</h2>
<p>一个具有注脚的文本。<sup class="footnote-ref">1</sup></p>
<h2>注释也是必不可少的</h2>
<p>Markdown将文本转换为 HTML</abbr>。</p>
<h2>KaTeX数学公式</h2>
<p>您可以使用渲染LaTeX数学表达式 KaTeX:</p>
<p>Gamma公式展示 <span class="katex--inline"><span class="katex"><span class="katex-mathml">
Γ
(
n
)
=
(
n
−
1
)
!
∀
n
∈
N
\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mord">Γ</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right: 0.222222em"></span><span class="mbin">−</span><span class="mspace" style="margin-right: 0.222222em"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mord">1</span><span class="mclose">)</span><span class="mclose">!</span><span class="mspace" style="margin-right: 1em"></span><span class="mord">∀</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right: 0.277778em"></span><span class="mrel">∈</span><span class="mspace" style="margin-right: 0.277778em"></span></span><span class="base"><span class="strut" style="height: 0.68889em; vertical-align: 0"></span><span class="mord mathbb">N</span></span></span></span></span> 是通过欧拉积分</p>
<p><span class="katex--display"><span class="katex-display"><span class="katex"><span class="katex-mathml">
Γ
(
z
)
=
∫
0
∞
t
z
−
1
e
−
t
d
t
.
\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em"></span><span class="mord">Γ</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.04398em">z</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em"></span></span><span class="base"><span class="strut" style="height: 2.32624em; vertical-align: -0.91195em"></span><span class="mop"><span class="mop op-symbol large-op" style="margin-right: 0.44445em; position: relative; top: -0.001125em">∫</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 1.41429em"><span class="" style="top: -1.78805em; margin-left: -0.44445em; margin-right: 0.05em"><span class="pstrut" style="height: 2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span><span class="" style="top: -3.8129em; margin-right: 0.05em"><span class="pstrut" style="height: 2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">∞</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height: 0.91195em"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.166667em"></span><span class="mord"><span class="mord mathdefault">t</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em"><span class="" style="top: -3.113em; margin-right: 0.05em"><span class="pstrut" style="height: 2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight" style="margin-right: 0.04398em">z</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathdefault">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.843556em"><span class="" style="top: -3.113em; margin-right: 0.05em"><span class="pstrut" style="height: 2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mathdefault mtight">t</span></span></span></span></span></span></span></span></span><span class="mord mathdefault">d</span><span class="mord mathdefault">t</span><span class="mspace" style="margin-right: 0.166667em"></span><span class="mord">.</span></span></span></span></span></span></p>
<blockquote>
<p>你可以找到更多关于的信息 <strong>LaTeX</strong> 数学表达式here.</p>
</blockquote>
<h2>新的甘特图功能,丰富你的文章</h2>
<div class="mermaid">
<svg xmlns="http://www.w3.org/2000/svg" id="mermaid-svg-Au0KNrV5mmnTcYlT" height="100%" viewBox="0 0 500 196">
<g></g>
<g class="grid" transform="translate(75, 146)">
<g class="tick" transform="translate(0,0)" style="opacity: 1">
<line y2="-111" x2="0"></line>
<text dy="1em" y="3" x="0" fill="#000" stroke="none" font-size="10" style="text-anchor: middle">
Mon 06
</text>
</g>
<g class="tick" transform="translate(153,0)" style="opacity: 1">
<line y2="-111" x2="0"></line>
<text dy="1em" y="3" x="0" fill="#000" stroke="none" font-size="10" style="text-anchor: middle">
Mon 13
</text>
</g>
<g class="tick" transform="translate(306,0)" style="opacity: 1">
<line y2="-111" x2="0"></line>
<text dy="1em" y="3" x="0" fill="#000" stroke="none" font-size="10" style="text-anchor: middle">
Mon 20
</text>
</g>
<path class="domain" d="M0,0V0H350V0"></path>
</g>
<g>
<rect x="0" y="48" width="462.5" height="24" class="section section0"></rect>
<rect x="0" y="72" width="462.5" height="24" class="section section0"></rect>
<rect x="0" y="96" width="462.5" height="24" class="section section0"></rect>
<rect x="0" y="120" width="462.5" height="24" class="section section0"></rect>
</g>
<g>
<rect rx="3" ry="3" x="75" y="50" width="44" height="20" class="taskdone0"></rect>
<rect rx="3" ry="3" x="141" y="74" width="65" height="20" class="taskactive0"></rect>
<rect rx="3" ry="3" x="206" y="98" width="110" height="20" class="tasktask0"></rect>
<rect rx="3" ry="3" x="316" y="122" width="109" height="20" class="tasktask0"></rect>
<text font-size="11" x="97" y="63.5" text-height="20" class="taskText taskText0doneText0">
已完成
</text>
<text font-size="11" x="173.5" y="87.5" text-height="20" class="taskText taskText0 activeText0">
进行中
</text>
<text font-size="11" x="261" y="111.5" text-height="20" class="taskText taskText0 ">
计划一
</text>
<text font-size="11" x="370.5" y="135.5" text-height="20" class="taskText taskText0 ">
计划二
</text>
</g>
<g>
<text x="10" y="98" class="sectionTitle sectionTitle0">
现有任务
</text>
</g>
<g class="today">
<line x1="47729" x2="47729" y1="25" y2="171" class="today"></line>
</g>
<text x="250" y="25" class="titleText">
Adding GANTT diagram functionality to mermaid
</text>
</svg>
</div>
<ul><li>关于 <strong>甘特图</strong> 语法,参考 这儿,</li></ul>
<h2>UML 图表</h2>
<p>可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::</p>
<div class="mermaid">
<svg xmlns="http://www.w3.org/2000/svg" id="mermaid-svg-GA83hnr4W2FiSnsu" height="100%" width="100%" style="max-width: 750px" viewBox="-50 -10 750 461">
<g></g>
<g>
<line id="actor3" x1="75" y1="5" x2="75" y2="450" class="actor-line" stroke-width="0.5px" stroke="#999"></line>
<rect x="0" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect>
<text x="75" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle">
<tspan x="75" dy="0">
张三
</tspan>
</text>
</g>
<g>
<line id="actor4" x1="275" y1="5" x2="275" y2="450" class="actor-line" stroke-width="0.5px" stroke="#999"></line>
<rect x="200" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect>
<text x="275" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle">
<tspan x="275" dy="0">
李四
</tspan>
</text>
</g>
<g>
<line id="actor5" x1="475" y1="5" x2="475" y2="450" class="actor-line" stroke-width="0.5px" stroke="#999"></line>
<rect x="400" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect>
<text x="475" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle">
<tspan x="475" dy="0">
王五
</tspan>
</text>
</g>
<defs>
<marker id="arrowhead" refX="5" refY="2" markerWidth="6" markerHeight="4" orient="auto">
<path d="M 0,0 V 4 L6,2 Z"></path>
</marker>
</defs>
<defs>
<marker id="crosshead" markerWidth="15" markerHeight="8" orient="auto" refX="16" refY="4">
<path fill="black" stroke="#000000" stroke-width="1px" d="M 9,2 V 6 L16,4 Z" style=""></path>
<path fill="none" stroke="#000000" stroke-width="1px" d="M 0,1 L 6,7 M 6,1 L 0,7" style=""></path>
</marker>
</defs>
<g>
<text x="175" y="93" class="messageText" style="text-anchor: middle">
你好!李四, 最近怎么样?
</text>
<line x1="75" y1="100" x2="275" y2="100" class="messageLine0" stroke-width="2" stroke="black" marker-end="url(#arrowhead)" style="fill: none"></line>
</g>
<g>
<text x="375" y="128" class="messageText" style="text-anchor: middle">
你最近怎么样,王五?
</text>
<line x1="275" y1="135" x2="475" y2="135" class="messageLine1" stroke-width="2" stroke="black" marker-end="url(#arrowhead)" style="fill: none"></line>
</g>
<g>
<text x="175" y="163" class="messageText" style="text-anchor: middle">
我很好,谢谢!
</text>
<line x1="275" y1="170" x2="75" y2="170" class="messageLine1" stroke-width="2" stroke="black" marker-end="url(#crosshead)" style="fill: none"></line>
</g>
<g>
<text x="375" y="198" class="messageText" style="text-anchor: middle">
我很好,谢谢!
</text>
<line x1="275" y1="205" x2="475" y2="205" class="messageLine0" stroke-width="2" stroke="black" marker-end="url(#crosshead)" style="fill: none"></line>
</g>
<g>
<rect x="500" y="215" fill="#EDF2AE" stroke="#666" width="150" height="80" rx="0" ry="0" class="note"></rect>
<text x="516" y="244" fill="black" class="noteText">
<tspan x="516">
李四想了很长时间,
</tspan>
<tspan dy="22" x="516">
文字太长了
</tspan>
<tspan dy="22" x="516">
不适合放在一行.
</tspan>
</text>
</g>
<g>
<text x="175" y="323" class="messageText" style="text-anchor: middle">
打量着王五...
</text>
<line x1="275" y1="330" x2="75" y2="330" class="messageLine1" stroke-width="2" stroke="black" marker-end="url(#arrowhead)" style="fill: none"></line>
</g>
<g>
<text x="275" y="358" class="messageText" style="text-anchor: middle">
很好... 王五, 你怎么样?
</text>
<line x1="75" y1="365" x2="475" y2="365" class="messageLine0" stroke-width="2" stroke="black" marker-end="url(#arrowhead)" style="fill: none"></line>
</g>
<g>
<rect x="0" y="385" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect>
<text x="75" y="417.5" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle">
<tspan x="75" dy="0">
张三
</tspan>
</text>
</g>
<g>
<rect x="200" y="385" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect>
<text x="275" y="417.5" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle">
<tspan x="275" dy="0">
李四
</tspan>
</text>
</g>
<g>
<rect x="400" y="385" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect>
<text x="475" y="417.5" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle">
<tspan x="475" dy="0">
王五
</tspan>
</text>
</g>
</svg>
</div>
<p>这将产生一个流程图。:</p>
<div class="mermaid">
<svg xmlns="http://www.w3.org/2000/svg" id="mermaid-svg-eM8InQBe2X9gHnqF" height="182" width="418.4593734741211" viewBox="0 0 438.4593734741211 202">
<g>
<g class="output">
<g class="clusters"></g>
<g class="edgePaths">
<g class="edgePath" style="opacity: 1">
<path class="path" d="M88.015625,69.2395334305353L129.0234375,43L197.0390625,43" marker-end="url(#arrowhead33)" style="fill: none"></path>
<defs>
<marker id="arrowhead33" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto">
<path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1"></path>
</marker>
</defs>
</g>
<g class="edgePath" style="opacity: 1">
<path class="path" d="M88.015625,112.7604665694647L129.0234375,139L170.03125,139" marker-end="url(#arrowhead34)" style="fill: none"></path>
<defs>
<marker id="arrowhead34" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto">
<path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1"></path>
</marker>
</defs>
</g>
<g class="edgePath" style="opacity: 1">
<path class="path" d="M243.0390625,43L295.046875,43L337.3186682393272,74.72820752361238" marker-end="url(#arrowhead35)" style="fill: none"></path>
<defs>
<marker id="arrowhead35" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto">
<path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1"></path>
</marker>
</defs>
</g>
<g class="edgePath" style="opacity: 1">
<path class="path" d="M270.046875,139L295.046875,139L337.3186673661942,108.27179312913378" marker-end="url(#arrowhead36)" style="fill: none"></path>
<defs>
<marker id="arrowhead36" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto">
<path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1"></path>
</marker>
</defs>
</g>
</g>
<g class="edgeLabels">
<g class="edgeLabel" transform="translate(129.0234375,43)" style="opacity: 1">
<g transform="translate(-16.0078125,-13)" class="label">
<foreignObject width="32.015625" height="26">
<div style="display: inline-block; white-space: nowrap">
<span class="edgeLabel">链接</span>
</div>
</foreignObject>
</g>
</g>
<g class="edgeLabel" transform="" style="opacity: 1">
<g transform="translate(0,0)" class="label">
<foreignObject width="0" height="0">
<div style="display: inline-block; white-space: nowrap">
<span class="edgeLabel"></span>
</div>
</foreignObject>
</g>
</g>
<g class="edgeLabel" transform="" style="opacity: 1">
<g transform="translate(0,0)" class="label">
<foreignObject width="0" height="0">
<div style="display: inline-block; white-space: nowrap">
<span class="edgeLabel"></span>
</div>
</foreignObject>
</g>
</g>
<g class="edgeLabel" transform="" style="opacity: 1">
<g transform="translate(0,0)" class="label">
<foreignObject width="0" height="0">
<div style="display: inline-block; white-space: nowrap">
<span class="edgeLabel"></span>
</div>
</foreignObject>
</g>
</g>
</g>
<g class="nodes">
<g class="node" id="A" transform="translate(54.0078125,91)" style="opacity: 1">
<rect rx="0" ry="0" x="-34.0078125" y="-23" width="68.015625" height="46"></rect>
<g class="label" transform="translate(0,0)">
<g transform="translate(-24.0078125,-13)">
<foreignObject width="48.015625" height="26">
<div style="display: inline-block; white-space: nowrap">
长方形
</div>
</foreignObject>
</g>
</g>
</g>
<g class="node" id="B" transform="translate(220.0390625,43)" style="opacity: 1">
<circle x="-18.0078125" y="-23" r="23"></circle>
<g class="label" transform="translate(0,0)">
<g transform="translate(-8.0078125,-13)">
<foreignObject width="16.015625" height="26">
<div style="display: inline-block; white-space: nowrap">
圆
</div>
</foreignObject>
</g>
</g>
</g>
<g class="node" id="C" transform="translate(220.0390625,139)" style="opacity: 1">
<rect rx="5" ry="5" x="-50.0078125" y="-23" width="100.015625" height="46"></rect>
<g class="label" transform="translate(0,0)">
<g transform="translate(-40.0078125,-13)">
<foreignObject width="80.015625" height="26">
<div style="display: inline-block; white-space: nowrap">
圆角长方形
</div>
</foreignObject>
</g>
</g>
</g>
<g class="node" id="D" transform="translate(359.25312423706055,91)" style="opacity: 1">
<polygon points="39.206250000000004,0 78.41250000000001,-39.206250000000004 39.206250000000004,-78.41250000000001 0,-39.206250000000004" rx="5" ry="5" transform="translate(-39.206250000000004,39.206250000000004)"></polygon>
<g class="label" transform="translate(0,0)">
<g transform="translate(-16.0078125,-13)">
<foreignObject width="32.015625" height="26">
<div style="display: inline-block; white-space: nowrap">
菱形
</div>
</foreignObject>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
</div>
<ul><li>关于 <strong>Mermaid</strong> 语法,参考 这儿,</li></ul>
<h2>FLowchart流程图</h2>
<p>我们依旧会支持flowchart的流程图:</p>
<div class="mermaid flow-chart">
<svg height="358.875" version="1.1" width="140.5" xmlns="http://www.w3.org/2000/svg" style="overflow: hidden; position: relative" viewBox="0 0 140.5 358.875" preserveAspectRatio="xMidYMid meet">
<desc style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)">
Created with Raphaël 2.2.0
</desc>
<defs style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)">
<marker id="raphael-marker-endblock33-obj56g7o" markerHeight="3" markerWidth="3" orient="auto" refX="1.5" refY="1.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)">
<use transform="rotate(180 1.5 1.5) scale(0.6,0.6)" stroke-width="1.6667" fill="black" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></use>
</marker>
<marker id="raphael-marker-endblock33-obj2kc4p" markerHeight="3" markerWidth="3" orient="auto" refX="1.5" refY="1.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)">
<use transform="rotate(180 1.5 1.5) scale(0.6,0.6)" stroke-width="1.6667" fill="black" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></use>
</marker>
<marker id="raphael-marker-endblock33-objdrlba" markerHeight="3" markerWidth="3" orient="auto" refX="1.5" refY="1.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)">
<use transform="rotate(180 1.5 1.5) scale(0.6,0.6)" stroke-width="1.6667" fill="black" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></use>
</marker>
<marker id="raphael-marker-endblock33-obj1y77s" markerHeight="3" markerWidth="3" orient="auto" refX="1.5" refY="1.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)">
<use transform="rotate(180 1.5 1.5) scale(0.6,0.6)" stroke-width="1.6667" fill="black" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></use>
</marker>
</defs>
<rect x="0" y="0" width="50" height="36" rx="20" ry="20" fill="#ffffff" stroke="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)" stroke-width="2" class="flowchart" id="st" transform="matrix(1,0,0,1,33.75,13.375)"></rect>
<text x="10" y="18" text-anchor="start" font-size="14px" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: start; font-family: sans-serif; font-size: 14px; font-weight: normal" id="stt" class="flowchartt" transform="matrix(1,0,0,1,33.75,13.375)" stroke-width="1">
<tspan dy="5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)">
开始
</tspan>
</text>
<rect x="0" y="0" width="78" height="36" rx="0" ry="0" fill="#ffffff" stroke="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)" stroke-width="2" class="flowchart" id="op" transform="matrix(1,0,0,1,19.75,112.75)"></rect>
<text x="10" y="18" text-anchor="start" font-size="14px" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: start; font-family: sans-serif; font-size: 14px; font-weight: normal" id="opt" class="flowchartt" transform="matrix(1,0,0,1,19.75,112.75)" stroke-width="1">
<tspan dy="5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)">
我的操作
</tspan>
</text>
<path fill="#ffffff" stroke="#000000" d="M27.375,13.6875L0,27.375L54.75,54.75L109.5,27.375L54.75,0L0,27.375" stroke-width="2" id="cond" class="flowchart" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: sans-serif; font-weight: normal" transform="matrix(1,0,0,1,4,202.75)"></path>
<text x="32.375" y="27.375" text-anchor="start" font-size="14px" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: start; font-family: sans-serif; font-size: 14px; font-weight: normal" id="condt" class="flowchartt" transform="matrix(1,0,0,1,4,202.75)" stroke-width="1">
<tspan dy="5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)">
确认?
</tspan>
</text>
<rect x="0" y="0" width="50" height="36" rx="20" ry="20" fill="#ffffff" stroke="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)" stroke-width="2" class="flowchart" id="e" transform="matrix(1,0,0,1,33.75,320.875)"></rect>
<text x="10" y="18" text-anchor="start" font-size="14px" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: start; font-family: sans-serif; font-size: 14px; font-weight: normal" id="et" class="flowchartt" transform="matrix(1,0,0,1,33.75,320.875)" stroke-width="1">
<tspan dy="5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)">
结束
</tspan>
</text>
<path fill="none" stroke="#000000" d="M58.75,49.375C58.75,49.375,58.75,97.19504317641258,58.75,109.75714436240378" stroke-width="2" marker-end="url(#raphael-marker-endblock33-obj56g7o)" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: sans-serif; font-weight: normal"></path>
<path fill="none" stroke="#000000" d="M58.75,148.75C58.75,148.75,58.75,188.40409994125366,58.75,199.75043908460066" stroke-width="2" marker-end="url(#raphael-marker-endblock33-obj2kc4p)" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: sans-serif; font-weight: normal"></path>
<path fill="none" stroke="#000000" d="M58.75,257.5C58.75,257.5,58.75,305.3200431764126,58.75,317.8821443624038" stroke-width="2" marker-end="url(#raphael-marker-endblock33-objdrlba)" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: sans-serif; font-weight: normal"></path>
<text x="63.75" y="267.5" text-anchor="start" font-size="14px" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: start; font-family: sans-serif; font-size: 14px; font-weight: normal" stroke-width="1">
<tspan dy="5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)">
yes
</tspan>
</text>
<path fill="none" stroke="#000000" d="M113.5,230.125C113.5,230.125,138.5,230.125,138.5,230.125C138.5,230.125,138.5,87.75,138.5,87.75C138.5,87.75,58.75,87.75,58.75,87.75C58.75,87.75,58.75,103.12344455718994,58.75,109.75924777425826" stroke-width="2" marker-end="url(#raphael-marker-endblock33-obj1y77s)" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: sans-serif; font-weight: normal"></path>
<text x="118.5" y="220.125" text-anchor="start" font-size="14px" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: start; font-family: sans-serif; font-size: 14px; font-weight: normal" stroke-width="1">
<tspan dy="5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)">
no
</tspan>
</text>
</svg>
</div>
<ul><li>关于 <strong>Flowchart流程图</strong> 语法,参考 这儿.</li></ul>
<h2>导出与导入</h2>
<h3>导出</h3>
<p>如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 <strong>文章导出</strong> ,生成一个.md文件或者.html文件进行本地保存。</p>
<h3>导入</h3>
<p>如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,<br> 继续你的创作。</p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list"><li id="fn1" class="footnote-item"><p>注脚的解释 ↩︎</p> </li></ol>
</section>
</div>
<div id="MySignature" role="contentinfo">
<p>本文来自博客园,作者:寒风凛凛,转载请注明原文链接:https://www.cnblogs.com/dongxiaofat/p/15426406.html</p><br><br>
来源:https://www.cnblogs.com/dongxiaofat/p/15426406.html
頁:
[1]