android 换行模式,Android进阶之自定义View(1)实现可换行的TextView

今天来一起学习一下最简单的自定义view,自己动手写一个MyTextView,当然不会像系统的TextView那么复杂,只是实现一下TextView的简单功能,包括分行显示及自定义属性的处理,主要目的是介绍自定义view的实现的基本思路和需要掌握的一些基础知识。

《一》先展示一下实现的最终效果

d2027fc69767

image.png

《二》实现步骤分析

1、创建MyTextView extends View,重写构造方法。一般是重写前三个构造方法,让前两个构造方法最终调用三个参数的构造方法,然后在第三个构造方法中进行一些初始化操作。

2、在构造方法中进行一些初始化操作,如初始化画笔及获取自定义属性等。

如何自定义属性?

(1)在values下创建attrs.xml.

//定义你的view可以在布局文件中配置的自定义属性

(2)获取自定义属性

TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyTextViewApprence, defStyleAttr, 0);

mText = typedArray.getString(R.styleable.MyTextViewApprence_text);

mTextColor = typedArray.getColor(R.styleable.MyTextViewApprence_textColor, Color.BLACK);

mTextSize = (int) typedArray.getDimension(R.styleable.MyTextViewApprence_textSize, 15);

showMode = typedArray.getInt(R.styleable.MyTextViewApprence_showMode, 0);

typedArray.recycle();

3、重写OnDraw()方法,在onDraw()中使用canvas绘制文字,x,y为绘制的起点。

需要注意两点:

(1)这里的x,y不是指的左上顶点,而是左下顶点。

(2)drawText绘制文字时,是有规则的,这个规则就是基线!详细可阅读drawText()详解

d2027fc69767

image.png

//绘制每行文字的建议高度为:

Paint.FontMetrics fm = mPaint.getFontMetrics();

drawTextHeight = (int) (fm.descent - fm.ascent);

绘制文字的方法:

canvas.drawText(@NonNull String text, float x, float y, @NonNull Paint paint)

4、到第三步,其实就可以绘制出文字了,但是会发现一个问题,无论在布局文件中声明控件的宽高是wrap_content和match_parent,效果都是铺满了整个屏幕,这个时候,我们就需要重写onMesure()方法来测量控件的实际大小了,分析View的源码:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),

getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));

}

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;

break;

}

return result;

}

/**MeasureSpec 封装了父控件对其孩子的布局要求

有大小和模式两种,而模式则有三种模式

public static class MeasureSpec {

private static final int MODE_SHIFT = 30;

private static final int MODE_MASK = 0x3 << MODE_SHIFT;

//父控件不强加任何约束给子控件,它可以为它逍遥的任何大小

public static final int UNSPECIFIED = 0 << MODE_SHIFT; //0

//父控件给子控件一个精确的值

public static final int EXACTLY = 1 << MODE_SHIFT; //1073741824

//父控件给子控件竟可能最大的值

public static final int AT_MOST = 2 << MODE_SHIFT; //-2147483648

//设定尺寸和模式创建的统一约束规范

public static int makeMeasureSpec(int size, int mode) {

if (sUseBrokenMakeMeasureSpec) {

return size + mode;

} else {

return (size & ~MODE_MASK) | (mode & MODE_MASK);

}

}

// 从规范中获取模式

public static int getMode(int measureSpec) {

return (measureSpec & MODE_MASK);

}

//从规范中获取尺寸

public static int getSize(int measureSpec) {

return (measureSpec & ~MODE_MASK);

}

}

关于specMode测量的几种模式,你需要知道它们的作用,如下图。

d2027fc69767

image.png

可以看到我们的源码中调用是自身的getDefaultSize()方法,然后在MeasureSpec.AT_MOST和MeasureSpec.EXACTLY全部返回的是specSize,而specSize表示的是父控件剩余宽度,也就是我们看到的全屏。所以默认onMeasure方法中wrap_content 和match_parent 的效果是一样的,都是填充剩余的空间。

所以我们重新onMesure()方法,对wrap_content这种情况进行处理。

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

//获取宽的模式

int widthMode = MeasureSpec.getMode(widthMeasureSpec);

int heightMode = MeasureSpec.getMode(heightMeasureSpec);

//获取宽的尺寸

int widthSize = MeasureSpec.getSize(widthMeasureSpec);

int heightSize = MeasureSpec.getSize(heightMeasureSpec);

Log.e("TAG", "widthMode=" + widthMode + " heightMode=" + heightMode + " widthSize=" + widthSize + " heightSize=" + heightSize);

//对wrap_content这种模式进行处理

int width;

int height;

if (widthMode == MeasureSpec.EXACTLY) {

width = widthSize;

} else {

//如果是wrap_content,我们需要得到控件需要多大的尺寸

//首先丈量文本的宽度

float textWidth;

textWidth = mTextBoundOther.width();

//控件的宽度就是文本的宽度加上两边的内边距。内边距就是padding的值,在构造方法执行完被赋值

width = (int) (getPaddingLeft() + textWidth + getPaddingRight());

}

if (heightMode == MeasureSpec.EXACTLY) {

height = heightSize;

} else {

//如果是wrap_content,我们需要得到控件需要多大的尺寸

//首先丈量文本的宽度

float textHeight = mTextBoundOther.height();

//控件的宽度就是文本的宽度加上两边的内边距。内边距就是padding的值,在构造方法执行完被赋值。遗留问题:最后一行显示高度不够,在这里加上10px处理

height = (int) (getPaddingTop() + textHeight + getPaddingBottom() + 10);

}

//保存丈量结果

setMeasuredDimension(width, height);

}

下面是实现了自动换行的TextView的完整代码:

package com.example.jojo.learn.customview;

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Rect;

import android.support.annotation.Nullable;

import android.text.TextUtils;

import android.util.AttributeSet;

import android.util.DisplayMetrics;

import android.util.Log;

import android.view.View;

import com.example.jojo.learn.R;

import java.util.ArrayList;

/**

* Created by JoJo on 2018/7/27.

* wechat:18510829974

* description:自定义Textview

*/

