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. [数据库连接池] Java数据库连接池--DBCP浅析.

    前言对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新). 一. 为何要使用数据库连接池假设网站一天有很大的访问量,数据库服务 ...

  2. Atitit 发帖机实现(4 )- usbQBM1601 gui操作标准化规范与解决方案attilax总结

    Atitit 发帖机实现(4 )- usbQBM1601 gui操作标准化规范与解决方案attilax总结 1.1. 根据gui的类型使用不同的gui调用api1 1.2. Script化1 1.3. ...

  3. SQLSERVER中的ALLOCATION SCAN和RANGE SCAN

    SQLSERVER中的ALLOCATION SCAN和RANGE SCAN 写这篇文章的开始,我还不知道ALLOCATION SCAN的工作原理是怎样的,网上资料少得可怜 求助了园子里的某位大侠,他看 ...

  4. php的几种运行模式CLI、CGI、FastCGI、mod_php

    1.CLI:就是命令行,例如可以在控制台或者是shell中键入命令: php -f index.php 然后获取输出 2.CGI:以下是不同的说法与理解 公共网关接口”(Common Gateway  ...

  5. javascript类型系统——Number数字类型

    × 目录 [1]定义 [2]整数 [3]浮点数[4]科学记数[5]数值精度[6]数值范围[7]特殊数值[8]转成数值[9]实例方法 前面的话 javascript只有一个数字类型,它在内部被表示为64 ...

  6. 去除IE6浏览器下获得焦点的元素的虚线框的两个小办法

    [1]onfocus = "this.blur()"//得到焦点时,失去焦点 e.g. <a href="#" onfocus = "this. ...

  7. HTML内联元素

    前面的话 用于标记段落里的文本和其他内容组的元素种类很多,本文将这些文本级元素进行简单分类,便于整理和记忆 通用容器 <span>元素是短语内容的通用行内容器,并没有任何特殊语义.可以使用 ...

  8. 设置让TortoiseGit记住账号和密码

    方法一:在"C:\Documents and Settings\Administrator\.gitconfig" 文件 或 "项目/.git/config"文 ...

  9. php基础教程-数据类型

    PHP 支持八种原始类型(type). 四种标量类型: string(字符串) integer(整型) float(浮点型,也作 double ) boolean(布尔型) 两种复合类型: array ...

  10. Advice for students of machine learning--转

    原文地址:http://www.mimno.org/articles/ml-learn/ written by david mimno One of my students recently aske ...