安卓自定义View文章数据滚动显示数值

2023-05-16

本文已经在微信公众号【Android群英传】发表。

未经允许不得转载。
转载请注明作者AndroidMsky及原文链接
http://blog.csdn.net/androidmsky/article/details/53009886
本文Github代码链接
https://github.com/AndroidMsky/RandomTextView

Github代码已经更新为v1.3

2017年6月13日,我们加入了对view状态的监听。Activity退出,view自动销毁。不用重写onestroy了

@Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        destroy();
    }

2016年11-30号,一位热心同学私信我反映会出现内存泄漏问题。特别推出v1.2检测并且,解决内存泄漏问题,并讲述一下,看过本文的直接点传送门。

2.v1.2更新内容

2016年11月11号,RandomTextView第一次更新为v1.1版本吧。
(解决了这样一个场景,一个抽奖的页面想滚动30秒,可能maxline加到100行的数字滚动,对此我要对性能进行优化避免过度绘制,在本文最后做出解释)

Github代码已经更新为v1.1

1.v1.1更新内容

先看看X金APP的效果:

这里写图片描述

我们自己实现的效果:

这里写图片描述

接下来介绍一下我的自定义View RandomTextView的用法和原理

用法

1.仓库

Add it in your root build.gradle at the end of repositories:

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
Step 2. Add the dependency

    dependencies {
            compile 'com.github.AndroidMsky:RandomTextView:v1.3'
    }

2.考入

RandomTextView.java

只有200行绝对轻量方便。

xml中定义:

<com.example.liangmutian.randomtextview.view.RandomTextView
        android:id="@+id/rtv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:padding="0px"
        android:text="123456"
        android:textSize="28sp"/>

很开心的事,RandomTextView继承自TextView所以可以使用TextView的所有方法。color,size等等直接去定义就OK啦。

所有位数相同速度滚动:

mRandomTextView.setText("876543");
mRandomTextView.setPianyilian(RandomTextView.ALL);
mRandomTextView.start();

从左到右侧由快到慢滚动:

mRandomTextView.setText("12313288");
mRandomTextView.setPianyilian(RandomTextView.FIRSTF_FIRST);
mRandomTextView.start();

从左到右侧由慢到快滚动:

mRandomTextView.setText("9078111123");
mRandomTextView.setPianyilian(RandomTextView.FIRSTF_LAST);
mRandomTextView.start();

自定义每位数字的速度滚动(每帧滚动的像素):

mRandomTextView.setText("909878");
        pianyiliang[0] = 7;
        pianyiliang[1] = 6;
        pianyiliang[2] = 12;
        pianyiliang[3] = 8;
        pianyiliang[4] = 18;
        pianyiliang[5] = 10;
        mRandomTextView.setPianyilian(pianyiliang);
        mRandomTextView.start();

自定义滚动行数(默认10行):

mRandomTextView.setMaxLine(20);

放置泄漏

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mRandomTextView.destroy();
    }

原理

用TextView去绘制10(maxLine可设置)行文字,调用canvas.drawText去绘制出来,在绘制的Y坐标不断增加便宜量,去改变绘制的高度,通过handler.postDelayed(this, 20);不断增加偏移量,并且不断判断所有位数字最后一行绘制完毕的时候,结束handler的循环调用。

需要的变量:

//高位快
    public static final int FIRSTF_FIRST = 0;
    //高位慢
    public static final int FIRSTF_LAST = 1;
    //速度相同
    public static final int ALL = 2;
    //用户自定义速度
    public static final int USER = 3;
    //偏移速度类型
    private int pianyiliangTpye;

    //   滚动总行数 可设置
    private int maxLine = 10;
    //   当前字符串长度
    private int numLength = 0;
    //   当前text
    private String text;


    //滚动速度数组
    private int[] pianyilianglist;
    //总滚动距离数组
    private int[] pianyiliangSum;
    //滚动完成判断
    private int[] overLine;

    private Paint p;
    //第一次绘制
    private boolean firstIn = true;
    //滚动中
    private boolean auto = true;

    //text int值列表
    private ArrayList<Integer> arrayListText;

    //字体宽度
    private float f0;

    //基准线
    private int baseline;

OnDraw方法:

