android图形动画

Android动画总结系列(6)——矢量图形与矢量动画 本文总结了矢量图形和矢量动画的使用方法。 阅读详情

学习View的时候看到的,记录下

Android图形动画

作者 朱才:http://cnblogs.com/zhucai/

朱才 微博:http://weibo.com/zhucai

2017/8/17 14:26:19

动画基础

本质

每帧绘制不同的内容。

基本过程

开始动画后,调用View的invalidate触发重绘。重绘后检查动画是否停止,若未停止则继续调用invalidate触发下一帧(下一次重绘),直到动画结束。

重绘时View的draw方法会被调用,根据动画的进行绘制不同的内容,如某个被绘制元素的大小变化、角度旋转、透明度变化等,这样即会产生动画。

动画的推进过程一般都会有一个变化量,这个变量会被用到draw方法内元素的绘制。一般的变量都是时间,也可以是手指移动、传感器等任何其他的变量。

Android中的动画支持

Animation:早期实现的让View整体做动画的类。能让View做Matrix(移动、缩放、旋转、3D旋转)和Alpha(透明)的动画。

Animator:有硬件加速后为做动画实现的类。能方便的让View整体做动画;也可以只产生随时间变化的变量,用来在onDraw里做绘图级的动画。比Animation灵活很多。

AnimationDrawable:图片逐帧动画。主要用来播放提前制作好的动画。

在哪个级别做动画

让整个View做动画(比如整个View平移、旋转等)很简单方便,一般调用几行代码就行。我把它称作View级的动画。

在View的draw/onDraw里通过Canvas来绘制时做动画更灵活,更精细,能力更强大。我把它称作绘图级的动画。(View级的动画本质上也是这么做的,只是Android系统帮我们做了大部分工作)

绘图级的动画

这篇文章主要讲绘图级的动画。

下面来一段绘图级动画的典型实现:

class MyView extends View {
    void startAnimator() {
        ValueAnimator animator = ValueAnimator.ofFloat(1f, 0f);
        animator.start();
        invalidate();
    }
    protected void onDraw(Canvas canvas) {
        if (animator.isRunning()) {
            float ratio = (Float)animator.getAnimatedValue();
            canvas.rotate(ratio*360);
            canvas.drawBitmap(bitmap, 0, 0, null);

            invalidate();
        }
        ...
    }
}

有了不断变化的ratio变量,绘图级动画就可以大展身手了。

绘图级动画的强大能力来自绘图API的强大能力,下面主要讲绘图API。

绘图API

Matrix

Canvas.[translate,scale,rotate,skew]方法

Matrix.set/pre/post[translate,scale,rotate,skew]方法

平移、缩放、旋转、斜切。

从使用API的角度来看,我们通过调用Canvas.translate等方法,可以使后续在此Canvas上绘制操作的绘制区域变化,如translate(5,0),则后续所有绘制操作的绘制区域都会向右移动5个像素。

原理:Canvas里有一个Matrix,Canvas上的这几个调用都会最终调用到Matrix.pre*。这个Matrix保存整个变换过程。当有Canvas.draw时,要绘制的点都会经过Matrix.mapPoints方法做一个映射。于是产生我们期望的变换效果。(事实上映射的时候只需要映射关键点,其他的是插值来的)

关于Matrix的更多信息

set/pre/post的区别:set是设置,冲掉以前的数据。pre是前乘,post是后乘,根本上讲就是生效顺序不同。具体表现效果可在网上搜索资料。

setPolyToPoly:与mapPoints方法相反,mapPoints是通过矩阵把原始点映射为目标点。setPolyToPoly是输入原始点和映射后的目标点,计算出这个矩阵。

Camera:有透视效果的3D旋转。Camera是一个生成Matrix的工具类。可用来生成有透视效果的3D旋转。

Canvas.draw*方法
Canvas.draw-Point/s

Canvas.draw-Line/s

Canvas.draw-Rect,RoundRect,Circle,Oval,Arc,Path

Canvas.draw-Text

Canvas.draw-Bitmap,BitmapMesh

Canvas.draw-Color,Paint

这些方法都表示绘制一个区域。绘制的区域中究竟填充什么颜色,由Paint决定。

