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-Sprite Kit(一)基础

    介绍 Sprite Kit是IOS7开始引入的,是一个高效率渲染的2D图形框架.它与绘制图形的Core Graphics以及用来管理GUI元素动画属性的Core Animation不同,Sprite ...

  2. 阿里云主机(aliyun-Linux) x64安装Redis详解

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/97.html?1455870336 如何在Linux​上安装Redis呢, ...

  3. iOS开发——高级技术OC篇&运行时(Runtime)机制

    运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档 ...

  4. sdk更新代理设置

    sdk更新代理设置 http://www.cnblogs.com/zhoujg/p/4560998.html

  5. bootstrap实现嵌入的button

    bootstrap实现嵌入的button 如下的效果: <div class="form-inline"> <div class="input-grou ...

  6. wampserver中Apache启动不了的问题

    今天晚上安装了wampserver,启动后,右下角的图表橙色,绿色才代表服务启动成功,到底是什么原因导致不能成功启动呢? 网上查资料,说可能是端口冲突,也可能是网络TCP/IP的设置有关系,我设置TC ...

  7. APP 版本更新 流程(已上架APP,提交新版本)

    背景: 今天发布app的新版本, 可是无奈换了电脑, 没有了以前上架时候的发布证书和描述文件. 但是没关系, 依然可以上传成功,哈哈哈~ 虽然走了很多弯路 - -|| 如果是向 App Store 提 ...

  8. [OpenCV] Samples 04: contours2

    要先变为二值图像:cvThreshold 提取轮廓:cvFindContours #include "opencv2/imgproc/imgproc.hpp" #include & ...

  9. javaWeb之maven多数据库环境的配置信息

    在使用maven构建的web项目里,不管采用的是什么orm框架,数据库写死了必然不是最灵活的方式.所以通过maven 的buid方式可以动态的分配数据库信息 比如在jdbc.properties中,可 ...

  10. 百度地图JavaScript API覆盖物旋转时出现偏移

    在项目中,调用百度地图JavaScript API,做覆盖物的旋转再添加到地图上,结果出现偏移了. 调试过程中的效果图: 发现图片的旋转并不是按车子的中心来的,而是之外的一个点.最后发现犯了一个很细节 ...