Spannable配合AnimationDrawable实现TextView中展示Gif图片

辣的原理解释,反正大家也不爱看,所以直接上代码了

长这样,下面两个图是gif,会动的。
在这里插入图片描述

package com.example.myapplication;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;import java.io.InputStream;public class GifDrawable extends AnimationDrawable {private int mCurrentIndex = 0;private UpdateListener mListener;public GifDrawable(Context context, InputStream source,UpdateListener listener) {mListener = listener;GifHelper decoder = new GifHelper();decoder.read(source);// 遍历gif图像里面的每一帧,放进animation frame中for (int i = 0; i < decoder.getFrameCount(); i++) {Bitmap bitmap = decoder.getFrame(i);BitmapDrawable drawable = new BitmapDrawable(context.getResources(), bitmap);// 为每一帧设置边界drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());addFrame(drawable, decoder.getDelay(i));if (i == 0) {// 为容器设置一个边界setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());}}}/*** 继续下一帧,同时通知监听器*/public void nextFrame() {// 当循环到最后一帧时,索引就会为0,注意索引比帧的数量小1mCurrentIndex = (mCurrentIndex + 1) % getNumberOfFrames();if (mListener != null) {mListener.update();}}/*** 返回当前帧的显示时间** @return*/public int getFrameDuration() {return getDuration(mCurrentIndex);}/*** 返回当前帧的图片** @return*/public Drawable getDrawable() {return getFrame(mCurrentIndex);}/*** 该接口通知监听器更新/重绘界面** @author moon*/public interface UpdateListener {void update();}public void setUpdateListener(UpdateListener listener) {this.mListener = listener;}
}
package com.example.myapplication;import java.io.InputStream;
import java.util.Vector;import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;//Handler for read & extract Bitmap from *.gif
public class GifHelper {// to define some error typepublic static final int STATUS_OK = 0;public static final int STATUS_FORMAT_ERROR = 1;public static final int STATUS_OPEN_ERROR = 2;protected int status;protected InputStream in;protected int width; // full image widthprotected int height; // full image heightprotected boolean gctFlag; // global color table usedprotected int gctSize; // size of global color tableprotected int loopCount = 1; // iterations; 0 = repeat foreverprotected int[] gct; // global color tableprotected int[] lct; // local color tableprotected int[] act; // active color tableprotected int bgIndex; // background color indexprotected int bgColor; // background colorprotected int lastBgColor; // previous bg colorprotected int pixelAspect; // pixel aspect ratioprotected boolean lctFlag; // local color table flagprotected boolean interlace; // interlace flagprotected int lctSize; // local color table sizeprotected int ix, iy, iw, ih; // current image rectangleprotected int lrx, lry, lrw, lrh;protected Bitmap image; // current frameprotected Bitmap lastImage; // previous frameprotected int frameindex = 0;public int getFrameindex() {return frameindex;}public void setFrameindex(int frameindex) {this.frameindex = frameindex;if (frameindex > frames.size() - 1) {frameindex = 0;}}protected byte[] block = new byte[256]; // current data blockprotected int blockSize = 0; // block size// last graphic control extension infoprotected int dispose = 0;// 0=no action; 1=leave in place; 2=restore to bg; 3=restore to prevprotected int lastDispose = 0;protected boolean transparency = false; // use transparent colorprotected int delay = 0; // delay in millisecondsprotected int transIndex; // transparent color indexprotected static final int MaxStackSize = 4096;// max decoder pixel stack size// LZW decoder working arraysprotected short[] prefix;protected byte[] suffix;protected byte[] pixelStack;protected byte[] pixels;protected Vector<GifFrame> frames; // frames read from current fileprotected int frameCount;// to get its Width / Heightpublic int getWidth() {return width;}public int getHeigh() {return height;}/*** Gets display duration for specified frame.* 获得当前帧的延迟时间* @param n*            int index of frame* @return delay in milliseconds*/public int getDelay(int n) {delay = -1;if ((n >= 0) && (n < frameCount)) {delay = ((GifFrame) frames.elementAt(n)).delay;}return delay;}public int getFrameCount() {return frameCount;}/*** 获取首帧的图片*/public Bitmap getImage() {return getFrame(0);}public int getLoopCount() {return loopCount;}protected void setPixels() {int[] dest = new int[width * height];// fill in starting image contents based on last image's dispose codeif (lastDispose > 0) {if (lastDispose == 3) {// use image before lastint n = frameCount - 2;if (n > 0) {lastImage = getFrame(n - 1);} else {lastImage = null;}}if (lastImage != null) {lastImage.getPixels(dest, 0, width, 0, 0, width, height);// copy pixelsif (lastDispose == 2) {// fill last image rect area with background colorint c = 0;if (!transparency) {c = lastBgColor;}for (int i = 0; i < lrh; i++) {int n1 = (lry + i) * width + lrx;int n2 = n1 + lrw;for (int k = n1; k < n2; k++) {dest[k] = c;}}}}}// copy each source line to the appropriate place in the destinationint pass = 1;int inc = 8;int iline = 0;for (int i = 0; i < ih; i++) {int line = i;if (interlace) {if (iline >= ih) {pass++;switch (pass) {case 2:iline = 4;break;case 3:iline = 2;inc = 4;break;case 4:iline = 1;inc = 2;}}line = iline;iline += inc;}line += iy;if (line < height) {int k = line * width;int dx = k + ix; // start of line in destint dlim = dx + iw; // end of dest lineif ((k + width) < dlim) {dlim = k + width; // past dest edge}int sx = i * iw; // start of line in sourcewhile (dx < dlim) {// map color and insert in destinationint index = ((int) pixels[sx++]) & 0xff;int c = act[index];if (c != 0) {dest[dx] = c;}dx++;}}}image = Bitmap.createBitmap(dest, width, height, Config.ARGB_4444);}/*** 获得索引帧的图片* * @param n* @return*/public Bitmap getFrame(int n) {Bitmap im = null;if ((n >= 0) && (n < frameCount)) {im = ((GifFrame) frames.elementAt(n)).image;}return im;}/*** 获得下一帧的图片* * @return*/public Bitmap nextBitmap() {frameindex++;if (frameindex > frames.size() - 1) {frameindex = 0;}return ((GifFrame) frames.elementAt(frameindex)).image;}public int nextDelay() {return ((GifFrame) frames.elementAt(frameindex)).delay;}// to read & parse all *.gif stream/*** 这里开始读取输入流,后面进行解析* * @param is* @return*/public int read(InputStream is) {init();if (is != null) {in = is;readHeader();if (!err()) {readContents();if (frameCount < 0) {status = STATUS_FORMAT_ERROR;}}} else {status = STATUS_OPEN_ERROR;}try {is.close();} catch (Exception e) {e.printStackTrace();}return status;}protected void decodeImageData() {int NullCode = -1;int npix = iw * ih;int available, clear, code_mask, code_size, end_of_information, in_code, old_code, bits, code, count, i, datum, data_size, first, top, bi, pi;if ((pixels == null) || (pixels.length < npix)) {pixels = new byte[npix]; // allocate new pixel array}if (prefix == null) {prefix = new short[MaxStackSize];}if (suffix == null) {suffix = new byte[MaxStackSize];}if (pixelStack == null) {pixelStack = new byte[MaxStackSize + 1];}// Initialize GIF data stream decoder.data_size = read();clear = 1 << data_size;end_of_information = clear + 1;available = clear + 2;old_code = NullCode;code_size = data_size + 1;code_mask = (1 << code_size) - 1;for (code = 0; code < clear; code++) {prefix[code] = 0;suffix[code] = (byte) code;}// Decode GIF pixel stream.datum = bits = count = first = top = pi = bi = 0;for (i = 0; i < npix;) {if (top == 0) {if (bits < code_size) {// Load bytes until there are enough bits for a code.if (count == 0) {// Read a new data block.count = readBlock();if (count <= 0) {break;}bi = 0;}datum += (((int) block[bi]) & 0xff) << bits;bits += 8;bi++;count--;continue;}// Get the next code.code = datum & code_mask;datum >>= code_size;bits -= code_size;// Interpret the codeif ((code > available) || (code == end_of_information)) {break;}if (code == clear) {// Reset decoder.code_size = data_size + 1;code_mask = (1 << code_size) - 1;available = clear + 2;old_code = NullCode;continue;}if (old_code == NullCode) {pixelStack[top++] = suffix[code];old_code = code;first = code;continue;}in_code = code;if (code == available) {pixelStack[top++] = (byte) first;code = old_code;}while (code > clear) {pixelStack[top++] = suffix[code];code = prefix[code];}first = ((int) suffix[code]) & 0xff;// Add a new string to the string table,if (available >= MaxStackSize) {break;}pixelStack[top++] = (byte) first;prefix[available] = (short) old_code;suffix[available] = (byte) first;available++;if (((available & code_mask) == 0)&& (available < MaxStackSize)) {code_size++;code_mask += available;}old_code = in_code;}// Pop a pixel off the pixel stack.top--;pixels[pi++] = pixelStack[top];i++;}for (i = pi; i < npix; i++) {pixels[i] = 0; // clear missing pixels}}protected boolean err() {return status != STATUS_OK;}// to initia variablepublic void init() {status = STATUS_OK;frameCount = 0;frames = new Vector<GifFrame>();gct = null;lct = null;}protected int read() {int curByte = 0;try {curByte = in.read();} catch (Exception e) {status = STATUS_FORMAT_ERROR;}return curByte;}protected int readBlock() {blockSize = read();int n = 0;if (blockSize > 0) {try {int count = 0;while (n < blockSize) {count = in.read(block, n, blockSize - n);if (count == -1) {break;}n += count;}} catch (Exception e) {e.printStackTrace();}if (n < blockSize) {status = STATUS_FORMAT_ERROR;}}return n;}// Global Color Tableprotected int[] readColorTable(int ncolors) {int nbytes = 3 * ncolors;int[] tab = null;byte[] c = new byte[nbytes];int n = 0;try {n = in.read(c);} catch (Exception e) {e.printStackTrace();}if (n < nbytes) {status = STATUS_FORMAT_ERROR;} else {tab = new int[256]; // max size to avoid bounds checksint i = 0;int j = 0;while (i < ncolors) {int r = ((int) c[j++]) & 0xff;int g = ((int) c[j++]) & 0xff;int b = ((int) c[j++]) & 0xff;tab[i++] = 0xff000000 | (r << 16) | (g << 8) | b;}}return tab;}// Image Descriptorprotected void readContents() {// read GIF file content blocksboolean done = false;while (!(done || err())) {int code = read();switch (code) {case 0x2C: // image separatorreadImage();break;case 0x21: // extensioncode = read();switch (code) {case 0xf9: // graphics control extensionreadGraphicControlExt();break;case 0xff: // application extensionreadBlock();String app = "";for (int i = 0; i < 11; i++) {app += (char) block[i];}if (app.equals("NETSCAPE2.0")) {readNetscapeExt();} else {skip(); // don't care}break;default: // uninteresting extensionskip();}break;case 0x3b: // terminatordone = true;break;case 0x00: // bad byte, but keep going and see what happensbreak;default:status = STATUS_FORMAT_ERROR;}}}protected void readGraphicControlExt() {read(); // block sizeint packed = read(); // packed fieldsdispose = (packed & 0x1c) >> 2; // disposal methodif (dispose == 0) {dispose = 1; // elect to keep old image if discretionary}transparency = (packed & 1) != 0;delay = readShort() * 10; // delay in millisecondstransIndex = read(); // transparent color indexread(); // block terminator}// to get Stream - Headprotected void readHeader() {StringBuffer id = new StringBuffer();for (int i = 0; i < 6; i++) {id.append((char) read());}if (!id.toString().startsWith("GIF")) {status = STATUS_FORMAT_ERROR;return;}readLSD();if (gctFlag && !err()) {gct = readColorTable(gctSize);bgColor = gct[bgIndex];}}protected void readImage() {// offset of Xix = readShort(); // (sub)image position & size// offset of Yiy = readShort();// width of bitmapiw = readShort();// height of bitmapih = readShort();// Local Color Table Flagint packed = read();lctFlag = (packed & 0x80) != 0; // 1 - local color table flag// Interlace Flag, to array with interwoven if ENABLE, with order// otherwiseinterlace = (packed & 0x40) != 0; // 2 - interlace flag// 3 - sort flag// 4-5 - reservedlctSize = 2 << (packed & 7); // 6-8 - local color table sizeif (lctFlag) {lct = readColorTable(lctSize); // read tableact = lct; // make local table active} else {act = gct; // make global table activeif (bgIndex == transIndex) {bgColor = 0;}}int save = 0;if (transparency) {save = act[transIndex];act[transIndex] = 0; // set transparent color if specified}if (act == null) {status = STATUS_FORMAT_ERROR; // no color table defined}if (err()) {return;}decodeImageData(); // decode pixel dataskip();if (err()) {return;}frameCount++;// create new image to receive frame dataimage = Bitmap.createBitmap(width, height, Config.ARGB_4444);// createImage(width, height);setPixels(); // transfer pixel data to imageframes.addElement(new GifFrame(image, delay)); // add image to frame// listif (transparency) {act[transIndex] = save;}resetFrame();}// Logical Screen Descriptorprotected void readLSD() {// logical screen sizewidth = readShort();height = readShort();// packed fieldsint packed = read();gctFlag = (packed & 0x80) != 0; // 1 : global color table flag// 2-4 : color resolution// 5 : gct sort flaggctSize = 2 << (packed & 7); // 6-8 : gct sizebgIndex = read(); // background color indexpixelAspect = read(); // pixel aspect ratio}protected void readNetscapeExt() {do {readBlock();if (block[0] == 1) {// loop count sub-blockint b1 = ((int) block[1]) & 0xff;int b2 = ((int) block[2]) & 0xff;loopCount = (b2 << 8) | b1;}} while ((blockSize > 0) && !err());}// read 8 bit dataprotected int readShort() {// read 16-bit value, LSB firstreturn read() | (read() << 8);}protected void resetFrame() {lastDispose = dispose;lrx = ix;lry = iy;lrw = iw;lrh = ih;lastImage = image;lastBgColor = bgColor;dispose = 0;transparency = false;delay = 0;lct = null;}/*** Skips variable length blocks up to and including next zero length block.*/protected void skip() {do {readBlock();} while ((blockSize > 0) && !err());}// to store *.gif data, Bitmap & delay/*** 帧对象,包含图片和延迟时间* * @author moon* */private class GifFrame {// to access image & delay w/o interfacepublic Bitmap image;public int delay;public GifFrame(Bitmap im, int del) {image = im;delay = del;}}}
package com.example.myapplication;import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Paint.FontMetricsInt;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.text.style.DynamicDrawableSpan;public class AnimatedImageSpan extends DynamicDrawableSpan {private Drawable mDrawable;public AnimatedImageSpan(Drawable d) {super();mDrawable = d;// 用handler 通知继续下一帧final Handler mHandler = new Handler();mHandler.post(new Runnable() {@Overridepublic void run() {((GifDrawable) mDrawable).nextFrame();// 设置下一个的延迟取决于当前帧的持续时间mHandler.postDelayed(this,((GifDrawable) mDrawable).getFrameDuration());}});}@Overridepublic Drawable getDrawable() {return ((GifDrawable) mDrawable).getDrawable();}/*** 代码跟父类代码相似,就是getCachedDrawable()替换成getDrawable(),因为前者里面的图片是WeakReference,* 容易被gc回收,所以这里要避免这个问题*/@Overridepublic int getSize(Paint paint, CharSequence text, int start, int end,FontMetricsInt fm) {Drawable d = getDrawable();Rect rect = d.getBounds();if (fm != null) {fm.ascent = -rect.bottom;fm.descent = 0;fm.top = fm.ascent;fm.bottom = 0;}return rect.right;}/*** 代码跟父类代码相似,就是getCachedDrawable()替换成getDrawable(),因为前者里面的图片是WeakReference,* 容易被gc回收,所以这里要避免这个问题*/@Overridepublic void draw(Canvas canvas, CharSequence text, int start, int end,float x, int top, int y, int bottom, Paint paint) {// TODO Auto-generated method stubDrawable b = getDrawable();canvas.save();int transY = bottom - b.getBounds().bottom;if (mVerticalAlignment == ALIGN_BASELINE) {transY -= paint.getFontMetricsInt().descent;}canvas.translate(x, transY);b.draw(canvas);canvas.restore();}
}
package com.example.myapplicationimport android.os.Bundle
import android.text.Spannable
import android.text.SpannableStringBuilder
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatTextViewclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val content ="金融监督管理总局相关负责人介绍,将加大支持力度、优化金融服务,尤其是切实服务扩大内需。接下来将采取针对性措施,引导银行保险机构支持增强发展动能,优化经济结构,推动经济持续回升向好。数据显示,6 月末信用卡、汽车和其他综合消费贷款比年初增加 7100 多亿元,上半年基础设施建设贷款余额同比多增1.05万亿元,制造业贷款余额同比多增 1800多亿元。6月末民营企业贷款余额同比增长 13.1%。"val tvVoiceContent = findViewById<AppCompatTextView>(R.id.tvVoiceContent)val sb = SpannableStringBuilder()sb.append(content)val dummyText = "dummy"sb.append(dummyText)sb.setSpan(AnimatedImageSpan(GifDrawable(this, assets.open("temp.gif")) { tvVoiceContent.postInvalidate() }),sb.length - dummyText.length,sb.length,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)tvVoiceContent.text = sb}
}

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

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

相关文章

初步制作做一个AI智能工具网站,持续更新

文章目录 介绍AI对话AI绘画AI音视频AI图片处理AI小工具体验 介绍 网页有五大部分&#xff1a;AI对话、AI绘画、AI音视频、AI 图片处理、AI小工具。 AI对话 AI对话是指人工智能技术在模拟人类对话交流方面的应用。通过使用自然语言处理和机器学习算法&#xff0c;AI对话系统可…

Python爬虫-抓取的目标数据为#x开头,怎么解决?

前言 本文是该专栏的第4篇,后面会持续分享python爬虫案例干货,记得关注。 在做爬虫项目的时候,有时候抓取的平台目标数据为&#x开头,如下图所示: 浏览器显示的正常数据,但通过爬虫协议获取到的网页源码数据却是以&#x开头的隐藏数据,遇到这种情况,爬虫需要怎么处…

百度资深PMO阚洁受邀为第十二届中国PMO大会演讲嘉宾

百度在线网络技术&#xff08;北京&#xff09;有限公司资深PMO阚洁女士受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;运筹于股掌之间&#xff0c;决胜于千里之外 —— 360斡旋项目干系人。大会将于8月12-13日在北京举办&#xff0c;…

详解C语言中的int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t

2023年8月8日&#xff0c;周二上午 目录 为什么会产生int8_t、uint8_t等这类数据类型int8_t、uint8_t等这类数据类型有什么用头文件int8_t、uint8_t等这类数据类型是怎么实现的 为什么会产生int8_t、uint8_t等这类数据类型 根本原因在于&#xff0c;C 语言标准只是规定了各个…

day6 STM32时钟与定时器

STM32时钟系统的概述 概念 时钟系统是由振荡器&#xff08;信号源&#xff09;、定时唤醒器、分频器等组成的电路。 常用的信号有晶体振荡器和RC振荡器。 意义 时钟是嵌入式系统的脉搏&#xff0c;处理器内核在时钟驱动下完成指令执行&#xff0c;状态变换等动作&#xff…

pytest fixture 高级使用

一、fixture中调用fixture 举例&#xff1a; 输出&#xff1a; 说明&#xff1a;登录fixture 作为参数传递到登出方法中&#xff0c;登录方法的返回值就可以被登出方法使用 二、在fixture中多参数的传递&#xff08;通过被调用函数传参&#xff09; 举例&#xff1a; 输出&a…

Kafka 01——Kafka的安装及简单入门使用

Kafka 01——Kafka的安装及简单入门使用 1. 下载安装1.1 JDK的安装1.2 Zookeeper的安装1.2.1 关于Zookeeper版本的选择1.2.2 下载、安装Zookeeper 1.3 kafka的安装1.3.1 下载1.3.2 解压1.3.3 修改配置文件 2. 启动 kafka2.1 Kafka启动2.2 启动 kafka 遇到的问题2.2.1 问题12.2.…

《高性能MySQL》——查询性能优化(笔记)

文章目录 六、查询性能优化6.1 查询为什么会慢6.2 慢查询基础&#xff1a;优化数据访问6.2.1 是否向数据库请求了不需要的数据查询不需要的记录多表关联时返回全部列总是取出全部列重复查询相同的数据 6.2.2 MySQL 是否在扫描额外的记录响应时间扫描的行数与返回的行数扫描的行…

项目实战 — 消息队列(8){网络通信设计①}

目录 一、自定义应用层协议 &#x1f345; 1、格式定义 &#x1f345; 2、准备工作 &#x1f384;定义请求和响应 &#x1f384; 定义BasicArguments &#x1f384; 定义BasicReturns &#x1f345; 2、创建参数类 &#x1f384; 交换机 &#x1f384; 队列 &#x1f38…

Linux常用命令学习总结

Linux命令分类 1. Linux目录操作命令2. Linux文件名称3. Linux磁盘命令4. Linux进程与防火墙5. Linux用户与组的关系6. Linux权限操作(chmod命令)7. Linux中的文件类型文件所有者修改 最近系统地学习下Linux命令的使用&#xff0c;因此作如下记录&#xff0c;以便随时复习和翻阅…

windows 安装免费3用户ccproxy ubuntu 代理上网

Windows 上进行安装 ubuntu 上进行设置 方法一 (临时的手段) 如果仅仅是暂时需要通过http代理使用apt-get&#xff0c;您可以使用这种方式。 在使用apt-get之前&#xff0c;在终端中输入以下命令&#xff08;根据您的实际情况替换yourproxyaddress和proxyport&#xff09;。 终…

NetSuite 固定资产租赁101

目录 前言 1.新租赁准则的相关内容 1.1 主要变化 1.2 IFRS 16/ASC 842/CAS 21的区别与联系 1.3 新租赁准则实行的意义 2.NetSuite中的租赁功能 2.1 概述 2.2 设置 2.2.1 相关科目设置 2.2.2 资产类型设置 2.3 功能详细说明 2.3.1 案例一 2.3.2 案例二 3.新租赁准则…

ubuntu切换python版本

在没有安装类似anoconda的管理工具的时候&#xff0c;我们常常会被Ubuntu下的Python版本切换问题所头疼。 可以使用update-alternatives工具进行python版本的任意切换 当使用update-alternatives工具来切换Ubuntu系统上的Python版本时&#xff0c;您实际上是在系统范围内选择…

week4刷题

题解: F(n)F(n−1)F(n−2) 由于斐波那契数存在递推关系&#xff0c;因此可以使用动态规划求解。动态规划的状态转移方程即为上述递推关系&#xff0c;边界条件为 F(0)F(0)F(0) 和 F(1)F(1)F(1)。 class Solution { public:int fib(int n) {int MOD 1000000007;if (n < 2)…

6.pip简介,第三方库的安装

引言 使用过Visual Studio的小伙伴可能对npm不陌生,没错,pip与npm的功能是一样的。 首先要知道,Python这门语言拥有着丰富的标准库以及先辈们开发的各种功能强大的第三方库。而今天我们主要学习的呢就是关于Python中的包管理工具。它是Python的默认软件包管理工具,可以方便…

mybatis如何生成和执行动态sql

文章目录 1. 相关代码2. SQL 语句解析流程2.1 XMLStatementBuilder2.2 SqlSource2.3 DynamicContext上下文2.4 SqlNode和组合模式2.5 MappedStatement2.6 解析标签2.6.1 \<include>2.6.2 \<selectKey>2.6.3 处理 SQL 语句 3. 获取真正执行的sql 1. 相关代码 packa…

棒球在国际上的流行·棒球1号位

棒球在国际上的流行 1. 棒球的起源与历史 棒球的起源源于美国。19世纪中叶&#xff0c;由于美国领土的扩张&#xff0c;当时的美国殖民地的印第安人将棒球类游戏&#xff0c;带到了当时的弗吉尼亚州的奥克兰。后来&#xff0c;棒球运动流传到了加利福尼亚州的圣迭戈。早期的棒…

LeetCode--HOT100题(25)

目录 题目描述&#xff1a;141. 环形链表&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;141. 环形链表&#xff08;简单&#xff09; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连…

QtCreator ui设置界面 Layout 的属性 layoutStretch

layoutStretch 用于控制Layout在被用户进行缩放时。里面控件的缩放比例。如一个水平布局里面有两个控件 一个 QLineEdit 和 QPushButton。首先将两个控件的尺寸策列的水平策略都设置为Expanding。此时在将包含这两个控件的水平布局的 layoutStretch 进行如下设置。 运行程序就…

利用python实现网络设备配置批量上传和批量下载功能

利用python实现网络设备配置批量上传和批量下载功能 利用ensp实现网络设备和物理主机互通配置网络设备配置批量上传功能配置批量下载功能常见问题 提示&#xff1a; 本文章代码所使用目录均使用相对目录&#xff0c;只需将配置存放目录和文件下载目录&#xff08;已用符号标出…