Android自定义view之clip裁切以及几何变换

【DeepSeek开发入门】DeepSeek API 开发初体验 在人工智能蓬勃发展的时代,DeepSeek作为一款功能强大的AI大模型,为开发者提供了丰富的接口和便捷的开发体验。本文将基于DeepSeek的几个关键接口,带你快速入门,开启DeepSeek开发的探索之旅。通过本文,你已经初步了解了DeepSeek开发中几个重要接口的使用方法,包括列出模型、对话补全和查询余额接口,以及开发过程中的常见问题及解决办法。这是你踏入DeepSeek开发领域的第一步。在后续的学习中,你可以深入研究模型的参数调优,探索不同模型在各种场景下的应用,如利用模型实现更复杂的推理对话功能。 阅读详情

  今天我们来实践下Android部分的裁切就是clip打头的方法以及一些几何矩阵变换,所谓的裁切,顾名思义就是裁剪啊,就是把一个图形按照另外一个图形切成我们想要的样子,例如我们想把一张图片裁剪为圆形或者矩形或者五角星等等我们想要的形状。而矩阵变换是怎么回事呢?矩阵变换就是进行图形的平移啊、缩放啊、旋转啊,或者在某个方向上拉伸形状啊,这类的操作。

裁切部分

  • clipRect(int left, int top, int right, int bottom)
    这个方法作用就是裁切一个矩形出来,但是图形不还是在canvas上面的,所以本质上还是裁切的canvas画布,使图形只是在裁切出来的那块画布上展示,这就达到了裁切效果,同样参数就按照绘制一个矩形的参数传进去就好了,就是可以认为是矩形的左上角以及右下角的坐标
  • clipPath(@NonNull Path path)
    这个方法比上面的方法灵活很多,因为它传入的是一个Path,所以就提供了更多裁切的可能性了,因为Path本身就可以绘制很多不同的形状啊,发挥大家想象力的时候到了

