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

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

实作效果:

代码,直接扩展 Canvas 功能:

//------------------------------------------------------------------------------
// Design by 龟山阿卍 -
// http://www.cnblogs.com/onechen/ -
//------------------------------------------------------------------------------ unit FMX.Graphics.Helper; interface uses
System.Types,
FMX.Graphics; type TCanvasHelper = class helper for TCanvas
// 图片四角张缩
procedure DrawBitmapCapInsets(
const Bitmap1: TBitmap; // 图片
const DesRect: TRectF; // 目的区域
const CapInsetsRect: TRectF; // 四角区域
const Opacity: Single = 1.0; // 透明度
const HighSpeed: Boolean = False); // 高速
end; implementation // 图片四角张缩
procedure TCanvasHelper.DrawBitmapCapInsets(
const Bitmap1: TBitmap; // 图片
const DesRect: TRectF; // 目的区域
const CapInsetsRect: TRectF; // 四角区域
const Opacity: Single = 1.0; // 透明度
const HighSpeed: Boolean = False); // 高速
var SrcRect: TRectF;
begin
SrcRect := RectF(, , Bitmap1.Width, Bitmap1.Height); //-------------------------------------------------------------------------
// 最内圈 (不张缩) -
//------------------------------------------------------------------------- // 左上
Self.DrawBitmap(Bitmap1,
RectF(SrcRect.Left,
SrcRect.Top,
SrcRect.Left + CapInsetsRect.Left,
SrcRect.Top + CapInsetsRect.Top),
RectF(DesRect.Left,
DesRect.Top,
DesRect.Left + CapInsetsRect.Left,
DesRect.Top + CapInsetsRect.Left),
Opacity, HighSpeed); // 右上
Self.DrawBitmap(Bitmap1,
RectF(SrcRect.Right - CapInsetsRect.Right,
SrcRect.Top,
SrcRect.Right,
SrcRect.Top + CapInsetsRect.Top),
RectF(DesRect.Right - CapInsetsRect.Right,
DesRect.Top,
DesRect.Right,
DesRect.Top + CapInsetsRect.Top),
Opacity, HighSpeed); // 左下
Self.DrawBitmap(Bitmap1,
RectF(SrcRect.Left,
SrcRect.Bottom - CapInsetsRect.Bottom,
SrcRect.Left + CapInsetsRect.Left,
SrcRect.Bottom),
RectF(DesRect.Left,
DesRect.Bottom - CapInsetsRect.Bottom,
DesRect.Left + CapInsetsRect.Left,
DesRect.Bottom),
Opacity, HighSpeed); // 右下
Self.DrawBitmap(Bitmap1,
RectF(SrcRect.Right - CapInsetsRect.Right,
SrcRect.Bottom - CapInsetsRect.Bottom,
SrcRect.Right,
SrcRect.Bottom),
RectF(DesRect.Right - CapInsetsRect.Right,
DesRect.Bottom - CapInsetsRect.Bottom,
DesRect.Right,
DesRect.Bottom),
Opacity, HighSpeed); // 左
Self.DrawBitmap(Bitmap1,
RectF(SrcRect.Left,
SrcRect.Top + CapInsetsRect.Top,
SrcRect.Left + CapInsetsRect.Left,
SrcRect.Bottom - CapInsetsRect.Bottom),
RectF(DesRect.Left,
DesRect.Top + CapInsetsRect.Top,
DesRect.Left + CapInsetsRect.Left,
DesRect.Bottom - CapInsetsRect.Bottom),
Opacity, HighSpeed); // 上
Self.DrawBitmap(Bitmap1,
RectF(SrcRect.Left + CapInsetsRect.Left,
SrcRect.Top,
SrcRect.Right - CapInsetsRect.Right,
SrcRect.Top + CapInsetsRect.Top),
RectF(DesRect.Left + CapInsetsRect.Left,
DesRect.Top,
DesRect.Right - CapInsetsRect.Right,
DesRect.Top + CapInsetsRect.Top),
Opacity, HighSpeed); // 右
Self.DrawBitmap(Bitmap1,
RectF(SrcRect.Right - CapInsetsRect.Right,
SrcRect.Top + CapInsetsRect.Top,
SrcRect.Right,
SrcRect.Bottom - CapInsetsRect.Bottom),
RectF(DesRect.Right - CapInsetsRect.Right,
DesRect.Top + CapInsetsRect.Top,
DesRect.Right,
DesRect.Bottom - CapInsetsRect.Bottom),
Opacity, HighSpeed); // 下
Self.DrawBitmap(Bitmap1,
RectF(SrcRect.Left + CapInsetsRect.Left,
SrcRect.Bottom - CapInsetsRect.Bottom,
SrcRect.Right - CapInsetsRect.Right,
SrcRect.Bottom),
RectF(DesRect.Left + CapInsetsRect.Left,
DesRect.Bottom - CapInsetsRect.Bottom,
DesRect.Right - CapInsetsRect.Right,
DesRect.Bottom),
Opacity, HighSpeed); // 中
Self.DrawBitmap(Bitmap1,
RectF(SrcRect.Left + CapInsetsRect.Left,
SrcRect.Top + CapInsetsRect.Top,
SrcRect.Right - CapInsetsRect.Right,
SrcRect.Bottom - CapInsetsRect.Bottom),
RectF(DesRect.Left + CapInsetsRect.Left,
DesRect.Top + CapInsetsRect.Top,
DesRect.Right - CapInsetsRect.Right,
DesRect.Bottom - CapInsetsRect.Bottom),
Opacity, HighSpeed);
end; end.