Color,Paint,Bitmap,BitmapMesh这几个则除了指定绘制区域外,还指定了填充内容。

Path功能比较强大,可自行组织成任何形状,还可以用贝塞尔曲线。

这些方法基本上都很好理解,从名字上即可看出其功能。这里重点提一下drawBitmapMesh。

drawBitmapMesh是输入一个网格模型,绘制出的图片内容将依据这个网格来扭曲。可以想像成把图片画在一块有弹性的布上,当我们把布的某些区域扯动的时候,会形成画面扭曲效果。

示例:假设有个30x30大小的图片,我们建立这样的网格输入:

0,0,    15,0,   30,0,

0,15,   15,15,  30,15,

0,30,   15,30,  30,30

则图片会原样输出,没有任何扭曲。

如果我们建立这样的网格输入:

0,0,    15,12,  30,0,

0,15,   15,15,  30,15,

0,30,   15,30,  30,30

则原本[15,0]的点会被绘制到[15,12]的位置上去。图片绘制出来后,上面部分会缺一块,形成用手把图片从上边中间位置往下拉的扭曲效果。但很锐利,上面缺的一块是个三角形而不会是半圆型,通常我们希望的是半圆型,这就需要我们把这个网格建得密一些。

Alpha通道

每个Color里可以有四个通道ARGB,其中RGB是红绿蓝,A即Alpha通道,它通常的作用是用来作为此颜色的透明度。

因为我们的显示屏是没法透明的,因此最终显示在屏幕上的颜色里可以认为没有Alpha通道。Alpha通道主要在两个图像混合的时候生效。

默认情况下,当一个颜色绘制到Canvas上时的混合模式是这样计算的:(RGB通道) 最终颜色 = 绘制的颜色 + (1 - 绘制颜色的透明度) × Canvas上的原有颜色。

注意:

1.这里我们一般把每个通道的取值从0到255映射到0到1的浮点数表示。

2.这里等式右边的“绘制的颜色”、“Canvas上的原有颜色”都是经过预乘了自己的Alpha通道的值。如绘制颜色:0x88ffffff,那么参与运算时的每个颜色通道的值不是1.0,而是(1.0 * 0.53125 = 0.53125)。

使用这种方式的混合,就会造成后绘制的内容以半透明的方式叠在上面的视觉效果。

其实还可以有不同的混合模式供我们选择,用Paint.setXfermode,指定不同的PorterDuff.Mode。

下表是各个PorterDuff模式的混合计算公式:(D指原本在Canvas上的内容dst,S指绘制输入的内容src,a指alpha通道,c指RGB各个通道)

ADD     Saturate(S + D)  
CLEAR   [0, 0]  
DARKEN  [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)]  
DST     [Da, Dc]  
DST_ATOP    [Sa, Sa * Dc + Sc * (1 - Da)]  
DST_IN  [Sa * Da, Sa * Dc]  
DST_OUT     [Da * (1 - Sa), Dc * (1 - Sa)]  
DST_OVER    [Sa + (1 - Sa)*Da, Rc = Dc + (1 - Da)*Sc]  
LIGHTEN     [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)]  
MULTIPLY    [Sa * Da, Sc * Dc]  
SCREEN  [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]  
SRC     [Sa, Sc]  
SRC_ATOP    [Da, Sc * Da + (1 - Sa) * Dc]  
SRC_IN  [Sa * Da, Sc * Da]  
SRC_OUT     [Sa * (1 - Da), Sc * (1 - Da)]  
SRC_OVER    [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc]  
XOR     [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]  

可以发现,我们之前的默认混合模式其实就是SRC_OVER。

通过选择其他的PorterDuff模式,我们可以达到一些特殊的效果:

使用DST_OVER的话,相当于后绘制的内容作为背景在底下。

使用DST_IN/DST_OUT的话,可以裁剪Canvas里的内容,或用一张带alpha的图片mask指定哪些区域显示/不显示。

通过选择SRC_ATOP可以只在Canvas上有内容(不透明)的地方绘制。

用一张示例图来查看使用不同模式时的混合效果(src表示输入的图,dst表示原Canvas上的内容):