几何变换

  • canvas.translate(float dx, float dy)
    画布的平移,其实就是坐标系的平移,原来坐标系原点是在手机屏幕左上角,如果canvas.translate(200, 0)就代表将坐标系向右移动了200,所以现在的坐标原点变成了(200,0)了,就是这么个意思
  • canvas.rotate(float degrees, float px, float py)
    画布的旋转,degress就是旋转角度,正数为顺时针旋转,负数为逆时针旋转,后面的px和py则是旋转中心,所以坐标系也会进行相应的旋转,所以绘制的图形自然也是被旋转了
  • canvas.scale(float sx, float sy, float px, float py)
    画布的缩放,前面的sx和sy是指在x方向上以及y方向上的缩放是原来的几倍,后面的px和py则是旋转中心,好比缩放为原来的2倍,那么原来的1px相当于现在的2px,那么展示的图形自然会大
  • canvas.skew(float sx, float sy)
    画布的拉伸,sx和sy则是在水平方向和竖直方向上的拉伸,这个拉伸不等于缩放,举个例子,好比现在有一个矩形,我在水平方向上进行拉伸,那么如果sx>0则是图片会向右拉伸,那么原矩形的平行于y轴的边会向左倾斜,矩形变成了什么呢?矩形就变成了一个平行四边形,如果sy>0也满足,那么原来矩形平行于x轴的边会向向下,同样也会变成一个平行四边形
      以上都是通过canvas自带的方法进行的几何变换,但是它的方法是有限的,就是我不只是想变换一下位置,旋转一下、拉伸一下或者缩放一下,我还想有别的操作怎么办?那么只是通过canvas自带的这几个方法的话,canvas该说“臣妾办不到啊”,所以这个时候我们可以通过操作canvas的矩阵Matrix来实现
  • matrix也有跟canvas相同的平移、缩放、旋转、拉伸的方法,用法跟上面的类似就不多说了,那么matrix我们设置了一个matrix是怎么和canvas结合起来的呢?这里我们用canvas.concat(matrix)方法而不是canvas.setMatrix(matrix),因为后者会有兼容性问题,在不同的手机上可能效果会不一致,同时后者会将canvas自己的matrix给替换掉,而concat不是一种替换,只是一种跟canvas原有矩阵相乘的方式,同时setMatrix方法的注释注释也说了:Note: it is recommended to use {@link #concat(Matrix)}, {@link #scale(float, float)}, {@link #translate(float, float)} and {@link #rotate(float)} instead of this method. 人家强烈建议使用除了setMatrix之外的其他方法啦
  • matrix.setPolyToPoly(float[] src, int srcIndex,float[] dst, int dstIndex,int pointCount)
    上面咱们也说了之所以会选择使用matrix来做几何变换,是因为它能够自定义一些东西,那么就主要是用这个方法,这个方法是干嘛的呢?官方注释翻译后是 设置矩阵,使得指定的src点将映射到指定的dst点。 “点”表示为一个浮点数组,顺序为[x0,y0,x1,y1,…],其中每个“点”为2个浮点值,说的通俗点就是自己首先要定义一个源数组(每两个元素组成一个point的横纵坐标),然后需要定义一个目标数组(每两个元素组成一个point的横纵坐标),然后将源数组中的点映射到目标数组中的点,其实就是将原数组中的点移动到对应的目标数组中的对应点上,好比有一个矩形,原数组就是矩形四个顶点,然后目标数组就是操作一下四个顶点(就是上下左右移动一下),自己可以看看效果,一定会很惊艳吧(也可能惊吓),而参数中的srcIndex是指是从源数组中的第几个元素开始算起,dstIndex则是指从目标数组中的第几个元素开始算起,pointCount则是自己构造的数组中的点的个数啦(有个要求Must be [0..4]),同样数组中元素因为要组成point所以个数必须为偶数个,这就是这个方法的作用
      以上就是利用matrix做几何变换的方法,上面的不管canvas也好,matrix也罢,都是在二维层面上的几何变化,也不过是缩放、平移、拉伸之类的,如果想在三维空间上线做几何变换的话那就得用到Camera这个类了
  • camera类主要用于图形的3D变换,其实说白了也是旋转,但是是可以围绕x轴、y轴以及z轴的旋转,所以不单单是平面内的旋转了,二维空间的旋转其实就是围绕x轴的,camera的默认旋转中心是在坐标原点就是手机屏幕左上角的,如果不改变旋转中心的话,那么直接用camera进行旋转会总会出现意想不到的结果,所以一般为了便于想象也便于直观的观察,一般都会将旋转中心进行移动,好比移动至需要旋转的图片的中心,那么再做旋转就会直观很多,好比我们现在在(200,200)的位置绘制了一张图片(图片的左上角就在(200,200))了,我们想让其围绕自己的中心沿着y轴旋转45度,假设图片的中心是(centerX,centerY),然后如下一段代码:
            canvas.save();
            camera.save();
            camera.rotateY(45); // 旋转 Camera 的三维空间
            canvas.translate(centerX, centerY);//旋转之后把投影移动回来(将坐标原点移动至手机左上角)
            camera.applyToCanvas(canvas); // 把旋转投影到 Canvas
            canvas.translate(-centerX, -centerY); // 旋转之前把绘制内容移动到图片中心(其实是现在的坐标原点跑到了图片中心)
            camera.restore();
            canvas.drawBitmap(getBitmap(), 200, 200, paint);
            canvas.restore();

大家应该也发现了我们将旋转中心的代码写在了最后面,而将旋转中心再次移动至手机左上角写在了上面将camera的效果设置给canvas之前,这是因为canvas的几何变换中心是反着的,所以这里的顺序颠倒了,applyToCanvas则是将旋转投影到canvas画布上面,当然自己也可以让其围绕z轴或者x轴旋转,这个看个人的需求了

  以上就是本次关于canvas的裁切以及几何变换的全部内容,有问题欢迎批评指正,同时这也是自己第一次用Markdown编写文件,发现格式是比之前好很多。

大数据安全 | 期末复习(上)| 补档 大数据定义:无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 阅读详情

相关推荐

学习海康VisionMaster之BLOB分析

6):软阈值(相对):是一种动态阈值分割方法,其核心思想是 基于图像局部特性(如背景或参考区域)自适应调整阈值范围,适用于光照变化明显、背景灰度不均的场景。3:拖入位置修正功能:这个非常重要,模版匹配成功后会得到新的匹配坐标,那和创建模版时候的原点坐标会组合成一个坐标变换矩阵,通过这个矩阵,那后续的blob分析窗口则可以实现精确定位来查找目标对象。(2):设定参数:这里阈值方式是blob的核心算法,根据不同的应用场景来选择不同的阈值方式。8:高级参数:是设定blob区域的特征范围,用于筛选出来特定的区域。