public class MyTextView extends View {

//文字内容

private String mText;

//文字大小

private int mTextSize;

//文字颜色

private int mTextColor;

//绘制的范围

private Rect mTextBound;

//绘制文字的画笔

private Paint mPaint;

private int mScreenWidth;

private int mScreenHeight;

private int baseLineY;

private float ascent;

private float descent;

private float top;

private float bottom;

private int baseLineX;

private Rect mMaxRect;

private Rect mTextBoundOther;

private String text = "This is a great day";

private int drawTextHeight;

public MyTextView(Context context) {

this(context, null);

}

public MyTextView(Context context, @Nullable AttributeSet attrs) {

this(context, attrs, 0);

}

public MyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyTextViewApprence, defStyleAttr, 0);

mText = typedArray.getString(R.styleable.MyTextViewApprence_text);

mTextColor = typedArray.getColor(R.styleable.MyTextViewApprence_textColor, Color.BLACK);

mTextSize = (int) typedArray.getDimension(R.styleable.MyTextViewApprence_textSize, 15);

showMode = typedArray.getInt(R.styleable.MyTextViewApprence_showMode, 0);

typedArray.recycle();

//屏幕信息

DisplayMetrics dm = getResources().getDisplayMetrics();

mScreenHeight = dm.heightPixels;

mScreenWidth = dm.widthPixels;

if (TextUtils.isEmpty(mText)) {

mText = "Hello.....Hello.....Hello.....Hello.....Hello.....Hello.....Hello.....Hello.....Hello.....Hello.....Hello....";

}

init();

}

private void init() {

//基线

baseLineY = mTextSize;

baseLineX = 0;

//初始化画笔

mPaint = new Paint();

mPaint.setColor(mTextColor);

mPaint.setTextSize(mTextSize);

mPaint.setAntiAlias(true);

mPaint.setStrokeWidth(1);

//获取绘制的宽高

mTextBound = new Rect();

mPaint.getTextBounds(text, 0, text.length(), mTextBound);

mTextBound.top = baseLineY + mTextBound.top;

mTextBound.bottom = baseLineY + mTextBound.bottom;

mTextBound.left = baseLineX + mTextBound.left;

mTextBound.right = baseLineX + mTextBound.right;

//获取文字所占区域最小矩形

Log.e("TAG", mTextBound.toShortString());

//换行的文字

mTextBoundOther = new Rect();

mPaint.getTextBounds(mText, 0, mText.length(), mTextBoundOther);

//计算各线在位置

Paint.FontMetrics fm = mPaint.getFontMetrics();

ascent = baseLineY + fm.ascent;//当前绘制顶线

descent = baseLineY + fm.descent;//当前绘制底线

top = baseLineY + fm.top;//可绘制最顶线

bottom = baseLineY + fm.bottom;//可绘制最低线

//每行文字的绘制高度

drawTextHeight = (int) (fm.descent - fm.ascent);

//字符串所占的高度和宽度

int width = (int) mPaint.measureText(mText);

int height = (int) (bottom - top);

//文字绘制时可以占据的最大矩形区域

mMaxRect = new Rect(baseLineX, (int) (baseLineY + fm.top), (baseLineX + width), (int) (baseLineY + fm.bottom));

}