填充颜色

之前说过Canvas.draw*指定了绘制的区域。而区域里的填充颜色是由Paint来指定的。

Paint.setColor指定纯色。

Paint.setShader可指定:BitmapShader, LinearGradient, RadialGradient, SweepGradient, ComposeShader。

BitmapShader:图片填充。

LinearGradient, RadialGradient, SweepGradient:渐变填充。

ComposeShader:叠加前面的某两种。可选择PorterDuff混合模式。

如果既调用了setColor,又调用了setShader,则setShader生效。如果同时用setColor或setAlpha设置了透明度,则透明度也会生效。(会和Shader的透明度叠加)

如果使用drawBitmap输入一个只有alpha的图片(可用Bitmap.extractAlpha方法获得),则会以alpha图片为mask,绘制出shader/color的颜色。

ColorFilter

通过ColorFilter可以对一次绘制的所有像素做一个通用处理。

Paint.setColorFilter: LightingColorFilter, PorterDuffColorFilter, ColorMatrixColorFilter。

这可以整体上改变这一次draw的内容,比如让颜色更暗、更亮等。

这里重点介绍下ColorMatrixColorFilter。

ColorMatrix是4x5矩阵,定义其每个元素如下:

{ a, b, c, d, e,

 f, g, h, i, j,

k, l, m, n, o,

p, q, r, s, t }

则ColorMatrix的最终运算方式如下:

R' = a*R + b*G + c*B + d*A + e;
G' = f*R + g*G + h*B + i*A + j;
B' = k*R + l*G + m*B + n*A + o;
A' = p*R + q*G + r*B + s*A + t;

可在这里方便的试验flash在线版。

绘图API架构

整个绘制流水线大概如下:(我们能定义的部分用蓝色表示)

考虑动画实现的时候一般从两个角度来思考:

宏观角度:有几个变化量,分别是什么。动画从开始到结束的流程。

微观角度:从某一帧上去想,在变化量为某个数值时的图像,该怎么绘制。

把这两者分开去想,就会比较清晰。

PPT里有示例,可以参照DEMO来熟悉:

怎么做动画.ppt

Android图形系统简介.ppt

GraphicsDemo.apk

GraphicsDemo_src.zip

PPT中的内容:

Canvas.draw*

Point/s
Line/s
Rect, RoundRect, Circle, Oval, Arc, Path
Text
Bitmap, BitmapMesh
Color, Paint

填充色:setColor or setShader (设置Shader后,Color的alpha仍会生效,RGB无效)
BitmapShader, LinearGradient, RadialGradient, SweepGradient, ComposeShader

BitmapShader比直接drawBitmap多哪些能力:

  1. Tile控制:重复、镜面重复。
  2. 绘制各种形状下的图片,drawBitmap只限于矩形。
  3. 配合ComposeShader,可和其他Shader一起用PorterDuff模式混合。(比如做渐变倒影)
案例1:圆形进度条
  1. 方法一:多图法。

    制作足够多的图片文件,比如100张,序号为1的为1%的进度图。

    当要显示百分之几的时候就读取并绘制哪张图。

    伪代码:
    void drawFrame(Canvas canvas, float ratio) {
    根据ratio读取对应图片;
    canvas.draw读取出的图片;
    }

  2. 方法二:逐像素改图法。

    基于方法一,但只制作100%时的圆环图片。

    当要显示百分之几的时候,在内存里修改这个图的拷贝,使其只包含需要的部分。然后绘制它。

    关键部分伪代码:
    int[] pixels;
    bitmap.getPixels(pixels…);
    for循环 (遍历每个像素点) {
    根据像素点位置决定像素是否保留,不该显示的则:pixels[i]=0;
    }
    drawBitmap(pixels,…);

    备注:可以不用int[]而改用Bitmap,用setPixel修改每一个像素,但这样setPixel方法调用会成为性能瓶颈。

  3. 方法三:PorterDuff层层绘制法。

    制作100%时的图片:圆环图片。

    当要显示百分之几的时候,先在一个离屏缓冲(可以是临时的Bitmap)里绘制纯色的百分比,再用Paint.setXfermode(PorterDuff.SRC_IN)的方式绘制圆环图片。然后绘制这个离屏缓冲。

    关键部分伪代码:
    创建离屏缓冲:canvas.saveLayer(…);
    绘制纯色的百分比扇形:canvas.drawArc(ratio*360,…);
    设置模式:paint.setXfermode(SRC_IN);
    绘制圆环图片:canvas.drawBitmap(圆环图片,paint);
    将离屏缓冲绘制到canvas上:canvas.restore();

    备注:

    1. 绘图顺序反过来是不行的。
    2. 如果此时Canvas上对应区域是空的,则不需要用离屏缓冲.
  4. 方法四:Shader一次绘制法。

    制作100%时的图片:圆环图片。创建一个BitmapShader对应此图片。

    当要显示百分之几的时候,直接用drawArc绘制,将上面的BitmapShader作为参数。

    关键部分伪代码:
    BitmapShader bitmapShader = new BitmapShader(圆形图片…);
    paint.setShader(bitmapShader);

    canvas.drawArc(…, paint);