使用方法:

uses FMX.Graphics.Helper;

procedure TForm1.PaintBox2Paint(Sender: TObject; Canvas: TCanvas);
begin
Canvas.DrawBitmapCapInsets(Image2.Bitmap, PaintBox2.LocalRect, RectF(, , , ));
end;

源码下载:

[原创]TestImageCapInsets_图片拉伸不变形.zip

参考资料:

resizableImageWithCapInsets

Firemonkey 图片显示拉伸不变形的更多相关文章

  1. android自定义控件(8)-利用onMeasure测量使图片拉伸永不变形,解决屏幕适配问题

    使用ImageView会遇到的问题 在Android应用中,都少不了图片的显示,ImageView,轮播图,ViewPager等等,很多都是来显示图片的,很多时候,我们都希望图片能够在宽度上填充父窗体 ...

  2. iOS:图片拉伸不变形技巧

    方法: 假设图片为60*24 CGFloat top = image.height*0.5-1; // 顶端盖高度 CGFloat bottom = top ; // 底端盖高度 CGFloat le ...

  3. iOS 图片的拉伸,取固定区域显示

    1.图片拉伸合适的尺寸 以及清晰度 UIButton * but =[[UIButton alloc]initWithFrame:CGRectMake(, , , )]; //拉伸 /*UIImage ...

  4. IOS 创建一个可以随意拉伸不变形的图片

    创建一个扩展 UIImage的类 #import "UIImage_Extension.h" @implementation UIImage+Extension /** *返回一张 ...

  5. Toggle组件切换开关,控制开关图片显示与隐藏

    UGUI_Image 组件简单笔记 Rect Transform:用于控制 UI 物体的基本属性 Image 基本使用 1.Image 组件是用于显示图片资源的.使用方式有两种:1.显示纯粹的颜色:2 ...

  6. 4.C#WinForm基础图片(显示和隐藏)

    要求: 软件上有一张图片,默认是隐藏的.用户在文本框中输入身份证号(131226198105223452),点击按钮,如果年龄大于18岁,则显示图片. 知识点: 取当前年份,Date Time Now ...

  7. jQuery css3鼠标悬停图片显示遮罩层动画特效

    jQuery css3鼠标悬停图片显示遮罩层动画特效 效果体验:http://hovertree.com/texiao/jquery/39/ 效果图: 源码下载:http://hovertree.co ...

  8. [示例] Firemonkey 图片按钮(3态)

    说明:Firemonkey 图片按钮(支持三种状态:MouseOver, MouseDown, MouseUp,可各别指定图片) 原码下载:[示例]TestImageButton_圖片按鈕(3态).z ...

  9. Latex图片显示问题(1)

    用latex编译后,若用dvipdf生成pdf文件,则其中有个eps图的左侧会显示不完全:若是用dvips--pspdf生成pdf文件,图像显示没问题. 这种情况的问题出在,加载 graphicx 宏 ...

随机推荐

  1. IOS Animation-贝塞尔曲线与Layer简单篇(一)

    IOS Animation-贝塞尔曲线与Layer简单篇 swift篇 1.介绍 贝塞尔曲线: 贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一.它通过控制曲线上的四个点( ...

  2. java实现栈与队列

    一.栈 栈是一种特殊的线性表.其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行.(先进后出) 访问权限:栈限制了访问权限,只可以访问尾节点,也就是最后添加的元素 即栈顶的元素 /** * ...

  3. 学习ASP.NET MVC(六)——我的第一个ASP.NET MVC 编辑页面

    在上一文章中由Entity Framework(实体框架)去实现了对数据库的CURD操作.在本篇文章中,主要是调试修改自动生成的动作方法和视图,以及调试编辑功能与编辑功能的Book控制器. 首先,在V ...

  4. MVC3中如何输出富文本

    MVC3中如何输出富文本 在网站的文本输出中,经常会将DB里的文本输出到页面上. 一般来说是直接利用MVC3中的ViewBag将文本带到前台并表示, 或是是直接以<%:model.data%&g ...

  5. 两套JRE

    JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境. SDK是Software Development Kit 一般指软 ...

  6. SSIS Component的ValidateExternalMetadata属性

    ValidateExternalMetadata Property Indicates whether the component validates its column metadata agai ...

  7. 深入理解PHP内核(十四)类的成员变量及方法

    原文链接:http://www.orlion.ga/1237/ 类的成员变量在PHP中本质是一个变量,只是这些变量都归属于某个类,并且给这些变量是有访问控制的. 类的成员方法在PHP中本质是一个函数, ...

  8. JAVA_Collection容器

    因为项目的需要,今天抽时间把JAVA中的容器复习了一下,为了以后的不时之需,现在把它记下来. 容器有其名,知其意,用来盛放数据的集合,JAVA中为我们提供了三种容器类:set.list.map,三种容 ...

  9. XML序列化的时候如何支持Namespace

    我曾经不止一次(当然不仅仅是我意识到这个问题)说到过,XML标准中的Namespace的设计其实是一个较为失败的设计,它有它的优点,但缺点更多. http://zzk.cnblogs.com/s?w= ...

  10. xdotool模拟击键和鼠标移动

    最近双十一抢红包的活动比较火,我也就去玩了一下,在一个小活动里,需要不停的点击左箭头和右箭头,让红包不停的跑,但自己点的比较慢,老是出现下面的图片 看到提示还有n多公里才跑完,感觉极度不爽,一怒之下, ...