private ArrayList mTextList = new ArrayList<>();

private float lineNum;//文字最终所占的行数

private float spLineNum;

//换行展示的对齐方式

private int showMode;

/**

* 测量

* 父控件不强加任何约束给子控件,它可以为它逍遥的任何大小

* public static final int UNSPECIFIED = 0 << MODE_SHIFT; //0

* 父控件给子控件一个精确的值-match_parent

* public static final int EXACTLY = 1 << MODE_SHIFT; //1073741824

* 父控件给子控件竟可能最大的值-wrap_content

* public static final int AT_MOST = 2 << MODE_SHIFT; //-2147483648

*

* @param widthMeasureSpec

* @param heightMeasureSpec

*/

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

//获取宽的模式

int widthMode = MeasureSpec.getMode(widthMeasureSpec);

int heightMode = MeasureSpec.getMode(heightMeasureSpec);

//获取宽的尺寸

int widthSize = MeasureSpec.getSize(widthMeasureSpec);

int heightSize = MeasureSpec.getSize(heightMeasureSpec);

Log.e("TAG", "widthMode=" + widthMode + " heightMode=" + heightMode + " widthSize=" + widthSize + " heightSize=" + heightSize);

//(1)实现文字自动换行显示

//文字的宽度

int mTextWidth = mTextBoundOther.width();

if (mTextList.size() == 0) {

//将文本分段

int padding = getPaddingLeft() + getPaddingRight();

int specMaxWidth = widthSize - padding;//可显示文本的最大宽度

//最大宽度大于文字所占宽度,则一行就能显示完全

if (specMaxWidth >= mTextWidth) {

lineNum = 1;

mTextList.add(mText);

} else {

//超过一行,需切割,分行显示

spLineNum = mTextWidth * 1.0f / specMaxWidth;

//如果有小数的话就进1

if ((spLineNum + "").contains(".")) {

lineNum = (float) (spLineNum + 0.5);

} else {

lineNum = spLineNum;

}

//每行展示的文字的长度

int lineLength = (int) (mText.length() / spLineNum);

for (int i = 0; i < lineNum; i++) {

String lineStr;

//判断是否可以一行展示

if (mText.length() < lineLength) {

lineStr = mText.substring(0, mText.length());

} else {

lineStr = mText.substring(0, lineLength);

}

mTextList.add(lineStr);

//内容切割完,记录切割后的字符串,重新赋值给mText

if (!TextUtils.isEmpty(mText)) {

if (mText.length() < lineLength) {

mText = mText.substring(0, mText.length());

} else {

mText = mText.substring(lineLength, mText.length());

}

} else {

break;

}

}

}

}

//(2)下面对wrap_content这种模式进行处理

int width;

int height;

if (widthMode == MeasureSpec.EXACTLY) {

width = widthSize;

} else {

//如果是wrap_content,我们需要得到控件需要多大的尺寸

//首先丈量文本的宽度

float textWidth;

if (mTextList.size() > 1) {

textWidth = widthSize;

} else {

textWidth = mTextBoundOther.width();

}

//控件的宽度就是文本的宽度加上两边的内边距。内边距就是padding的值,在构造方法执行完被赋值

width = (int) (getPaddingLeft() + textWidth + getPaddingRight());

}

if (heightMode == MeasureSpec.EXACTLY) {

height = heightSize;

} else {

//如果是wrap_content,我们需要得到控件需要多大的尺寸

//首先丈量文本的宽度

// float textHeight = mTextBoundOther.height();

float textHeight = drawTextHeight * mTextList.size();

//控件的宽度就是文本的宽度加上两边的内边距。内边距就是padding的值,在构造方法执行完被赋值。遗留问题:最后一行显示高度不够,在这里加上10px处理

height = (int) (getPaddingTop() + textHeight + getPaddingBottom() + 10);

}