案例2:散落
分析

对逐个pixel进行操作是唯一选择。

实现方式

开始动画前将Bitmap内容取到int[] pixels中。
创建一个相同大小的数组存放每个pixel的额外信息,如这个点每次位移多少。
初始化时用随机数或根据动画需要生成出额外信息。
开始动画后每帧draw之前先调用一个updatePixels方法来更新pixels的信息,这里会根据额外信 息对每个点做移动。然后drawBitmap(pixels,…)。

性能优化

这里的updatePixels会是显著的性能瓶颈,因此所有优化点都在它身上。

  1. C++实现updatePixels方法。

  2. 用双缓冲模式。updatePixels操作在后台线程计算。这样计算和draw就是并行的。

  3. 还可利用多核,分块计算updatePixels。

  4. 动画时图片分辨率降低。比如长宽各除以2,用1个点代表之前的4个点。这样计算量就是之前的1/4了。

案例2:圆形进度2 (带拖影效果的圆形进度条)

分析

和上一个比,这个的每一帧需要两个变化量,一个总体进度,一个拖影长度。

“多图法”在这里搞不定。

“逐像素改图法”仍然可用。

“PorterDuff层层绘制”需要结合Shader才行。

“Shader一次绘制”也要使用PorterDuff模式,在这里仍然是最佳的。(ComposeShader)

Shader一次画法

设计师将红色拖影设计成一张圆环状的图片,图片里的红色都是一样的,不需要渐变。

用ComposeShader来绘制红色拖影,包含一个SweepGradient和一个BitmapShader,用PorterDuff模式DST_IN。
在SweepGradient上需要设置localMatrix,通过matrix旋转来跟随动画的旋转(否则需要不停创建SweepGradient)。

将ComposeShader以drawArc的方式绘制出来。拖影的长度通过drawArc的参数控制。

[悲剧的是,我在米3尝试做这个的DEMO的时候发现调用drawArc来绘制ComposeShader有bug,于是放弃。]

案例3:桌面图标按下状态

分析

由于图标有第三方的,不全是我们自己能控制的,因此“多图法”不可用。

“逐像素改图法”仍可用。

“PorterDuff层层绘制”可以用。

“Shader一次绘制”也可以用。

这里还有一种新方法:“ColorFilter法”。

ColorFilter法

三种ColorFilter在这里都可以达到效果:LightingColorFilter, PorterDuffColorFilter,ColorMatrixColorFilter。

LightingColorFilter(0xff555555, 0x00000000)

PorterDuffColorFilter(0xAA000000, Mode.SRC_ATOP)

ColorMatrixColorFilter(new float[]{
        0.3f, 0f, 0f, 0f, 0f,
        0f, 0.3f, 0f, 0f, 0f,
        0f, 0f, 0.3f, 0f, 0f,
        0f, 0f, 0f, 1f, 0f,
})
案例4:变黑白

分析

由于彩色变黑白这一点比较特殊,因此这里的关键点是怎么得到黑白图片。

逐个像素更改仍然是可以的。

