字节面试官:说说为什么自定义view的wrap_content会失效?
前言
面试官:为什么自定义View中wrap_content会失效?
要想回答这个问题,我们需要了解view绘制的前世今生
view什么时候被绘制?
view是在Activity的哪个生命周期被绘制的?
onResume之后
初识ViewRoootImpl
我们知道onResume方法实际只是个回调方法,前面的调用是
handleResumeActivity -> performResumeActivity -> onResume
onResume结束之后,就会回到handleResumeActivity,紧接着会执行addView,将可见的view添加到window中,这里的window起到显示器的作用,
public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason) {//调用onResumefinal ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);ViewManager wm = a.getWindowManager();if (a.mVisibleFromClient) {if (!a.mWindowAdded) {a.mWindowAdded = true;wm.addView(decor, l); // 将decor添加到wm中}}...// wm是一个WindowManagerGlobal,持有 ViewRoootImplpublic void addView(View view, ViewGroup.LayoutParams params,Display display, Window parentWindow, int userId) {root.setView(view, wparams, panelParentView, userId);// ViewRoootImpl}
这里的root就是ViewRoootImpl,进入setView之后,就是ViewRootImpl的工作啦,ViewRootImpl就是window添加view的工具
ViewRootImpl在绘制View中起的作用
setView的代码很多,主要是调用了requestLayout()
requestLayout做了两件事情
-
检查当前线程是否是创建View的线程,如果不是,抛出异常
void checkThread() {if (mThread != Thread.currentThread()) {throw new CalledFromWrongThreadException("Only the original thread that created a view hierarchy can touch its views.");}}
-
执行scheduleTraversals
mTraversalBarrier表示往handler里面插入一个同步屏障,表示接下来要发到handler的任务为最高优先级,需要马上处理(屏幕刷新确实往往需要是最高优先级)
mChoreographer是一个线程,将会执行绘制任务,绘制任务就在传入的mTraversalRunnable
void scheduleTraversals() {if (!mTraversalScheduled) {mTraversalScheduled = true;mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();// 注意传入的mTraversalRunnablemChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);notifyRendererOfFramePending(); } }
执行具体绘制
final class TraversalRunnable implements Runnable {@Overridepublic void run() {doTraversal();}}void doTraversal() {if (mTraversalScheduled) {...performTraversals();...}}private void performTraversals() {}
会执行到performTraversals,这个方法有很多调用可以直接到ViewGroup和View,如下(图片来自网络)
performTraversals会分别调用 performMeasure, performLayout,performDraw
而这三个方法,我想你应该能猜到,他们会启动onMesure,onLayout,onDraw方法
小结
回到我们刚刚的问题
view什么时候被绘制?是在onResume之后由viewRootImpl一手包办的,终点就是view的那三个绘制方法
所以在onResume之前的Activity,是无法获取view的宽高的,因为view的宽高是在onLayout中才最终确定
但是在onCreate中,却可以通过View.post()方法获取,这是为什么?
其实也很简单,无非就是阻塞了一下,放到队列里面,等绘制好了,通知一下,就获得宽高即可,我们来看看源代码
public boolean post(Runnable action) {final AttachInfo attachInfo = mAttachInfo;//这里不为null表示view已经被添加到window,早就绘制完成了if (attachInfo != null) {return attachInfo.mHandler.post(action);}//如果为null,表示view还没好,放到队列里面getRunQueue().post(action);return true;}
你以为他能预测未来?其实要么是吹牛,要么是他等到【未来】已经发生了之后才告诉你
接下来我们讨论view的具体绘制过程
View的绘制过程
如果你不了解View,那就说明你没有真正入门android
无论是TextView小控件,还是LineLayout这种大容器,都是View演化而来,TextView也继承自View
public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {}
LineLayout这类布局控件特殊一点,来自ViewGroup,而ViewGroup继承自View
public class RelativeLayout extends ViewGroup {}
public abstract class ViewGroup extends View implements ViewParent, ViewManager {}
可以把view比作水,很多的水聚在一起是一滩水(viewGroup),但是本质上还是水(view)
除了展示之外,View必须要有完善的滑动,点击策略,这是手机上最高频的操作,接下来,我们就详细了解View的展示,滑动,事件和绘制原理。
展示方法
要想展示,知道哪个控件放在哪,就需要精确定位,这里我们使用坐标系,有两种
-
android坐标绝对定位
最简单的是是将左上角作为坐标原点,右侧是x轴正方向,下侧是y轴正方向
使用getRawX()和getRawY()方法获取x,y坐标,这是一种绝对定位的方法
-
view坐标相对定位
由于android中的空间是层层嵌套的,所以一个子控件可以通过其对于父控件的相对位置来看位置,具体方法如下(图来自网络)
常用的比如获取view的宽高,
width = getRight() - getLeft();
height = getBottom() - getTop ();
当然,系统已经有getWidth和getHeight方法了,而他们内部逻辑也是这个
/*** Return the width of your view.** @return The width of your view, in pixels.*/
@ViewDebug.ExportedProperty(category = "layout")
public final int getWidth() {return mRight - mLeft;
}
滑动事件
在滑动方面,android和其他语言写的UI一样,都是点击的时候,记录下Down的坐标,然后记录手指滑动后的UP坐标,算出偏移量,通过偏移量来修改View的坐标,当手指在手机上滑动的时候,会触发onTouchEvent事件,如果你想自定义操作,可以重写这个方法
public boolean onTouchEvent(MotionEvent event) {
switch (action) {case MotionEvent.ACTION_UP:case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_CANCEL://?case MotionEvent.ACTION_MOVE:
}
另外三个都好理解,ACTION_CANCEL是什么情况?
举个例子,比如你一个LineLayout中滑动一个View,但是滑到了LineLayout之外的区域,此时的View肯定不能出去,此时就可以触发ACTION_CANCEL,你可以设置回到原位,或者是让View留在边缘
在ViewGroup中还有一个onInterceptTouchEvent方法,再配合上android中的各种嵌套的View,这也是令很多人困惑的地方,这里涉及到事件消费的问题。
事件处理
为什么要有这个问题?
试想一下,手机上巴掌大的地方,嵌套view肯定是到处都有的
当我点击蓝色区域的TextView的时候,实际上也在点击RelativeLayout和LinearLayout
那么,android如何知道点击的是哪个控件呢?
方法就是事件拦截,点击是一个事件,哪一层拦截这个事件并执行对应逻辑,就是一次事件消费,如果拦截到了,不执行逻辑,就会放掉,给其他控件拦截,依次递归下去
上面加粗的拦截和执行对应了view中的两个方法 onIntercerptTouchEvent和onTouchEvent
显然,第一个拦截到的view是最外层的view,LinearLayout
-
onIntercerptTouchEvent
如果你对外层的LinearLayout重写了onIntercerptTouchEvent方法,返回值为false,表示他放掉这个事件,进入内部的RelativeLayout,同理,哪个控件的onIntercerptTouchEvent方法返回为true,表示哪个控件要拦截此事件。
注意,android为了高效,拦截到的传入事件仅仅只有down(参考上文中onTouchEvent的不同case),当确认onIntercerptTouchEvent的返回值为true后,拦截事件的move,up等会和down直接传入到当前控件的onTouchEvent开始执行
如果返回值为false,证明当前控件放掉此事件,那么move和down一起会留在当前控件的onIntercerptTouchEvent中,一并传入下一个拦截控件。
注意onIntercerptTouchEvent只在ViewGroup中有,原因很简单,因为只有他能嵌套View,而默认返回值是false,一般ViewGoup不轻易处理事件,而是交给子View,这也符合我们对他“容器”的直观感受。
-
onTouchEvent
假设最后传到了TextView,他没有办法往下传了,难道他必须消费此事件吗?
不是的,他的onTouchEvent也有返回值,return false表示不愿意消费此事件,这样,打包好的事件(down,up,move等)会一并返回RelativeLaout中
如图
另外还有一个dispatchTouchEvent()方法,负责分发事件,在这里单独说,是方便大家拆开理解,更简单些,上面的逻辑虽然闭环了,但是还缺一个,当用户点击控件的时候,控件是怎么能够拦截到的呢?
dispatchTouchEvent内部包含一个onTouchListener,这个东西放在activity或者fragement中首先拿到事件,交给dispatchTouchEvent统一管理,然后分发给对应ViewGroup的onIntercerptTouchEvent,就可以走上面的逻辑了。由于本文更多是理解原理,所以不做具体实现。
绘制
上面的讲解都是为了本流程服务的,是分散的知识点,接下来,我们将其串起来
View的工作流程就是,测量,布局和绘制,分别通过三个方法,如果要自定义View,则需要对其进行重写
measure
View中的measure必定会测量View自己,但是如果这个View是一个ViewGroup,还会遍历里面的View,调用他们自己的measure来测量他们自己,这是一个递归的过程
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// 注意这里的widthMeasureSpec和getDefaultSizesetMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));}
这里的源代码只有一行,也就是获取默认宽高并测量
相信你一定用过wrap_content,就是让控件大小刚好包裹住内容,如果在xml中设置宽高为定值,就不需要measure了,正是因为我们会设置wrap_content或者match_parent,此时就会调用view的onMeasure()方法
-
match_parent
对于match_parent,只需要知道当前View的父控件,将他的Size赋值给到当前View即可,所以我们要做两件事,1. 找到最初的ViewGroup控件测量,2. 将测量数据往下传递到最小的View
-
wrap_content
wrap_content是刚刚好包裹住内部内容的最小值,所以刚好相反,是算出子控件的大小
widthMeasureSpec的作用?
ViewGroup如何传信息给到子View?
MeasureSpec类,这个类保存两个数据
- 子View的父控件具体尺寸
- 父控件对子View的限制类型
第一个好理解,毕竟match_parent传递就靠这个,而且子view不能超过这个大小
第二个的限制类型有三种
private static final int MODE_SHIFT = 30;
public static final int UNSPECIFIED = 0 << MODE_SHIFT; //不限制大小
public static final int EXACTLY = 1 << MODE_SHIFT; //代表 match_parent
public static final int AT_MOST = 2 << MODE_SHIFT; //代表 wrap_content
所以整个测量的方法就是:
父布局先measure自己,然后在自己的onMeasure,调用child.measure,然后子View会根据父布局的限制信息,再结合自己的content大小,综合测量自己的尺寸,然后通过setMeasuredDimension方法保存数据,
wrap_content失效问题
在onMesure中还有一个getDefaultSize方法,是真正的获取view的size的方法
我们来看看,面试官,这就是你要的答案!
public static int getDefaultSize(int size, int measureSpec) {int result = size;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);switch (specMode) {case MeasureSpec.UNSPECIFIED:result = size;break;case MeasureSpec.AT_MOST:case MeasureSpec.EXACTLY:result = specSize; // 这里的spectSize代表match_parentbreak;}return result;}
可以看到,默认mode有三种,但是这里的AT_MOST与EXACTLY被当做同一种case,那么为什么是wrap_content失效呢?
注释里面写了,关键在于specSize是怎么来的?
而既然这里必定涉及到父view与子view,显然,答案在ViewGroup中,我们发现了一个getChildMeasureSpec方法,这里我保留了英文解释,比较易懂,大家看看人家为什么要这么做
public static int getChildMeasureSpec(int spec, int padding, int childDimension) {switch (specMode) {//父view在EXACTLY 模式下,子view的MATCH_PARENT与WRAP_CONTENT的对应关系是ok的case MeasureSpec.EXACTLY: if (childDimension >= 0) {resultSize = childDimension;resultMode = MeasureSpec.EXACTLY;} else if (childDimension == LayoutParams.MATCH_PARENT) {// Child wants to be our size. So be it.resultSize = size;resultMode = MeasureSpec.EXACTLY;} else if (childDimension == LayoutParams.WRAP_CONTENT) {// Child wants to determine its own size. It can't be// bigger than us.resultSize = size;resultMode = MeasureSpec.AT_MOST;}break;// 父view在AT_MOST模式下,子view的MATCH_PARENT和WRAP_CONTENT都变成了AT_MOST模式case MeasureSpec.AT_MOST:if (childDimension >= 0) {// Child wants a specific size... so be itresultSize = childDimension;resultMode = MeasureSpec.EXACTLY;} else if (childDimension == LayoutParams.MATCH_PARENT) {// Child wants to be our size, but our size is not fixed.// Constrain child to not be bigger than us.resultSize = size;resultMode = MeasureSpec.AT_MOST;} else if (childDimension == LayoutParams.WRAP_CONTENT) {// Child wants to determine its own size. It can't be// bigger than us.resultSize = size;resultMode = MeasureSpec.AT_MOST;}break;
所以,核心在于,子view不能bigger than 父view,所以默认是父view的AT_MOST,也就是剩余最大空间
所以为什么是wrap_content失效?因为需要填充满父view的剩余最大空间,刚好符合子view的match_parent属性效果
如何解决这一问题?
其实很简单,上面东西再复杂也是Default的,我们只需要在自定义View中的onMeasure自定义我们的宽高,然后通过setMeasuredDimension写回即可
layout
layout用来确认ViewGroup子元素的位置,
public void layout(int l, int t, int r, int b) {if ((mPrivateFlags3 & PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT) != 0) {onMeasure(mOldWidthMeasureSpec, mOldHeightMeasureSpec);mPrivateFlags3 &= ~PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT;}int oldL = mLeft;int oldT = mTop;int oldB = mBottom;int oldR = mRight;boolean changed = isLayoutModeOptical(mParent) ?setOpticalFrame(l, t, r, b) : setFrame(l, t, r, b);if (changed || (mPrivateFlags & PFLAG_LAYOUT_REQUIRED) == PFLAG_LAYOUT_REQUIRED) {onLayout(changed, l, t, r, b);...}
可以看到,首先初始化左,顶,底,右坐标,然后setFrame进行设定,当四个顶点确定后,view在其父容器中的位置就定了,哪怕他再奇形怪状,也被关在了这四个坐标构成的矩形里面,接下来,调用onLayout()方法
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
}
View中的onLayout()为空,表示我们需要自己重写,我们可以看看RelativeLayout中的重写
protected void onLayout(boolean changed, int l, int t, int r, int b) {// The layout has actually already been performed and the positions// cached. Apply the cached values to the children.final int count = getChildCount();for (int i = 0; i < count; i++) {View child = getChildAt(i);if (child.getVisibility() != GONE) {RelativeLayout.LayoutParams st =(RelativeLayout.LayoutParams) child.getLayoutParams();child.layout(st.mLeft, st.mTop, st.mRight, st.mBottom);}}}
这里获得了所有的子控件,并调用子控件的layout方法,因为RelativeLayout可能嵌套其他Layout,这里的getLayoutParams就是用来获得具体的位置参数的,显然,如果要修改view的位置,可以直接调用setLayoutParams
总结一下,Layout方法确定自己的坐标,然后调用onLayout并执行子控件Layout()方法以获得子控件的坐标
draw
measure是测量View的大小,layout是确定View的位置,万事俱备,只剩下将View绘制出来了,在draw源码中有6个步骤
/** Draw traversal performs several drawing steps which must be executed* in the appropriate order:** 1\. Draw the background 绘制背景* 2\. If necessary, save the canvas' layers to prepare for fading * 3\. Draw view's content 绘制内容* 4\. Draw children 绘制子控件* 5\. If necessary, draw the fading edges and restore layers* 6\. Draw decorations (scrollbars for instance) 绘制装饰*/
其中2,5步骤是图层相关操作,但是我们正常开发一般不用,所以可以跳过,在draw()源码中,上面的步骤对应下面的源码
// Step 1, 绘制背景
drawBackground(canvas);
// Step 3, 绘制内容
onDraw(canvas);
// Step 4, 绘制子控件
dispatchDraw(canvas);
// Step 6, 绘制装饰
onDrawForeground(canvas);
当然,我们自定义画一个view也不需要全部都重写,一般onDraw()方法绘制内容即可,其他的使用draw()默认的即可,最简单的onDraw就是画一个圆形,使用Canvas绘制
protected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawCircle(width, height, radius, mPaint)}
上面的传入的参数只需要自己,这样就可以画出一个View了,更复杂有趣的View,我们将在自定义View中具体实现,这里只需了解原理。
小结
对于View,我们需要掌握他的展示,滑动,事件处理机制和绘制机制,其中
展示需要明白相对位置和绝对位置表示
滑动与事件处理需要明白down,up,move这些事件从用户点击到最终被消费所经历的过程。
绘制需要明白view如何知道自己的宽高,位置和图像
最后
面试官:我就问个wrap_content,你怎么不从盘古开天辟地开始说起?
我:啊,一不小心讲多了,其实关于滑动事件还有一个滑动冲突没讲,
面试官:我订的会议室已经超时了,再面下去外面人要冲进来砍我了,回去等通知吧
为了能帮助到大家更好的学习,我这里为大家整理了一份 Android 系统学习的学习路线图和学习文档大家可以往下看,如需要参考完整版的学习路线图或资料可以去点击下方小卡片访问查阅。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 轻巧耐用的真无线耳机,omthing AirFree Plus上手
在聒噪的环境中,只需要戴上两只小小的耳机,就能瞬间获得个人独享的声音环境,摆脱外界的干扰,专心于工作学习与娱乐。这两年我最常用的还是真无线耳机,一方面是因为这种耳机日常携带方便,另一方面还是因为它选择多、更新快,总能找到好听、好看的选择。 最近我在用的是万魔…...
2024/4/29 22:58:14 - Android Studio
https://developer.android.com/studioCould not download protobuf-java.jar...
2024/4/20 1:40:31 - 部署Zookeeper
启动Zookeeper服务不成功,zkServer.sh status查看状态,显示Error contacting service.It is probably not runningzookeeper安装过程Zookeeper安装报错Error contacting service.It is probably not runningzookeeper安装过程 安装前的准备工作…...
2024/4/6 23:24:14 - 【行研资料】2021年商业地产趋势洞察白皮书——附下载链接
来源 | Mob研究院&头豹 2020年2月40城商业客流降至低点,2020年5月开始商业客流恢复较明显;2021年整体客流虽不及疫情前,但客流量整体呈现恢复态势,同时疫情的。反复会对客流有削弱影响,如2021年6月广州地区疫情反复…...
2024/5/3 16:03:25 - Java架构演进
一、开发环境&生产环境 1.1 开发环境 平时在写代码时,大多都在是Win10/Win7/Mac,这些系统都可以称呼为开发环境,咱们会为了更高效的开发应用程序,安装很多很多的软件,会导致操作系统不安全,稳定性降低。…...
2024/4/20 8:30:00 - HTML编辑器可以如何直接复制word的图文内容到编辑器中?
如何做到 ueditor批量上传word图片? 1、前端引用代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xh…...
2024/5/3 15:31:07 - 大数据仓库Hive原理与架构
前面讲到,MapReduce计算模型可以解决绝大多数的数据分析与数据挖掘任务,那么对于如下我们常见的一条SQL分析语句,MapReduce如何编程实现? SELECT pageid, age, count(1) FROM pv_users GROUP BY pageid, age; 这是一条非常常见的…...
2024/4/19 2:57:59 - IT6516替代兼容方案|CS5202替代IT6516|DP转VGA方案
T6516BFN是一种高性能的单片机显示端口到VGA转换器。IT6516BFN结合DisplayPort接收器和三重DAC,通过转换功能支持DisplayPort输入和VGA输出。内置DisplayPort接收器完全符合DisplayPort 1.1a规范。IT6516BFN采用2通道HBR(高速率)显示端口接收…...
2024/4/19 21:37:00 - 【行研资料】2021职场健康需求报告全球版——附下载链接
来源 | 美世达信 在疫情期间感觉得到雇主支持的员工中,有近三分之二(62%)的人认为他们的雇主关心他们的身心健康,相比之下,在那些表示自己在疫情期间未得到支持的员工中,这一比例仅为五分之一(…...
2024/4/27 18:52:00 - 一小段Python代码,破解加密zip文件的密码
今天的文章来自盏茶作酒同学。他在老电脑中发现了一个加密的 zip 文件,于是用 Python 破解了文件密码。在破解的过程中出现了内存爆炸的问题,通过阅读 Python 源代码找到了解决方案。 下面就来给大家分享一下他的操作。 之前在家里的老电脑中ÿ…...
2024/4/19 10:08:23 - JAVA基础知识1
1 计算机基础知识 1.1 计算机 计算机(Computer)全称:电子计算机,俗称电脑。是一种能够按照程序运行,自动、高速处理数据的现代化智能电子设备。常见的形式有台式计算机、笔记本计算机。按照规模分为微型机、小型机、…...
2024/4/15 9:34:18 - 手撸设计模式之-责任链模式
手撸设计模式之-责任链模式一 、责任链模式介绍1.1 定义1.2 责任链模式UML结构图1.3 责任链模式结构详细1.3 用例代码实现二、责任链模式应用场景:2.1 场景概述2.2 场景模式图2.3 场景代码实现2.4 优缺点三、总结一 、责任链模式介绍 1.1 定义 责任链模式ÿ…...
2024/4/15 9:34:33 - S 锁与 X 锁的爱恨情仇《死磕MySQL系列 四》
一网打尽MySQL的各种锁系列文章获取MySQL各种学习资料可以联系咔咔前言一、行锁二、两阶段锁三、理解死锁四、优化你的代码尽量防止死锁五、解释死锁的两种方案六、如何解决热点数据的更新七、总结系列文章 一、原来一条select语句在MySQL是这样执行的《死磕MySQL系列 一》 二…...
2024/4/15 9:34:33 - 2104.10729阅读笔记
原文链接 https://arxiv.org/abs/2104.10729 Abstract & Introduction Abstract 目标:为了改善在低光照环境中捕捉图像的感知和可解释性 Introduction 基本任务:弱光增强 传统的弱光增强方法:直方图均衡化 【28】,【29】&…...
2024/5/3 12:49:18 - C语言I博客作业02
这个作业属于哪个课程https://bbs.csdn.net/forums/csuft_swxy_C?joinKeyrjrg8lmq4wzq-p9oj9kxrkm-1-60300df3382549104a12bbe9f193eb77&typeId17321这个作业要求在哪里https://bbs.csdn.net/topics/603005146这个作业的目标检验近期C语言的学习情况学号20218517 1. PTA作…...
2024/4/18 21:30:44 - 2021年安全员-C证考试试卷及安全员-C证考试技巧
题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:2021年安全员-C证考试试卷为正在备考安全员-C证操作证的学员准备的理论考试专题,每个月更新的安全员-C证考试技巧祝您顺利通过安全员-C证考试。 1、【多选题】安全技术…...
2024/4/23 22:50:54 - Java JSON解析---------用的时候再找,不再总结
org.json:JSON官方推荐的解析类 简单易用,通用性强,但复杂功能欠缺 package JSON;import org.json.JSONArray; import org.json.JSONObject; import org.junit.Test;import java.io.File; import java.io.FileReader; import java.util.Arr…...
2024/4/15 9:34:18 - vue创建项目都忘记了怎么办
公司给了一个比较特殊的项目,不需要使用编写前端,其他几乎都是纯后端,只有很少的几个前端页面,我还是用的LayUIJQuery做的后台页面,没做多久就看到了LayUI下线的说明,有点蕾姆~~~~~,对于后端开发…...
2024/4/23 0:51:22 - VB.Net组装xml
Private Shared Function getXML() As StringDim xmlDoc As String ""Dim text As XmlTextDim doc As New XmlDocument加入XML的声明段落 Dim node As XmlNode doc.CreateXmlDeclaration("1.0", "UTF-8", "")doc.AppendChild(node)加…...
2024/4/16 7:21:55 - 从零创建SpringBoot项目
pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…...
2024/4/15 9:34:28
最新文章
- 电脑找不到msvcp140.dll如何修复?msvcp140.dll丢失的多种解决方法分享
在日常电脑操作过程中,用户可能会遇到一个令人困扰的问题,即屏幕上突然弹出一条错误提示:“由于找不到msvcp140.dll,无法继续执行代码”。这一情况往往导致应用程序无法正常启动或运行,给工作和娱乐带来不便。不过&…...
2024/5/3 18:54:22 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - Spring集成MyBatis
基本准备 创建Dynamic Web Project 引入相关jar包 Spring框架相关jar包 MyBatis连接Spring相关jar包 连接MySQL驱动包 JSTL标签库包 添加db.properties文件,该属性文件配置连接数据库相关信息 drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/myba…...
2024/4/30 17:16:43 - java实体中返回前端的double类型四舍五入(格式化)
根据业务,需要通过后端给前端返回部分double类型的数值,一般需要保留两位小数,使用jackson转换对象 package com.ruoyi.common.core.config; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.Json…...
2024/5/1 8:51:46 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/1 17:30:59 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/2 16:16:39 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/2 9:28:15 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/2 15:04:34 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/30 22:21:04 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/1 4:32:01 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/2 9:07:46 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57