//保存丈量结果

setMeasuredDimension(width, height);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

/**

* 测试文字的绘制区域

*/

// //绘制字符串所占的矩形区域

// mPaint.setColor(Color.GREEN);

// canvas.drawRect(mMaxRect, mPaint);

//

// //绘制最小矩形

// mPaint.setColor(Color.RED);

// canvas.drawRect(mTextBound, mPaint);

//

// //绘制文字-绘制的起点是:绘制文字所在矩形的左下角顶点

// mPaint.setColor(Color.WHITE);

// canvas.drawText(text, baseLineX, baseLineY, mPaint);

//

// //绘制基线

// mPaint.setColor(Color.RED);

// canvas.drawLine(0, baseLineY, mScreenWidth, baseLineY, mPaint);

//

// mPaint.setColor(Color.YELLOW);

// canvas.drawLine(0, top, mScreenWidth, top, mPaint);

// mPaint.setColor(Color.GREEN);

// canvas.drawLine(0, ascent, mScreenWidth, ascent, mPaint);

// mPaint.setColor(Color.BLACK);

// canvas.drawLine(0, descent, mScreenWidth, descent, mPaint);

// mPaint.setColor(Color.WHITE);

// canvas.drawLine(0, bottom, mScreenWidth, bottom, mPaint);

// 绘制Hello World !

// canvas.drawText(text, getWidth() / 2 - mTextBoundOther.width() / 2, getHeight() / 2 + mTextBoundOther.height() / 2, mPaint);

//分行绘制文字

for (int i = 0; i < mTextList.size(); i++) {

mPaint.getTextBounds(mTextList.get(i), 0, mTextList.get(i).length(), mTextBoundOther);

//换行左对齐展示

if (showMode == 0) {

canvas.drawText(mTextList.get(i), 0 + getPaddingLeft(), (getPaddingTop() + drawTextHeight * (i + 1)), mPaint);

} else if (showMode == 1) {

//换行居中展示

canvas.drawText(mTextList.get(i), (getWidth() / 2 - mTextBoundOther.width() / 2) + getPaddingLeft(), (getPaddingTop() + drawTextHeight * (i + 1)), mPaint);

}

}

}

/**

* 控制文字对齐方式:居中或者居左

*

* @param showMode

*/

public void reLayoutText(int showMode) {

this.showMode = showMode;

invalidate();

}

}

涉及到的自定义属性:attrs.xml中

在布局文件中使用,测试代码:

xmlns:mytext="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@color/colorAccent">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@android:color/white"

android:onClick="textLayoutLeft"

android:text="文字居左对齐" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:background="@android:color/white"

android:onClick="textLayoutCenter"

android:text="文字居中对齐" />

android:id="@+id/mytextview"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:background="@android:color/holo_red_dark"

mytext:showMode="center"

mytext:text="来一碗大的毒鸡汤:无论做什么事情,你首先要想到的不是你能得到什么,而是你能接受失去什么,当你无畏失去什么的时候,你就变得无敌了。人生最重要的不是所站的位置是所站的位置是所站的位置是所站的位置是所站的位置你来自何处并不重要,重要的是你要去往何方,人生最重要的不是所站的位置,而是所去的方向。人只要不失去方向,就永远不会失去自己!无论做什么事情,你首先要想到的不是你能得到什么,而是你能接受失去什么,当你无畏失去什么的时候,你就变得无敌了"

mytext:textColor="@android:color/white"

mytext:textSize="50px" />

欢迎各位读者一起来探索下面的待解决的问题:

1、中英文混排时展示有问题

2、最后一行测量给的高度不够,导致最后一行展示不全

3、textSize的单位,在布局文件中没有处理成sp,而是px。如果需要处理成sp,可以参考系统TextView源码。

d2027fc69767

image.png

可以参考如下处理方式:

mTextSize = (int) typedArray.getDimension(R.styleable.MyTextViewApprence_textSize, sp2px(mTextSize));

/**

* 将sp转换成px

*

* @param sp

* @return

*/

private int sp2px(int sp) {

return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp,

getResources().getDisplayMetrics());

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html调用chr,FpHtmlEnCode 函数之标题过滤特殊符号的代码