这里衍生出一个方法:动画前用上面方式生成一张完全黑白的图。然后同时叠加显示两张图,彩色的图alpha从1到0,黑白的图从0到1。这样达到慢慢过渡的效果。很多类似的过渡效果都可以这样。

还有个方法,之前提到ColorMatrix可以更改饱和度,因此可以在这里使用。先找到将颜色变纯黑白的ColorMatrix,然后在每帧动画的时候以插值的方式更改ColorMatrix即可。

案例5:倒影

分析

逐个像素更改可以。

Drawable层层绘制可以。

ComposeShader一次绘制也可以:ComposeShader:LinearGradient+BitmapShader(SRC_IN)

[备注:scale(1, -1)会使绘制是倒过来的。]

案例6:阿拉灯神灯

分析

这个典型的画面扭曲,适合用drawBitmapMesh。

提前构建好drawBitmapMesh需要的参数buffer,每次draw的时候根据进度更新这个buffer即可。

具体的构建方式请看DEMO源码。

自己:
说实话最后那点没看懂

微信小程序 - 从 webgl 画布中截图放到 2d布中再保存成图片 webgl 画布无法直接保存为图片,所以要转一手。先从 webgl 中取出像素,填充到 2d 画布。然后再从 2d画布保存图片。 阅读详情

相关推荐

36、Android开发:动画、插值与图形绘制

本文详细介绍了Android开发中的动画实现、插值操作以及图形绘制的基础与进阶知识。内容涵盖动画的创建流程、常见问题解答、Canvas绘图基础与技巧,并通过一个Canvas演示应用帮助读者实践绘图操作。同时,还讲解了Android坐标系统、绘图优化策略及未来拓展方向,适合初学者和希望深入Android图形开发的开发者。

android的专栏 121

JavaScript第十五章使用 Canvas 绘图

JavaScript第十五章使用 Canvas 绘图 <canvas>元素基本用法 使用 元素,必须先设置其 width 和 height 属性,指定可以绘图的区域大小。出现在开始和结束标签中的内容是后备信息,如果浏览器不支持 元素,就会显示这些信息。在使用 元素之前,首先要检测 getContext() 方法是否存在,这一步非常重要。使用 toDataURL() 方法,可...

Berg_liu的博客 744

36、Android动画与图形绘制全解析

本文深入解析了Android中的动画实现与图形绘制技术,涵盖视图动画的基本步骤、插值器的应用以及通过Canvas、Bitmap、Paint等类进行自定义绘图的方法。详细介绍了如何在项目中使用ImageView显示图像并添加动画效果,同时讲解了从零开始构建绘图应用的过程,包括坐标系理解、文本与形状绘制、颜色设置及位图的加载、修改、缩放和旋转操作。结合实际代码示例与流程图,帮助开发者掌握开发绘图应用或游戏所需的核心技能。

melon的博客 61

处理canvas绘制alpha小于1的图片时,alpha预乘问题

当我们使用canva.drawImage绘制alpha<1的图片时,如果你想要使用canvas.getImageData来获取回图片的像素信息。这个时候你会发现你获取到的像素颜色信息,与你的原图片并不一致。canvas 2d绘制半透明图片的时候,进行了alpha-premultiplication(alpha预乘)使用 WebGL 2 读取图像的准确字节值。

zeng_tt的博客 587

Android矢量图形实现与动画技巧演示

在Android开发中,对于图片资源的处理一直是一个持续关注的问题,尤其是对于不同的设备和Android版本的兼容性问题。在Android Lollipop之前,ImageView的图像资源依赖于特定的资源类型,如drawable,这样导致开发者在处理矢量图形时会遇到兼容性问题。在Android Lollipop 5.0版本之后,引入了属性,允许开发者通过兼容库来使用矢量图形,而不必担心版本兼容问题。使用实现动画,通常需要在XML文件中定义动画的每一帧。

weixin_36059856的博客 1107

android图像图形及动画

图形与图像处理基础 Bitmap与BitmapFactory

html5支持.9.png,javascript-当Alpha透明时,HTML5 Canvas转换为PNG会将所有通道归零