yuhouxiyang的专栏 3618

android view clip,Android 自定义View Clip

先画俩矩形RectF rectF = new RectF(0,0,300,300);canvas.drawRect(rectF,mPaint);mPaint.setColor(Color.GREEN);RectF rectF2 = new RectF(400,400,600,600);canvas.drawRect(rectF2,mPaint);把他俩重在一起 看看然后 说是 有讲究canvas...

weixin_35705382的博客 225

别再折腾Windows了!Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境保姆级搭建指南

本文提供Ubuntu 22.04下USRP X310 + RFNoC + Vivado 2021.1开发环境的详细搭建指南,涵盖系统优化、UHD驱动编译、Vivado配置及硬件验证等关键步骤,帮助射频工程师高效构建稳定的开发环境,显著提升FPGA开发效率。

weixin_29168675的博客 255

android view clip,ClipView 自定义 RadiusView,包含常用的 Layout 和 View,方便扩展 @codeKK Android开源站...

这是使用 Canvas 的 clipPath 方法实现的圆角 View,在本库中提供了个人认为常用的几个 View 如下几种:RadiusFrameLayoutRadiusLinearLayoutRadiusRelativeLayoutRadiusTextViewRadiusImageView效果如下:废话不多说,直接来看看怎么用吧~使用引用:在根目录级的 build.gradle 中添加allp...

weixin_33396922的博客 453

手把手教你用STM32F103C8T6驱动CLRC663国产NFC模块(兼容A/B/F/15693卡)

本文详细介绍了如何使用STM32F103C8T6驱动国产CLRC663 NFC模块,支持ISO14443A/B、Felica和ISO15693协议。从硬件设计、协议适配到状态监控,提供完整的工程实现方案,适用于智能门锁、支付终端等应用场景。

weixin_30689307的博客 445

验证(uvm常见问题)--子类和父类的句柄和对象问题

sv中的子类和父类 在sv中,有如下两个类,child继承于parent。然后在test module中,正确转换的方法如下面所示。其中c1,c2,p1 都指向了同一个子类的对象c1。总结如下: 一个子类的对象是包括子类的成员变量,方法和父类的成员变量,方法。 子类的句柄c1可以直接赋值给父类的句柄p1,此时p1只可以访问父类的成员变量和方法,或者子类的虚方法,比如下面调用p1.display是...

q876507447的博客 7631

Drawable基础知识总结----drawable标签LevelList、inset、scale、clip的使用

Drawable基础知识总结----drawable标签LevelList、inset、scale、clip的使用

芒果蜜桃π 1101

论文阅读笔记(一)细粒度图像检索

0、参考文献 [1]见微知著 http://geek.youkuaiyun.com/news/detail/191718 [2]Xiu-Shen Wei 《Selective Convolutional Descriptor Aggregation for Fine-Grained Image Retrieval》 [3]Lingxi Xie 《Fine-Grained Image Search》 1...

huang2818138的博客 1万+

Android中两个textview重叠,ConstraintLayout两个Textview,第二个Textview被挤出屏幕外的解决方案...

xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/nim_pop_notice_layout"android:layout_width="match_parent"android:layout_height="wrap_c...

weixin_32159771的博客 1087

IgH EtherCAT 从入门到精通:第 4 章 网络设备驱动选型与配置

摘要:本章详细介绍了EtherCAT主站网络设备驱动的选型与配置。IgH EtherCAT Master提供Generic通用驱动和Native原生驱动两种方案:Generic驱动通过Linux Socket接口实现,兼容性强但实时性较差;Native驱动通过修改网卡驱动绕过内核协议栈,具有更低延迟和更小抖动。文章具体分析了e1000/e1000e/igb/igc等Intel网卡驱动以及r8169/8139too等Realtek驱动的配置方法,并提供了驱动选型建议。对于实时性要求高的场景,推荐使用Nativ

从事嵌入式linux android驱动开发,拥有全栈能力 304

UE5、CesiumForUnreal实现加载GeoJson绘制多面(MultiPolygon)功能(支持点选高亮)

UE5、CesiumForUnreal实现加载GeoJson实现多面(MultiPolygon)的绘制功能,并且支持点选高亮和属性查询。

专注GIS开发 4628

Android自定义View(四) -- Canvas

前面学习的内容: Android自定义View(一) – 初识 Android自定义View(二) – Paint详解 Android自定义View(三) – drawText() 今天继续学习Android自定义View第四篇内容Canvas。 本文计划根据HenCoder系列文章进行学习,所以代码风格及博文素材可能会摘自其中。 1 范围裁切 范围裁切有两个方法:

dai的博客 495

在 ABAP Push Channel 里玩转 Detached Client:用 Attach Handle 把 WebSocket 连接交接给业务逻辑

摘要:本文介绍了ABAP Push Channels (APC)中的Detached Client技术,该技术通过将WebSocket连接建立与后续处理分离,实现更高效的实时通信。核心流程包括创建连接、使用connect_and_detach交接连接、以及通过attach handle重新附着发送消息。文章还探讨了PCP协议和AMC技术在企业级推送场景中的应用,并通过示例代码展示了Detached Client的具体实现方式。这种设计解决了传统轮询的资源浪费问题,特别适用于生产线监控、客服系统等需要服务端主

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2313

自定义View-Canvas对绘制的辅助clipXXX()和Matrix

前言 裁剪和几何变换,说实话平时用到的也不多,但确实也是很有意思的内容,一起来看一下吧 范围裁切 // 裁剪一个矩形 canvas.save(); canvas.clipRect(left, top, right, bottom); canvas.drawBitmap(bitmap, x, y, paint); canvas.restore(); // 裁剪一个Path, 能裁剪的形...

pengbo6665631的博客 440

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

在view扣除正方形

