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,一经查实,立即删除!

相关文章

shell 停止tomcat_Linux停止tomcat运行

打开终端cd /java/tomcat#执行bin/startup.sh #启动tomcatbin/shutdown.sh #停止tomcattail -f logs/catalina.out #看tomcat的控制台输出&#xff1b;#看是否已经有tomcat在运行了ps -ef |grep tomcat#如果有&#xff0c;用kill;kill -9 pid #pid 为相应的进程号例如 pe -ef |…

中国大学moocpython笔记_中国大学MOOC_高级语言程序设计(Python)笔记

一、程序设计基础1、Python历史2、Python特点Python的伪代码(形式语言)更接近于自然语言(自然语言)胶水语言3、Python的应用&#xff1a;Google、Youtube等4、IDE1)Python是解释性语言(“同声传译”)&#xff0c;支持有两种方法使用解释器&#xff1a;交互式模式(interactivemo…

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标签的用法解释:标签用于表示计算机源代码或者其他机器可以阅读的文本内容。软件代码的编…

git ssh创建分支_将git项目导入GitHub的方法(附创建分支)

前言&#xff1a;我们应该很多都会有自己的私有项目,大多情况都是存放在自己的硬盘中,今天我分享一下怎么讲自己的私有项目更新到GitHub上,这样再也不用担心项目丢失了。一&#xff1a;下载git下载链接二&#xff1a;生成.ssh下载git安装以后了我们右键单击桌面选择Git Bash He…

删除目录文件html代码,ASP创建目录、删除目录,删除文件代码范例

网站开发项目中对文件的操作是必不可少的&#xff0c;例如&#xff1a;生成HTML静态页的时候要创建HTML文件&#xff0c;生成目录文件夹&#xff0c;删除的时候删除相应的文件与目录。下面跟大家分享&#xff1a;ASP创建目录、删除目录&#xff0c;删除文件。ASP创建目录、删除…

vgc机器人编程1到13题_工业机器人编程与实操-期末试题

ABB机器人考试试题姓名&#xff1a;李智鹏班级&#xff1a;工业机器人161一、判断题(Y/N)正确填Y错误填N1&#xff0e;机械手亦可称之为机器人。(Y)2&#xff0e;完成某一特定作业时具有多余自由度的机器人称为冗余自由度机器人。(Y)3、关节空间是由全部关节参数构成的。(Y)4、…

为什么到处都在推python_Python为什么能取得越来越超然的地位

展开全部Python在人工智能领域的e69da5e887aa62616964757a686964616f31333365643632应用2016年开发语言使用情况统计机器学习与数据科学领域各语言的雇主招聘指数对比上图是利用美国职位搜索引擎 indeed.com得出的机器学习、数据科学招聘趋势&#xff0c;我们可以清楚看出&…

uploadify插件html5,免费的HTML5版uploadify送上

相信有不少同学用过uploadify这一款文件上传插件&#xff0c;它支持多文件选择、能显示进度条、可配置性高&#xff0c;总体来说是比较好用的。官网有两个版本供下载&#xff0c;分别是flash版和HTML5版。不过令人惋惜的是&#xff0c;HTML5版是收费的。活了这么多年&#xff0…

gensim提取一个句子的关键词_聊一聊 NLPer 如何做关键词抽取

微信公众号&#xff1a;NLP从入门到放弃​有兴趣的去github看更多NLP相关知识总结&#xff1a;https://github.com/DA-southampton/NLP_ability​github.com关键词的提取&#xff0c;也可以称之为文本标签提取。比如说&#xff0c;”今天这顿烧烤是真不错啊“&#xff0c;在这句…

网页挂码方式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;怎么来测试手机玩游戏的帧率情况&#xff1f;其实很简单&#xff0c;这是我第一次安装的原话&#xff0c;结果发现问题并不那么容易&#xff0c;我们之前通俗使用的测试软件要么不准、要么就太单方面啦&#xff0c;现在我们有了快否这个工具后&#xff0…

计算机应用基础的听课记录,听课记录-计算机应用基础

听课记录-计算机应用基础-Excel 2003的条件格式的应用3.单击“条件格式”对话框中的“格式”按钮&#xff0c;弹出“单元格格式”对话框&#xff0c;设置字形为加粗&#xff0c;颜色为红色&#xff0c;底纹为黄色。4.单击“确定”按钮&#xff0c;返回“条件格式”对话框。 二、…

微型计算机原理risc,微型计算机原理习题及解答-20210409003329.docx-原创力文档

????????微机原理习题1、微处理器、微型计算机和微型计算机系统三者之间冇什么不同&#xff1f;答&#xff1a;微型计算机系统&#xff1a;包括微型计算机的硬件系统利必箜的系统软件。微型计算机的换件系统包括&#xff1a;微型计算机和外例设备.微型计算机&#xff1…

请描述定时器初值的计算方式_单片机C语言编程中定时器初值计算的两种方法...

单片机C语言编程中&#xff0c;定时器的初值对于初学者真的是比较不好计算&#xff0c;因此我总结了以下几种方法。第1种方法&#xff1a;#define FOSC 11059200L //晶振的频率#define TIMS (65536-FOSC/12/1000) //12T mode 对于8051系列单片机通用//#define TIMS (65536-FOSC…

fortify hp 价格_惠普推出“惠普Fortify软件安全中心套件”

近日&#xff0c;惠普今天宣布推出一套自动化和管理企业应用安全的新产品&#xff0c;包括唯一一款整合的应用安全测试解决方案&#xff0c;既可以在企业内部部署&#xff0c;也可以按需使用支持成千上万种的应用漏洞扫描。应用漏洞给企业带来巨大威胁&#xff0c;使企业遭受日…

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

【导语】现在大学生就业形势越来越严峻&#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…

2017qs计算机专业排名,2018年度QS世界大学专业排名|2017QS精算专业排名

出国留学网权威发布2016年度QS世界大学专业排名&#xff0c;更多2016年度QS世界大学专业排名相关信息请访问出国留学网。传播学/媒体研究 Communication&Media Studies001南加州大学University of Southern California002威斯康星大学麦迪逊分校University of Wisconsin-Ma…

曲奇云盘资源搜索引擎_曲奇云盘下载-曲奇云盘官网版v3.2.4-sosyes

手机里面有太多的文件存储不下&#xff0c;不舍得舍弃&#xff0c;不妨下载曲奇云盘进行存储&#xff0c;将会在这为你带来更多云盘服务&#xff0c;你可以在这了解到更多资源下的存储服务&#xff0c;还可以在这进行免费空间下的拓展&#xff0c;为你带来更多文档线上的观看服…