@Override
    protected void onDraw(Canvas canvas) {

        if (firstIn) {
            firstIn = false;
            super.onDraw(canvas);
            p = getPaint();
            Paint.FontMetricsInt fontMetrics =                p.getFontMetricsInt();
            baseline = (getMeasuredHeight() - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;
            float[] widths = new float[4];
            p.getTextWidths("9999", widths);
            f0 = widths[0];
            invalidate();
        }
        drawNumber(canvas);

第一次进入onDraw方法时,做了如下几件事情:
1.去获取当前正确的画笔p = getPaint();从而保证xml中配置的大小颜色等有效。
2.通过当前画笔去计算正确的drawText基准线。
baseline = (getMeasuredHeight() - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;
3.等到数字的宽度。方便横向绘制。
p.getTextWidths(“9999”, widths);f0 = widths[0];
4.直接通知view重绘。
invalidate();

我们自己的绘制drawNumber方法:

private void drawNumber(Canvas canvas) {

        for (int j = 0; j < numLength; j++) {

            for (int i = 1; i < maxLine; i++) {


                if (i == maxLine - 1 && i * baseline + pianyiliangSum[j] <= baseline)

                {
                    pianyilianglist[j] = 0;
                    overLine[j] = 1;
                    int auto = 0;
                    for (int k = 0; k < numLength; k++) {
                        auto += overLine[k];
                    }
                    if (auto == numLength * 2 - 1) {
                        this.auto = false;
                        handler.removeCallbacks(task);
                        invalidate();
                    }

                }
                if (overLine[j] == 0)

                    canvas.drawText(setBack(arrayListText.get(j), maxLine - i - 1) + "", 0 + f0 * j,
                            i * baseline + pianyiliangSum[j], p);

                else {
                    //定位后画一次就好啦
                    if (overLine[j] == 1) {
                        overLine[j]++;
                        canvas.drawText(arrayListText.get(j) + "", 0 + f0 * j,
                                baseline, p);
                    }

                    //break;
                }}
            }}

这里逻辑想对复杂时间复杂度达到了O(绘制行数*字符串位数),是个双重循环的绘制。
第一层我们称之为J循环,J循环每次循环的内容是绘制一列。
第二层循环称之为I循环,I循环负责绘制每行的每一个字符。

每次进入I循环的第一件事情是检查当前字符位,是不是最后一个

if (i == maxLine - 1 && i * baseline + pianyiliangSum[j] <= baseline)

如果是,则归零便宜量,修改标志位

pianyilianglist[j] = 0;
overLine[j] = 1;

之后去判段所有字符位是否全部绘制到最后一个:

int auto = 0;
for (int k = 0; k < numLength; k++) {
auto += overLine[k];}
if (auto == numLength * 2 - 1) {
this.auto = false;
handler.removeCallbacks(task);
invalidate();}

如果是则讲自动循环刷新的方法取消掉,并且通知view进行最后一次定位绘制。
以上就是进入i循环先对是否绘制结束的判断。

如果没有结束那么继续绘制:

if (overLine[j] == 0)

                    canvas.drawText(setBack(arrayListText.get(j), maxLine - i - 1) + "", 0 + f0 * j,i * baseline +pianyiliangSum[j], p);
else {
if (overLine[j] == 1) {
//定位后画一次就好啦
overLine[j]++;
canvas.drawText(arrayListText.get(j) + "", 0 + f0 * j,
baseline, p);
}
                }

overLine[j]中的值的意思为:0表示还没绘制到最后一行,1表示为绘制到最后一行没有进行最后的定位绘制,2表示已经进行了定位绘制。

可能对于初学者最难的就是drawText的坐标问题,x坐标比较简单
就是字符的宽度并且随着循环去变化:

0 + f0 * j

Y坐标就是当前行的基准值+上当前便宜量:

i * baseline + pianyiliangSum[j]

每隔20毫秒去计算当前便宜量并通知刷新view:

private final Runnable task = new Runnable() {

        public void run() {
            // TODO Auto-generated method stub
            if (auto) {
                handler.postDelayed(this, 20);

                for (int j = 0; j < numLength; j++) {
                    pianyiliangSum[j] -= pianyilianglist[j];

                }
                invalidate();
            }

        }
    };

帮助计算9上面的是几。8上面是几

//设置上方数字0-9递减
    private int setBack(int c, int back) {

        if (back == 0) return c;

        back = back % 10;

        int re = c - back;

        if (re < 0) re = re + 10;

        return re;
    }

讲字符串转换为INT数组:

 private ArrayList<Integer> getList(String s) {

        ArrayList<Integer> arrayList = new ArrayList<Integer>();

        for (int i = 0; i < s.length(); i++) {

            String ss = s.substring(i, i + 1);

            int a = Integer.parseInt(ss);

            arrayList.add(a);
        }
        return arrayList;

    }

v1.2更新内容

v1.2更新内容:
解决内存泄漏问题,
看到泄可能有点手抖,不过面对现实。
上图:

这里写图片描述

如果反复选择屏幕让Activty重新创建,就会出现内存泄漏,安利给大家内存泄漏检测工具:leakcanary:https://github.com/square/leakcanary
配置十分简单先是引用:(2016.11.30版本)

 debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
    testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'

然后:

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        if (LeakCanary.isInAnalyzerProcess(this)) {
            // This process is dedicated to LeakCanary for heap analysis.
            // You should not init your app in this process.
            return;
        }
        LeakCanary.install(this);
    }
}

如果检测activity的泄漏问题,可以开启旋转屏幕一旋转就重新创建activity了,这样就反反复复创建activity。如上图泄漏问题就会被推送出来,而且明确告诉你是什么样一个引用链导致的泄漏。工具很强大有么有。本文框架的问题就是,如果RandomTextview的动画没有停止,那么activity就不会被释放掉,这样就造成了泄漏,所以在activity中写入:


    @Override
    protected void onDestroy() {
        super.onDestroy();
        mRandomTextView.destroy();
    }

并且提供destroy方法:

 public void destroy (){
        auto=false;
        handler.removeCallbacks(task);

    }

欢迎大家提出各种问题,让控件越来越好用谢谢。
2016.11.30 Androidmsky

v1.1更新内容

v1.1更新内容:

之前我们的思路是按照maxLine画出每一行,但是我们最多看见2行内容,这样是不科学的,完全中了过度绘制的圈套呀,再想如下一个场景,一个抽奖的页面想滚动30秒,可能maxline加到100行的数字滚动,那每帧都要绘制100行的text这显然会出现性能问题,造成掉帧的影响,所以我们队drawtext方法进行一下拦截,新建一个drawText方法:

private void drawText(Canvas mCanvas,String text,float x,float y,Paint p){

        if (y>=-measuredHeight&&y<=2*measuredHeight)

        mCanvas.drawText(text + "", x,
                y, p);
        else return;
    }

我们对y坐标进行判断,如果在textView上下各一个textView大小内,我们进行绘制,如果超出这个范围我们直接return,不做任何处理,这样既不影响我们的绘制逻辑又解决了过渡绘制问题。
讲原来的drawText方法替换:

 drawText(canvas,arrayListText.get(j) + "", 0 + f0 * j,
                                        baseline, p);
                       // canvas.drawText(arrayListText.get(j) + "", 0 + f0 * j,
                        //        baseline, p);

作者将持续维护该框架,也希望大家star,fork,issue。

共同做出一个更好的RandomTextView

2016.11.11 Androidmsky

回顾

在自定义view的时候如果你的view是像本文一样,循环去绘制不断刷新的话,就意味着onDraw方法会随着你view的帧数不断的被调用,一秒可能被执行几十次,所以写在这里的方法,一定要小心为妙,比如一些无需每次都初始化的变量切记不可以定义在onDraw方法里,比如本文的getText();方法去获取当前TextView的内容,就要写在外面。但是可能有些方法你必须在super.onDraw(canvas),以后才可以获取的比如getPaint();那么我们就可以加个布尔值firstIn来控制只有第一次进入onDraw方法才去执行,或者其它的只做一次的事情都可以这样去控制。

循环绘制动画效果我们一定要理清两条线,一条是每一帧绘制什么,另一条是动画结束你都绘制了什么。

第一条线应该注意你绘制的只是一个瞬间,是个不断重复执行的线。

第二条线就是无数个第一条线加上时间点共同组成的,主要就是控制每次的不同,比如本文中增加的偏移量,是数据(本文中每一个字符的坐标)的变化,去影响onDraw方法,绘制出不通的东西呈现在屏幕上。第二条线还要控制好什么时候结束所有的第一条线,也就是整个动画结束的条件,本文中的例子讲是一旦所有字符的最后一行都超过或者等于TextView的基准线,那么整个动画结束。

绘制原理的逻辑就讲完啦,RandomTextView可以投入使用啦,自定义view并不难,只要你知道安卓API能让你能干什么,你想干什么,你可能马上就知道你应该怎么做啦。

欢迎关注作者。欢迎评论讨论。欢迎拍砖。

如果觉得这篇文章对你有帮助 欢迎打赏,

欢迎star,Fork我的github。

喜欢作者的也可以Follow。也算对作者的一种支持。
本文Github代码链接
https://github.com/AndroidMsky/RandomTextView

欢迎加作者自营安卓开发交流群:308372687
这里写图片描述

博主原创未经允许不许转载。

—————————————————————————————

作者推荐:

安卓自定义view滚动数据显示
http://blog.csdn.net/androidmsky/article/details/53009886
RecyclerView下拉刷新分页加载性能优化和Gilde配合加载三部曲
http://blog.csdn.net/androidmsky/article/details/53115818
打造企业级网络请求框架集合retrofit+gson+mvp
http://blog.csdn.net/androidmsky/article/details/52882722
安卓手机自动接起QQ视频秒变摄像头
http://blog.csdn.net/androidmsky/article/details/53066441

—————————————————————————————

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安卓自定义View文章数据滚动显示数值 的相关文章

  • ubuntu下解决高并发socket最大连接数限制,tcp默认1024个连接

    nux系统默认ulimit为1024个访问 用户最多可开启的程序数目 一般一个端口 xff08 即一个进程 xff09 的最高连接为2的16次方65536 通过这个命令 ulimit n 可以看到默认值为1024 查看全局文件句柄数限制 系
  • Linux下实现Post方式

    首先了解HTTP协议各字段的含义 xff0c 以下是部分较好的归纳 xff1a HTTP一个HTTP请求报文由请求行 xff08 request line xff09 请求头部 xff08 header xff09 空行和请求数据4个部分组
  • vins中的坐标系变换及g2r函数

    slam中经常会需要表示一个刚体的位姿 例如imu的位姿 xff0c 相机的位姿 首先我们需要在一个刚体上架上一个坐标系 这个坐标系为本体坐标系 怎么架一个坐标系 xff1f imu本身就有规定其本身的x y z轴的方向 相机一般认为 xf
  • yolo_v3安装试运行小记

    github源代码 xff1a https github com qqwweee keras yolo3 Cuda下载地址 xff1a https developer nvidia com cuda toolkit archive Cudn
  • pytorch安装使用

    pytorch官网 xff1a https pytorch org get started locally conda添加清华源 xff1a conda config add channels https mirrors tuna tsin
  • ORB_SLAM3初试

    源码地址 xff1a orb salm3 github 论文地址 orb slam3 paper ORB SLAM3提供了单目 xff0c 双目 xff0c rgbd 以及各自结合IMU的数据分析实现 demo运行效果展示 xff1a 在不
  • vins-fusion代码解读[五] imu在vins里的理解

    SLAM新手 xff0c 欢迎讨论 IMU作用 vins中 xff0c IMU只读取IMU六轴的信息 xff0c 3轴线加速度 xff08 加速度计 xff09 和3轴角速度 xff08 陀螺仪 xff09 通过对陀螺仪的一次积分 xff0
  • Gazebo仿真学习——2.为Gazebo中的机器人添加实用插件

    Gazebo plugins in ROS 1 要了解2 插件类型3 添加一个ModelPlugin4 添加一个SensorPlugin5 gazebo plugins中的所有可用插件5 1 Camera5 2 GPU Laser xff0
  • 一款直播电视接口分析

    一 初步了解 最近对一款网络电视app进行分析 xff0c 要求是找到其访问直播源的接口 xff0c 初次打开apk xff0c 先做一个简单的了解 xff0c 并没有加固等处理 xff0c 只是对代码做了混淆处理 我们目的是找到其访问直播
  • android串口通讯

    一 配置 1 下载文件 https github com cepr android serialport api 2 复制android serialport api文件夹至app src main java 3 复制jni文件至app s
  • boost库介绍以及使用

    C 43 43 boost库介绍以及使用 一 什么是boost库 boost 库是一个优秀的 xff0c 可移植的 xff0c 开源的 C 43 43 库 xff0c 它是由 C 43 43 标准委员会发起的 xff0c 其中一些内容已经成
  • 内存映射文件

    内存映射文件 本文给出了一种方便实用的解决大文件的读取 存储等处理的方法 xff0c 并结合相关程序代码对具体的实现过程进行了介绍 引言 文件操作是应用程序最为基本的功能之一 xff0c Win32 API和MFC均提供有支持文件处理的函数
  • 如何在Eclipse中使用Ruby开发工具(RDT)插件进行Ruby开发

    一 为什么使用Ruby xff1f 现在 xff0c 为什么众多的Java开发者都关注Ruby xff1f Ruby xff0c 是10年以前在日本创建的一种通用目的脚本语言 xff0c 这是一种纯面向对象的语言 不同于 Java技术 xf
  • Open eyes in your life

    读到几个故事 xff0c 希望和大家分享 一 成功无捷径 Be proactive 一个青年职员平时工作懒懒散散 xff0c 在转正前一个月他问老板 xff1a 如果我兢兢业业工作一个月 xff0c 我能转正吗 xff1f 老板答道 xff
  • Ruby菜鸟必读http://blog.csdn.net/leasun/archive/2004/06/16/9836.aspx

    作者 xff1a William Djaja Tjokroaminata 目录 资源 1 利用警告信息 2 交互式命令解释器 xff08 Interactive shell xff09 3 联机文档 4 Class method 5 从字符
  • 毕业生收入最高的前30所大学排行榜

    毕业生收入最高的前30所大学排行榜 1 北大 123023 2 清华 118712 3 北邮 98712 4 中科大 87623 5 西电 82312 6 南京大学 78620 7 北理工 76228 8 外交学院 75667 9 国际关系
  • 世界500强面试题(情商部分)

    情商 xff08 1 xff09 1 什么书中毛病最多 xff1f 2 为什么好马不吃回头草 xff1f 3 什么东西说 父亲 是不会相碰 xff0c 叫 爸爸 时却会碰到两次 xff1f 4 农夫养10头牛 xff0c 只有19只角 xf
  • 苏浙差距!江苏经济何以难敌浙江http://bbs.icxo.com/dispbbs.asp?boardID=1894&ID=100323&page=1

    进入21世纪 xff0c 江苏经济虽然也以高于全国平均速度在增长 xff0c 但以民间资本为主的浙江经济则以高于江苏经济增长速度在发展 更为引人注目的是 xff0c 2004年下半年起 xff0c 依靠外力和政府强势推动的江苏出现了边际生产
  • 公司注册流程

    项目 xff1a 首先你要明白经商成功与否的关键在于是否有一个好的项目 xff0c 而不在于没有本钱 xff0c 怎么找到一个好项目 这个因人而异 xff0c 因地而异 xff0c 不能作具体讨论 基本上要根据你自身的综合的特点来选择行业和
  • 安卓高级xml布局(一)高级输入框EditText设计

    安卓高级xml布局 xff08 一 xff09 高级输入框EditText设计 转载请注明来源 代码连接 http download csdn net detail androidmsky 9274037 欢迎加安卓开发交流群 xff1a

随机推荐

  • SIP协议详解

    SIP协议基本介绍 背景介绍 Internet的许多应用都需要建立和管理一个会话 xff0c 会话在这里的含义是在参与者之间的数据的交换 由于考虑到参与者的实际情况 xff0c 这些应用的实现往往是很复杂的 xff1a 参与者可能是在代理间
  • STL容器的适用情况(转)

    原文 xff1a http hsw625728 blog 163 com blog static 3957072820091116114655254 vector 典型的序列容器 xff0c C 43 43 标准严格要求次容器的实现内存必须
  • 嵌入式STM32入门之STM32中断——点灯实验、串口通信

    STM32中断实验 一 前言二 实验要求三 中断介绍四 CuBe实现中断点灯 xff08 1 xff09 新建工程 xff08 2 xff09 设置管脚 xff08 3 xff09 设置NVIC xff08 4 xff09 配置中断优先级
  • 制作个人网站 之 人生进度条

    来源 xff1a 仿照 uTools里的人生进度条插件用页面的形式写出 目的 xff1a 做个人网站的目的就是把看到的变成自己实现的案例 这些值由后台数据库获取 这里写死了 你的名字 你打算活到几岁 你的生日 时钟为罗盘时钟 在jq插件网找
  • 从零入门激光SLAM(六)——ROS常用工具箱

    大家好呀 xff0c 我是一个SLAM方向的在读博士 xff0c 深知SLAM学习过程一路走来的坎坷 xff0c 也十分感谢各位大佬的优质文章和源码 随着知识的越来越多 xff0c 越来越细 xff0c 我准备整理一个自己的激光SLAM学习
  • STM32串口收发处理

    STM32串口收发 STM32的串口接收和发送方式都有三种情况 xff0c 即轮询 中断和DMA xff0c 俩俩组合便有9种可能的组合 下面挑出其中三种收发方式进行研究 xff0c 以及优缺点比较 一 中断接收 轮询发送 xff0c 无缓
  • STM32学习笔记一(LED,跑马灯,呼吸灯)

    本人是初学者 xff0c 水平有限 xff0c 写个简单的学习笔记方便大家参考 xff0c 同时也方便自己查缺补漏 STM32学习一 1 点亮板上的LED小灯 首先 xff0c 我们在点灯之前还要看看LED的硬件连接 看到硬件电路后 xff
  • 打造企业级网络请求框架集合retrofit+gson+mvp(一、二)

    本文是企业级网络框架第二篇主要讲MVP模式和Gson在Retrofit网络请求框架下的使用方式 xff08 已更新为一篇 xff09 对MVP不了解的请看 梦之鬼索MVP模式在Android中的设计和实现 http blog csdn ne
  • Python解析GPGGA报文_统计数据完整率

    相信很多人在拿到一款新的GNSS接收机的时候 xff0c 都在想如何评估这个设备的性能 评估GNSS设备性能的方法很多 xff0c 如统计GGA的固定率 数据完整率 连续运行时间的稳定性等等 下面我们就从数据的完整率来入手分析GNSS接收机
  • 头文件中只能声明变量不能定义变量 而声明变量必须带extern,为什么头文件中变量的声明都没有加

    xfeff xfeff 1 头文件中不可以放变量的定义 xff01 一般头文件中只是放变量的声明 xff0c 因为头文件要被其他文件包含 include xff0c 如果把定义放在头文件的话 xff0c 就不能避免多次定义变量 C 43 4
  • 三轴磁力计解算姿态(四元数)

    原理 根据地磁场向量在水平面上的投影来计算载体的偏航角 xff0c 类似于加速度计解算姿态 xff0c 不同在于磁场易受干扰 xff0c 且只能得到偏航角 方法 假设导航坐标系为东北天 xff0c 载体坐标系为右前上 初始载体坐标系和导航坐
  • VRPN的使用

    VRPN是作为一个设备服务的角色 根据自己的设备来配置VRPN xff0c 随后就能够以标准方式 xff0c 非常容易的连接到该服务来获取自己设备的数据 VRPN是跨平台的 xff0c 可以再许多OS上运行 xff0c 包括Windows
  • Keil调试局部变量显示"not in scope"的问题解决

    今天在调试程序的时候 xff0c 发现函数返回值赋值给变量时 xff0c 变量值总是显示 34 not in scope 34 xff0c 无法看到变量被赋的值 出现这种情况的原因是这个局部变量没被分配到内存 xff0c 或者变量被编译器优
  • STM32串口中断的方式发送

    我将其改为真正的中断发送 步骤一 xff1a 初始化GPIO GPIO InitTypeDef GPIO InitStructure GPIO InitStructure GPIO Pin 61 GPIO Pin 10 LED1 PC10
  • 可综合的异步fifo设计(一)

    异步FIFO设计 一 基本概念二 设计思路2 1 设计前准备工作2 1 1 系统框图2 1 2 格雷码基础2 1 3 异步fifo工作流程举例2 1 4 异步fifo空满标志产生的算法设计 2 2 RTL建模2 2 1 DPRAM建模2 2
  • Unity学习(六):Unity中的实例化炮弹并设置速度

    1 static function Instantiate original Object position Vector3 rotation Quaternion Object 可用于prefab的拷贝 Instantiates 10 c
  • Unity学习(十一): Unity中的NetWork使用

    先说一下一些基本概念吧 xff01 复习复习 NAT 穿透技术 NAT 即Network Address Translation xff0c 可译为网络地址转换或网络地址翻译 网络地址转换 NAT Network Address Trans
  • ubuntu提示opengl版本过低-Gallium0.4 on llvmpipe(llvm 3.8 128bits)

    在ubuntu14 04下写GLSL xff0c 需要GLSL 4 0 以上的支持 xff0c 但是编译运行的时候 xff0c 提示我opengl和glsl版本过低 xff0c 只支持1 3 我xx xff0c 我用的卡是Geforce G
  • C#中的继承规则

    1 继承可传递 C从B派生 B从A派生 xff0c 则C不仅继承了B中的成员 xff0c 同时也获得了A中的成员 Object类为所有类的基类 2 派生类是对基类的扩展 xff0c 可以添加新成员 xff0c 但不能除去已经继承的成员的定义
  • 安卓自定义View文章数据滚动显示数值

    本文已经在微信公众号 Android群英传 发表 未经允许不得转载 转载请注明作者AndroidMsky及原文链接 http blog csdn net androidmsky article details 53009886 本文Gith