我有一个Uint32Array,我正在尝试将其转换为WebGL的纹理.为此,我将数组写为Canvas上的RGBA值,并从画布获取以base64编码的PNG作为纹理发送.每当我将像素值设置为alpha为0时,转换为PNG时相应的RGB通道也会被清零.这是实施细节吗?如果要在其他一些非HTML5程序中创建PNG,我可以将(RGBA)四元组设置为(255,255,255,0)吗?我尝试使用1的alpha...

weixin_42146230的博客 298

本地大模型部署实战:LM Studio与Ollama的易用性与性能深度评测

本文对两款主流本地大模型部署工具LM Studio和Ollama进行了深度评测。LM Studio凭借图形化界面和内置模型库,为新手提供了开箱即用的便捷体验,并支持OpenAI兼容API,易于生态集成。Ollama则以命令行驱动,轻量高效,凭借其原生API和Modelfile自定义能力,在自动化集成和性能方面表现突出。文章从易用性、模型生态、性能及扩展性多维度对比,帮助用户根据自身技术背景和使用场景做出最佳选择。

weixin_29039773的博客 528

html5+canvas+颜色,javascript – HTML5 Canvas绘制的颜色与提供的颜色不同

2017年更新:我完全忘记了这个答案,但原因与获取/设置时预先倍增数据有关.由于位图中的数字总是整数,因此预乘会的自然结果通常会导致非整数,因此会出现舍入误差.遗憾的是,没有方便的方法来解决这个问题.只是为了澄清下面的伽玛:Gamma(通过伽玛设置或ICC配置文件)将直接影响图像,但对于直接绘制到画布的形状,这不应该是一个问题本身,因为只有显示器伽玛在顶部调整,不是数据本身.老答案:您遇到的可能是...

weixin_39580042的博客 415

常用本体建模工具

常用本体建模工具: Apollo、OntoStudio、TopBraid Composer、Semantic Turkey、Knoodl、Chimaera、OliEd、WebODE、Kmgen和DOME Protégé Protégé[1]是一款由斯坦福大学编写并维护的开源本体建模和编辑工具,其支持Web版本和PC版本,使用OWL语言(关于OWL的详细介绍可参看前文2.1节内容)对知识进行表示,读者可以通过Protégé的官方网站访问Web版本或下载桌面版本。Protégé最早开发于1987年,最初目的是

qq_40503347的博客 6158

StarUML最新版汉化与破解二合一教程:5分钟搞定永久使用

本文提供StarUML最新版的高效使用指南,涵盖从安装到深度定制的全流程优化方案。包括软件获取最佳实践、界面个性化设置、核心建模技巧、团队协作策略及性能优化建议,帮助架构师和开发团队提升UML建模效率。特别推荐版本控制集成和文档自动化输出方案,适用于各类规模的项目开发。

weixin_42530732的博客 450

Android图形动画概述

动画      android的framework提供了两种动画系统:属性动画(Property animation,在Android3.0以后才引入)和视图动画(View animation)。选择这两种动画系统都是可行的,但是一般情况下,理应优先选择属性动画,因为它更加灵活,并且提供了更多的特性。除了这两种动画系统,你同样可以利用图片动画(Drawable animation):装载图片资源

vipclx的专栏 1065

I2S时序及音频驱动

I2S、音频驱动

qq_41882586的博客 3945

Android 图形与图像动画 知识框架

前期一直在学习android的图形动画的处理,觉得有点乱,然后总结了一下,觉得思路清楚多了哈^^。

womengmengyan的博客 512

新能源场站必看:一次调频与AGC/AVC的协同控制逻辑解析(含典型拓扑图)

本文深度解析了新能源场站中一次调频与AGC/AVC的协同控制逻辑。针对电网频率与电压稳定需求,详细阐述了三者在响应时序、控制目标上的分工与配合,并重点剖析了以RCL-0923装置为核心的指令融合架构与典型拓扑,为场站实现高效、稳定的协同运行提供了清晰的实践指导。

brown的博客 1054

华为防火墙双线路配置实战:5分钟搞定主备自动切换(含健康检查避坑指南)

