Firemonkey 图片显示拉伸不变形
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
参考资料:
Firemonkey 图片显示拉伸不变形的更多相关文章
- android自定义控件(8)-利用onMeasure测量使图片拉伸永不变形,解决屏幕适配问题
使用ImageView会遇到的问题 在Android应用中,都少不了图片的显示,ImageView,轮播图,ViewPager等等,很多都是来显示图片的,很多时候,我们都希望图片能够在宽度上填充父窗体 ...
- iOS:图片拉伸不变形技巧
方法: 假设图片为60*24 CGFloat top = image.height*0.5-1; // 顶端盖高度 CGFloat bottom = top ; // 底端盖高度 CGFloat le ...
- iOS 图片的拉伸,取固定区域显示
1.图片拉伸合适的尺寸 以及清晰度 UIButton * but =[[UIButton alloc]initWithFrame:CGRectMake(, , , )]; //拉伸 /*UIImage ...
- IOS 创建一个可以随意拉伸不变形的图片
创建一个扩展 UIImage的类 #import "UIImage_Extension.h" @implementation UIImage+Extension /** *返回一张 ...
- Toggle组件切换开关,控制开关图片显示与隐藏
UGUI_Image 组件简单笔记 Rect Transform:用于控制 UI 物体的基本属性 Image 基本使用 1.Image 组件是用于显示图片资源的.使用方式有两种:1.显示纯粹的颜色:2 ...
- 4.C#WinForm基础图片(显示和隐藏)
要求: 软件上有一张图片,默认是隐藏的.用户在文本框中输入身份证号(131226198105223452),点击按钮,如果年龄大于18岁,则显示图片. 知识点: 取当前年份,Date Time Now ...
- jQuery css3鼠标悬停图片显示遮罩层动画特效
jQuery css3鼠标悬停图片显示遮罩层动画特效 效果体验:http://hovertree.com/texiao/jquery/39/ 效果图: 源码下载:http://hovertree.co ...
- [示例] Firemonkey 图片按钮(3态)
说明:Firemonkey 图片按钮(支持三种状态:MouseOver, MouseDown, MouseUp,可各别指定图片) 原码下载:[示例]TestImageButton_圖片按鈕(3态).z ...
- Latex图片显示问题(1)
用latex编译后,若用dvipdf生成pdf文件,则其中有个eps图的左侧会显示不完全:若是用dvips--pspdf生成pdf文件,图像显示没问题. 这种情况的问题出在,加载 graphicx 宏 ...
随机推荐
- Java连接Oracle数据库开发银行管理系统【三、实现篇】
说明:里面的主要代码都加的有注释部分,所以代码显得很长,如果有错误的地方,谢谢指出. 注意需要导入数据库jar包 ------------------------------------------- ...
- JQuery向导插件Step——第一个阉割版插件
如果使用过JQuery Steps的朋友一定会发现这个插件有一个缺点,就是页面在第一次进入的时候,会进行一次很明显的DOM重绘--页面会闪一下. 尤其是前端代码比较庞大的时候,效果更为明显. 为了解决 ...
- Visual Studio 2012系统环境变量设置(命令行)
方法1.运行脚本vsvars32.bat:D:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\vsvars32.bat ...
- JavaScript到底是不是单线程
JavaScript到底是不是单线程 JavaScript引擎 在了解计时器内部运作前,我们必须清楚一点,触发和执行并不是同一概念,计时器的回调函数一定会在指定delay的时间后被触发,但并不一定立即 ...
- React(一)基础点
prop实例 <div id="app"></div> <script src="bower_components/react/react. ...
- 《PHP Manual》阅读笔记1
1.phpinfo() 从 PHP 获取系统信息. 2.$_SERVER 只是 PHP 自动全局化的变量之一.它包含了 web 服务器提供的所有信息,被称为超全局变量. 3.htmlspecialch ...
- [转] 移动前端不得不了解的HTML5 head 头标签
HTML的头部内容特别多,有针对SEO的头部信息,也有针对移动设备的头部信息.而且各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元 素,有很多差异性.移动端的工作已经越来越成为前端工作的重要内容 ...
- 【转】Spring MVC中Session的正确用法之我见
Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...
- 关于OpenVPN的入门使用
关于OpenVPN的入门使用 1.1源代码编译安装的初步了解 1.2 安装OpenVPN 1.3 生成证书.服务器端证书.客户端证书 1.4 关于server.ovpm & client.ov ...
- fabric upgrade from old crashlystic stuck in build
提示build,一直没有反应. 问题:工程中原有的shell命令屏蔽掉了