加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Firemonkey 图片显示拉伸不变形

发布时间:2020-12-15 04:37:08 所属栏目:大数据 来源:网络整理
导读:Firemonkey 实现简单的图片拉伸不变形,是利用原始图片的 "固定区" 及 "位伸区" 来达到此目的,因此必需要有此结构的图片才适合。 下面以聊天气泡为例,下图四个角为固定区,就是拉伸时,这四个区是不变的,而拉伸区,会自动依位伸的大小自动位伸: 实作效果

Firemonkey 实现简单的图片拉伸不变形,是利用原始图片的 "固定区" 及 "位伸区" 来达到此目的,因此必需要有此结构的图片才适合。

下面以聊天气泡为例,下图四个角为固定区,就是拉伸时,这四个区是不变的,而拉伸区,会自动依位伸的大小自动位伸:

实作效果:

代码,直接扩展 Canvas 功能:

<span style="color: #0000ff;">unit<span style="color: #000000;"> FMX.Graphics.Helper;

<span style="color: #0000ff;">interface

<span style="color: #0000ff;">uses<span style="color: #000000;">
System.Types,FMX.Graphics;

<span style="color: #0000ff;">type<span style="color: #000000;">

TCanvasHelper = <span style="color: #0000ff;">class helper <span style="color: #0000ff;">for<span style="color: #000000;"> TCanvas
<span style="color: #008000;">//<span style="color: #008000;"> 图片四角张缩
<span style="color: #0000ff;">procedure<span style="color: #000000;"> DrawBitmapCapInsets(
<span style="color: #0000ff;">const Bitmap1: TBitmap; <span style="color: #008000;">//<span style="color: #008000;"> 图片
<span style="color: #0000ff;">const DesRect: TRectF; <span style="color: #008000;">//<span style="color: #008000;"> 目的区域
<span style="color: #0000ff;">const CapInsetsRect: TRectF; <span style="color: #008000;">//<span style="color: #008000;"> 四角区域
<span style="color: #0000ff;">const Opacity: Single = <span style="color: #800080;">1.0; <span style="color: #008000;">//<span style="color: #008000;"> 透明度
<span style="color: #0000ff;">const HighSpeed: Boolean = False); <span style="color: #008000;">//<span style="color: #008000;"> 高速
<span style="color: #0000ff;">end<span style="color: #000000;">;

<span style="color: #0000ff;">implementation

<span style="color: #008000;">//<span style="color: #008000;"> 图片四角张缩
<span style="color: #0000ff;">procedure<span style="color: #000000;"> TCanvasHelper.DrawBitmapCapInsets(
<span style="color: #0000ff;">const Bitmap1: TBitmap; <span style="color: #008000;">//<span style="color: #008000;"> 图片
<span style="color: #0000ff;">const DesRect: TRectF; <span style="color: #008000;">//<span style="color: #008000;"> 目的区域
<span style="color: #0000ff;">const CapInsetsRect: TRectF; <span style="color: #008000;">//<span style="color: #008000;"> 四角区域
<span style="color: #0000ff;">const Opacity: Single = <span style="color: #800080;">1.0; <span style="color: #008000;">//<span style="color: #008000;"> 透明度
<span style="color: #0000ff;">const HighSpeed: Boolean = False); <span style="color: #008000;">//<span style="color: #008000;"> 高速
<span style="color: #0000ff;">var<span style="color: #000000;"> SrcRect: TRectF;
<span style="color: #0000ff;">begin<span style="color: #000000;">
SrcRect := RectF(<span style="color: #800080;">0,<span style="color: #800080;">0<span style="color: #000000;">,Bitmap1.Width,Bitmap1.Height);

 </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;-------------------------------------------------------------------------</span>
 <span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 最内圈 (不张缩)                                                        -</span>
 <span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;-------------------------------------------------------------------------</span>

 <span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 左上</span>

<span style="color: #000000;"> Self.DrawBitmap(Bitmap1,RectF(SrcRect.Left,SrcRect.Top,SrcRect.Left +<span style="color: #000000;"> CapInsetsRect.Left,SrcRect.Top +<span style="color: #000000;"> CapInsetsRect.Top),RectF(DesRect.Left,DesRect.Top,DesRect.Left +<span style="color: #000000;"> CapInsetsRect.Left,DesRect.Top +<span style="color: #000000;"> CapInsetsRect.Left),Opacity,HighSpeed);

 </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 右上</span>

<span style="color: #000000;"> Self.DrawBitmap(Bitmap1,RectF(SrcRect.Right -<span style="color: #000000;"> CapInsetsRect.Right,SrcRect.Right,RectF(DesRect.Right -<span style="color: #000000;"> CapInsetsRect.Right,DesRect.Right,DesRect.Top +<span style="color: #000000;"> CapInsetsRect.Top),HighSpeed);

 </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 左下</span>

<span style="color: #000000;"> Self.DrawBitmap(Bitmap1,SrcRect.Bottom -<span style="color: #000000;"> CapInsetsRect.Bottom,SrcRect.Bottom),DesRect.Bottom -<span style="color: #000000;"> CapInsetsRect.Bottom,DesRect.Bottom),HighSpeed);

 </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 右下</span>

<span style="color: #000000;"> Self.DrawBitmap(Bitmap1,HighSpeed);

 </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 左</span>

<span style="color: #000000;"> Self.DrawBitmap(Bitmap1,SrcRect.Top +<span style="color: #000000;"> CapInsetsRect.Top,SrcRect.Bottom -<span style="color: #000000;"> CapInsetsRect.Bottom),DesRect.Top +<span style="color: #000000;"> CapInsetsRect.Top,DesRect.Bottom -<span style="color: #000000;"> CapInsetsRect.Bottom),HighSpeed);

 </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 上</span>

<span style="color: #000000;"> Self.DrawBitmap(Bitmap1,RectF(SrcRect.Left +<span style="color: #000000;"> CapInsetsRect.Left,SrcRect.Right -<span style="color: #000000;"> CapInsetsRect.Right,RectF(DesRect.Left +<span style="color: #000000;"> CapInsetsRect.Left,DesRect.Right -<span style="color: #000000;"> CapInsetsRect.Right,HighSpeed);

 </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 右</span>

<span style="color: #000000;"> Self.DrawBitmap(Bitmap1,HighSpeed);

 </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 下</span>

<span style="color: #000000;"> Self.DrawBitmap(Bitmap1,HighSpeed);

 </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; 中</span>

<span style="color: #000000;"> Self.DrawBitmap(Bitmap1,HighSpeed);
<span style="color: #0000ff;">end<span style="color: #000000;">;

<span style="color: #0000ff;">end.

使用方法:

<span style="color: #0000ff;">procedure<span style="color: #000000;"> TForm1.PaintBox2Paint(Sender: TObject; Canvas: TCanvas);
<span style="color: #0000ff;">begin<span style="color: #000000;">
Canvas.DrawBitmapCapInsets(Image2.Bitmap,PaintBox2.LocalRect,RectF(<span style="color: #800080;">17,<span style="color: #800080;">14,<span style="color: #800080;">24,<span style="color: #800080;">16<span style="color: #000000;">));
<span style="color: #0000ff;">end;

源码下载:

参考资料:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读