本文详细介绍了华为防火墙双线路配置实战,包括主备自动切换和健康检查机制的优化技巧。通过智能健康检查机制,华为防火墙能实现毫秒级故障自动切换,确保网络高可用性。文章提供了从架构设计到实战配置的全流程指南,并分享了常见配置误区与解决方案,帮助中小企业快速搭建稳定可靠的网络架构。

weixin_30872337的博客 604

安卓:动画与图形(概要)

Animation and Graphics Overview Android provides a variety of powerful APIs for applying animation to UI elements and drawing custom 2D and 3D graphics. The sections below provide an overview of

computer165的专栏 786

手把手教你模拟登录豆瓣并爬取个人书影音数据:从Cookie解析到反爬攻防实战

在开始写代码之前,先明确我们需要的工具。:建议用3.10以上版本,方便使用一些新特性(如match语句)httpx:比requests更现代,支持HTTP/2,异步性能强,连接池复用好:解析HTML,语法简单,容错性强selenium:仅用于处理登录时的滑块验证(模拟真人)pandas:最终数据清洗和导出Excel/CSVretrying:自动重试机制,应对临时封禁:随机UA,降低特征lxml:作为BeautifulSoup的解析器,速度快为什么不只用requests?

2201_76125261的博客 577

android设置生成随机动画,Android中的图形、图像,动画生成

一、图片的访问1)可以通过在xml文件src指定,也可以在代码中,使用ImageView对象调用setImageResource(int id)来指定。2)使用Bitmap和BitmapFactory来得到sdcard保存的图片。(向sdcard保存内容,使用adb push/pull 来实现文件的导入/出,也可借用ddms)。二、动画可以分为两种实现方式:Tween动画和Frame动画。Twee...

weixin_42509931的博客 491

YOLOv8改进策略【卷积层】| ECCV-2024 小波卷积WTConv 增大感受野,降低参数量计算量,独家创新助力涨点

本文记录的是利用模块优化的目标检测网络模型。的目的是在不出现过参数化的情况下有效地增加卷积的感受野,从而解决了在感受野扩展中的参数膨胀问题。本文将其加入到深度可分离卷积中,有效降低模型参数量和计算量,并二次创新C2f,使模块更好地捕捉低频特征,增强网络性能。Wavelet Convolutions for Large Receptive Fields小波卷积及其改进的实现代码如下: 四、创新模块 4.1 改进点1⭐ 模块改进方法:加入(第五节讲解添加步骤)。添加后如下:模块改进方法:基于的(第五节讲解添加

Limiiiing的博客 1092

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android 动画和图形概述

Android提供了非常多强大的API来为UI元素应用动画,及绘...

weixin_33881753的博客 102

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android API指南之动画与图形(1)——动画与图形概览

动画 Android系统框架提供了两种动画系统:属性动画和View动画。属性动画更加灵活,可以提供更多特性,因而优先选择属性动画。除了这两个,还有Drawable动画,它可以加载图片资源,一张一张地展示。 属性动画 可以让任意对象的属性动态化,包括那些不在屏幕上渲染的。该系统具有可扩展性,也可以允许你将自定义类型的属性动态化。 View动画 以前的动画系统,只能用于View。设置

Kevins优快云的博客 534

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

图形与动画在Android中的实现

[size=medium][color=gray]1、简单图形的绘制[/color][/size] [code="java"] canvas.drawColor(Color.BLUE); Paint paint = new Paint(); paint.setColor(Color.RED); canvas....

207' Blog 160

【Android】第21章 2D图形和动画

分类:C#、Android、VS2015; 创建日期:2016-03-19 一、简介 Android系统定义了一系列独立的图形处理类,其中,2D图形处理类分别位于以下命名空间: Android.Graphices Android.Graphics.Drawable.Shapes Android.View.Animation 3D图形的处理类位于Android.Opengl命名空间下。 ...

weixin_34294649的博客 114

Android图形与图像处理-补间动画

Android图形与图像处理-补间动画 创建项目:TweenAnim 项目运行效果:      项目代码: 动画资源文件:两个动画资源文件 anim.xml <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/li

巫山老妖 1917
上一篇: android RXJava2.0(一)
下一篇: android 签名打包时去掉log日志打印(仅在debug包中打印log信息)
missingcall
博客等级 码龄10年 8粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值