FpHtmlEnCode 函数之标题过滤特殊符号的代码更新时间&#xff1a;2007年09月01日 22:11:50 作者&#xff1a;函数名&#xff1a;FpHtmlEnCode作 用&#xff1a;标题过滤参 数&#xff1a;fString ------字符串Function FpHtmlEnCode(fString)If IsNull(fString)False or fS…

html怎么给code标签添加语言,html code标签怎么用?html code标签的作用解释

本篇文章主要的讲述了关于HTML code标签的用法解释&#xff0c;和HTML code标签的用法实例&#xff0c;最后还有code标签的总结。接下来让我们一起来看这篇文章吧首先我们先看看html code标签的用法解释:标签用于表示计算机源代码或者其他机器可以阅读的文本内容。软件代码的编…

网页挂码方式html css,CSS代码 解决网页挂马问题

CSS代码 解决网页挂马问题发布时间&#xff1a;2009-10-01 02:13:24 作者&#xff1a;佚名 我要评论两行CSS来解决网页挂马问题&#xff0c;共5种方案。两行CSS来解决&#xff0c;共5种方案一、iframe{n1ifm:expression(this.srcabout:blank,this.outerHTML);}/*这行代码是…

计算机科学系小学教育专业就业前景,小学教育专业就业方向与就业前景

【导语】现在大学生就业形势越来越严峻&#xff0c;在填报志愿时&#xff0c;如果不是特别喜欢某一专业的话&#xff0c;选一个好就业的专业就显得尤为重要了&#xff0c;就业的专业排名是很多考生和家长朋友们关心的问题&#xff0c;以下是无忧考网整理的小学教育专业就业方向…

java绘制图形代码_ImagePy_Learn | 图形学绘制代码学习:core\draw\polygonfill.py

最近在学图形学绘制&#xff0c;想到了ImagePy框架的ROI涂抹交互很方便&#xff0c;于是啃起了绘制代码。这里主要对ImagePy中一个填充工具进行难点讲解。让我们好好学习Python中的图形学绘制吧。例子代码来源&#xff1a;https://github.com/Image-Py/imagepy/blob/master/ima…

计算机管理中添加用户属性,如何在计算机右键菜单栏中添加属性选项

如何在计算机右键菜单栏中添加属性选项电脑是现在最常用的工具之一&#xff0c;有些用户想知道如何在计算机右键菜单栏中添加属性选项&#xff0c;接下来小编小编就给大家介绍一下具体的操作步骤。具体如下&#xff1a;1. 首先第一步按下【winr】快捷键打开【运行】窗口&#x…

青岛旅游学校计算机证书,【我和我的旅校】青岛旅游学校优秀毕业生郭千瑜

原标题&#xff1a;【我和我的旅校】青岛旅游学校优秀毕业生郭千瑜姓名&#xff1a;郭千瑜班主任&#xff1a;李欣专业&#xff1a;2012级中国民航大学航空班我是郭千瑜&#xff0c;2015年毕业于青岛旅游学校中国民航大学航空班&#xff0c;今年夏天&#xff0c;我就要从韩国首…

计算机网络同步技术,计算机网络同步技术

同步&#xff1a;通信双方的收发数据序列必须在时间上一致&#xff0c;以使接收方能准确地区分和接收发送方发来数据。同步方式&#xff1a;同步传输、异步传输。1.异步传输(起—止式同步方式)异步传输&#xff1a;发送端和接收端的时钟信号是各自独立的。特点&#xff1a;信息…

dts数据库迁移工具_干货分享丨DM8 DTS工具使用小技巧

DTS工具的介绍DM数据库为迁移提供了图形化工具——DTS。DTS可以从主流大型数据库迁移到DM、DM到DM、文件迁移到DM以及DM迁移到文件的功能&#xff0c;极大的简化了迁移操作&#xff0c;让数据迁移变得简单。DTS迁移步骤1.可以查看迁移帮助工具2.新建工程&#xff0c;工程名为qy…

hsv 直方图均衡化_Opencv从零开始 - 「启蒙篇」- 直方图、直方图均衡和反向投射...

本文主要介绍一些opencv关于直方图的一些知识运用&#xff0c;直方图是非常常用的图像处理方法&#xff0c;有时候在很多图像预处理中能起到特别好的效果&#xff0c;大家可以一起来学习探讨~目录直方图计算直方图直方图均衡化CLAHE 自适应均衡化2D直方图直方图反射投影直方图✏…