- (void)drawRect:(CGRect)rect { [super drawRect:rect]; CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextSetRGBFillColor(ctx, .3, .3, .3, .1); CGContextFillRect(ctx, self.boun

King的专栏 1006

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

头像叠加android_Android自定义ViewGroup实现堆叠头像的点赞Layout

简介这样的点赞列表怎么样?之前做社区的时候也有类似的点赞列表,但是没有这样重叠,一个小小的改变,个人感觉逼格提高不少。这个很有规则,就是后一个头像会覆盖一部分到前一个头像上,头像多了就像一串糖葫芦了。这个实现起来不难,自定义ViewGroup,关键重写onLayout方法。关于自定义控件的基础知识可以看一看这个,整理的很详细: https://github.com/GcsSloop/Android...

weixin_34313315的博客 715

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【Android】PorterDuffXfermode使用(通过消除背景层与重叠部分绘制组合图形)

利用PorterDuffXfermode,绘制组合图形,过程我分成了4个步骤(onDraw方法里面):      1、通过canvas.saveLayout()先绘制一个背景图层(这里位置大小很重要,应该根据覆盖层来定义)(如果没有背景层,产生效果可能和预期不太一样)      2、canvas.drawXXX()画底部图形Dst;      4、paint.setXfermode()设置图

止水 4530

Android Clip用法——自定义进度条

android 自定义进度条

Yes ! ! ! 的专栏 8466

Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜,Kotlin(2)

需要注意的,因为在xml布局里面特别设置了ImageView的高度为wrap_content,手指在屏幕触点的位置是放大镜里面放大图片后准确圆心位置,但是,如果ImageView设置成match_parent,则因为ImageView里面的Bitmap被缩放(此处Bitmap其实小于ImageView,被拉伸了),拉伸后的Bitmap水平方向坐标与ImageView一直重合,但竖直方向,Bitmap坐标与ImageView不一致,会造成一种现象,手指触点放大镜放大后,水平方向是正确的,但竖直方向有偏移量。

Zhang Phil 1330

安卓图片裁剪——使用自定义View

分析设计实现通过自定义View方式达到的图片裁剪效果,附源码

鸣筝的博客 1118

Android自定义View实现图片缩放旋转移动裁剪

Android自定义View实现图片缩放旋转移动裁剪 需求: 通过蒙版的效果,遮罩图片,然后图片可以进行随意的移动,缩放,旋转,最后通过蒙版上方的裁剪框来裁剪图片。裁剪框可以进行移动,可以通过拖动四个角的圆圈进行缩放。这里为了方便展示,直接将裁剪的图片在下方进行了展示,效果如下: 实现思路 1.因为要对图片进行拖拽,缩放等功能,所以不能使用自带的ImageView,而是需要自定义View。 2....

无bug无江湖 3013

android 开发 View _15_canvas的裁剪clipPath,clipRect

前言   在自定义View中在正常绘制的情况下,我们的canvas都是正方形的。假如我们有需求将Canvas变成圆形或者三角形或者将一个图片裁剪成圆形。我们就需要使用Canvas提供的三个方法clipPath,clipOutPath,clipRect,clipOutRect来实现。其中clipOutPat与clipOutRecth是Android Api26以后提供的方法。之前的没什么区别。 简...

cherish152的博客 204

android中clip的使用

//save和restore是为了剪切操作不影响画布的其它元素 canvas.save(); //画一个正方形 Rect rect = new Rect(0,0,100,100); //画另外一个正方形 Rect clipRect = new Rect(0,0,50,50); //将剪切矩形与要下面要画的矩形相交,只显示相交的区域 canvas.clipRect(clipRect

新火燎塬的博客 1236

Android样式之drawable

转载自Keegan小钢 普通图片 Bitmap标签 点九图片 nine-patch标签 color标签 inset标签 clip标签 scale标签 level-list标签 transition标签 rotate标签 animation-list标签 animated-rotate标签 结束 Android有很多种drawable类型,除了前几篇详细讲解的shape、selector、layer-

刘涤生 687

关于android自定义切割view并在每个区域设置点击事件

在开发的过程中,觉得仿win10风格的主界面会比较好看,但是常规的规则图形看着又没新意,所以决定自己写一个view。在ondraw()方法中绘图。在ontouchevent()方法中写点击事件。而点击事件的具体实现通过接口完成。这一过程涉及一些数学问题。 封装的view: public class UserMainView extends View { private UserMain

过程就是奖励 3685

android view clip,Android clipChildren属性实例详解

前言前几天有在微博上推荐过一个博客,看他文章时发现了这个属性。有些属性不常用,但需要的时候非常有用,于是做了个例子,正好项目用到,与大家分享一下。正文一、效果图看到这个图时你可以先想想如果是你,你怎么实现这个效果。马上想到用RelativeLayout?NO,NO,NO,,,二、实现代码android:layout_width="match_parent"android:layout_height...

weixin_28909745的博客 333
上一篇: Android自定义view之自己真正意义上的自定义view
下一篇: Android自定义view绘制顺序漫谈
和小胖
博客等级 码龄12年 8粉丝 42原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值