浙江嘉兴计算机学校排名,嘉兴计算机考研线上课程实力排名

嘉兴计算机考研线上课程实力排名冲刺分清主次现在各科的复习已经进入**后的收尾工作了&#xff0c;现在基本上就是扫除知识盲区&#xff0c;进行知识点的查缺补漏非法学法律硕士考研报考条件而且&#xff0c;妥协次就会有第二次&#xff0c;所以一开始就不要下载那些APP&#x…

b - 数据结构实验之查找二:平衡二叉树_文件系统的灵魂数据结构 B树

其实平衡二叉树的代码实现已经挺复杂的了&#xff0c;但是一山更比一山高&#xff0c;B树算法的原理和代码实现都比平衡二叉树要更为复杂。我没有让大家知难而退的意思&#xff0c;面试的时候肯定不会让你写B树这么复杂的算法&#xff0c;大家先听我讲讲B树这种数据结构的思想吧…

计算机技术如何设计酶,百人学者Nature Chemical Biology发文,发现一种设计酶的新方法...

生物通报道&#xff1a;中科院微生物研究所&#xff0c;荷兰格罗宁根大学的研究人员发表了题为“Computational redesign of enzymes for regio- and enantioselective hydroamination”的文章&#xff0c;利用计算机方法重新设计了天冬氨酸酶&#xff0c;将其转化为不对称加氢…

全国计算机二级哪几门比较热,【热】全国计算机二级office难吗

摘要&#xff1a; 【热】全国计算机二级office难吗为你介绍计算机二级office难吗 计算机二级office比较难&#xff0c;计算机二级office考试通过率大致在22%左右&#xff0c;具有一定难度。想要通过考试&#xff0c;需要多刷计算机二级office真题。 计算机二级office考试难度对…

word总页数不包含封面_6个实用的word模板,让你快速制作表格和目录

Word是我们日常办公经常用到的一款软件&#xff0c;word中自带了一些常用操作的模板&#xff0c;可以方便我们快速实现相应的需求&#xff0c;而且颜值也会提升一个档次&#xff0c;但是不过我们很多朋友都不太知道&#xff0c;今天就给大家盘点一些word中都有哪些好用的模板&a…

前端面试技巧和注意事项_前端面试百分之九十九过的技巧

2020最全的前端面试指南&#xff0c;一个多月 1.8w 字的面试经验积累&#xff0c;凭借它最终成功入职大厂……今年的金三银四刚好赶上疫情&#xff0c;很多大公司都停止招聘甚至裁员&#xff0c;想跳槽的小伙伴被打的措手不及。需求减少要求肯定随之提高&#xff0c;谨以此面经…

node获取服务器cpu信息,听说你不知道如何监控Node服务的内存?

刚开始&#xff0c;先抛出一个问题&#xff1a;你知道你们生产环境的 Node 服务平时占用内存多少吗&#xff1f;或者说是多少量级&#xff1f;山月在面试 Node 候选人时&#xff0c;这个问题足够筛掉一半的自称Node精通者&#xff0c;不过没有回答上来&#xff0c;我往往会再补…

调python返回图片_三个好习惯,帮你写好Python里的异常处理

如果你用 Python 编程&#xff0c;那么你就无法避开异常&#xff0c;因为异常在这门语言里无处不在。打个比方&#xff0c;当你在脚本执行时按 ctrlc 退出&#xff0c;解释器就会产生一个 KeyboardInterrupt 异常。而 KeyError、 ValueError、 TypeError 等更是日常编程里随处可…

如何调位置_如何知道手表是偷停还是真没动力了?看完之后你在家也能测

导读&#xff1a;石英表如果出现偷停情况&#xff0c;通常是这几个地方出现问题&#xff1a;一、线路板接触不良&#xff1b;二、电池未安装到位&#xff1b;三、电池电量不足&#xff1b;四、受力导致的电池接触不良等&#xff1b;解决方案&#xff1a;一、修复或更换线路板&a…

怎么安装aptdaemon模块_自己开发一个React Native 模块

大纲为什么需要 React Native Module如何创建一个 React Native的模块编写 Android Toast 功能模块如何调试 React Native 模块---------官方文档中未提及或者我没有找到&#xff0c;这里是我自己探索的npm 发布一个 React Native 模块&#xff08;外链接&#xff09;为什么需要…