皮皮网

【openwrt led源码】【小鸟溯源码】【功能网站源码】任意拉伸图片源码_任意拉伸图片源码下载

2024-11-06 13:36:03 来源:站群源码最新

1.ui分辨率
2.ImageView设置background和src的区别
3.UE4-Slate源码学习(六)slate渲染Part2-Paint控件绘制
4.unslider.js 插件 拉伸时 无法自适应

任意拉伸图片源码_任意拉伸图片源码下载

ui分辨率

       ä¸€ã€Cocos编辑器

       è‡ªåŠ¨å¸ƒå±€ç³»ç»Ÿä¸»è¦æ¶‰åŠå›ºå®šä¸Žæ‹‰ä¼¸å±žæ€§ï¼š

         如图,总共可以修改控件的上下左右四个图钉和中间的两个拉伸条六个属性。

       æ•ˆæžœ

         1.当打开其中的任意一个图钉时,当前节点与父节点的对应边的距离即被固定。当父节点的大小修改时,当前节点与父节点对应边的距离总是不变。

         2.当打开其中的任意两个相对的图钉时,当前节点与父节点对应的两边的距离成固定比例。即当修改父节点的大小时,当前节点到父节点对应两条边的距离之比总是不变的。

         3.当开启中间任意一条拉伸条,如横向拉伸条,节点的宽度与父节点的宽度之比固定不变。

       å…¶ä»–

         1. 不开启上述任意属性时,对象默认相对左下角位置不变。

         2. 当前仅控件对象(文本、FNT字体也没有)和容器两种类型有拉伸条属性。

       äºŒã€Cocos 2d-x(Cocos Framework)中的相关概念及代码设置

       è®¾è®¡åˆ†è¾¨çŽ‡å’Œå±å¹•åˆ†è¾¨çŽ‡ï¼š

         首先我们需要了解两个概念:在Cocos2d-x中有两种分辨率:设备分辨率、屏幕分辨率。设备分辨率即当前游戏所运行平台的实际分辨率;设计分辨率就是我们设计的游戏的分辨率。

         设计分辨率是可设置的,是我们的游戏程序能够“感知到”的分辨率大小,我们的界面超过这个区域的部分都不会显示。

         设计分辨率一般在启动时进行设置

           AppDelegate::applicationDidFinishLaunching

         中进行,代码如下:

           director->getOpenGLView()->setDesignResolutionSize(,任意任意,ResolutionPolicy::FIXED_HEIGHT);

         (这句代码上边还有一句createWithRect这个是在桌面系统上,创建游戏模拟器用的。可以修改里边的Rect的后边两个值来修改设备分辨率,但这个值在移动设备上是无效的。)

         这句代码什么意思呢?

         这里把设计分辨率设置为,,并把游戏界面调整方案设置为固定宽度。但这么设置之后,我们后边再获取设计分辨率时得到的大小却不一定是,。这又是为什么呢?

         看看源码:

         转到setDesignResolutionSize的定义看看。里边做了一些判断和赋值,最终调用了updateDesignResolutionSize,继续转到updateDesignResolutionSize里边,这个函数的部分代码如下:

       //1.计算游戏界面在缩放至充满屏幕的情况下X、Y轴的缩放率:_scaleX= (float)_screenSize.width/ _designResolutionSize.width;

       _scaleY= (float)_screenSize.height/ _designResolutionSize.height;//2.根据设配策略,调整缩放率和设计分辨率:if(_resolutionPolicy== ResolutionPolicy::NO_BORDER){ //将X、Y轴缩放值设置为其中的最大者

       _scaleX = _scaleY = MAX(_scaleX,_scaleY);

       }else if(_resolutionPolicy== ResolutionPolicy::SHOW_ALL){ //将X、Y轴缩放值设置为其中的最小者

       _scaleX = _scaleY = MIN(_scaleX,_scaleY);

       }else if( _resolutionPolicy == ResolutionPolicy::FIXED_HEIGHT) {

       _scaleX = _scaleY;//将X、Y轴缩放值固定为Y轴缩放值,调整设计分辨率的宽度,使设计分辨率的宽度在缩放后依然能够充满屏幕。

       _designResolutionSize.width= ceilf(_screenSize.width/_scaleX);

       }else if( _resolutionPolicy == ResolutionPolicy::FIXED_WIDTH) {

       _scaleY= _scaleX;//将X、Y轴缩放值固定为X轴缩放值,调整设计分辨率的高度,使设计分辨率的高度在缩放后依然能够充满屏幕。

       _designResolutionSize.height= ceilf(_screenSize.height/_scaleY);

       }//其他缩放策略:EXACT_FIT不作调整

         这段代码主要做了两件事:

         1.根据设备分辨率和设计分辨率计算游戏界面的缩放率;

         2.调整设计分辨率。

         根据以上源码我们应该很容易就能够理解几种缩放策略的意义:

         ·NO_BORDER就是在保持设计分辨率大小不变的情况下,将游戏界面按比例缩放至充满屏幕。游戏的上下或者左右两边可能会被裁剪。

         ·SHOW_ALL(Cocos 2d-x默认方案)就是在保持设计分辨率大小不变的情况下,将游戏界面按比例缩放至设计分辨率的其中一边顶住屏幕。游戏上下或者左右两边可能会有黑边。

         ·FIXED_HEIGHT就是固定设计分辨率的高度,调整设计分辨率的宽度,使设计分辨率的长宽比与设备分辨率的长宽比相同,然后缩放游戏界面至充满屏幕。

         ·FIXED_WIDTH同上,不同的是保持宽度不变。

         ·EXACT_FIT是最粗暴的方式,直接将游戏界面缩放到充满整个屏幕,Xè½´Y轴缩放比率不一定一致。

       é‚£ä¹ˆï¼Œæˆ‘们应该选择哪个方案呢?必然的我们应该选择FIXED_HEIGHT或者FIXED_WIDTH。因为只有这两个方案下,界面是会自动根据设备分辨率调整设计分辨率的大小并且充满屏幕。

       æŽ¥ä¸‹æ¥åŠ è½½ç•Œé¢ã€‚

         加载界面在HelloWorld::init中进行:

       auto rootNode= CSLoader::createNode("MainScene.csb");

       auto size= Director::getInstance()->getVisibleSize();

       rootNode->setContentSize(size);

       ui::Helper::doLayout(rootNode);

       addChild(rootNode);

         这里除了用createNode把界面加载出来,并添加到HelloWorld之外,还做了两件事情:

         • 设置加载出来的界面的ContentSize,调用对rootNode调用了ui::Helper::doLayout对加载出来的界面进行处理。

         • 为什么要这么设计呢,做成自动的多好啊?

          第一个理由:跟编辑器不一致;第二个理由是:自动调整界面被设计为是被动的,如果是主动进行的话,可能会造成大量的性能损失——如果每次设置大小都要重新遍历计算所有的子节点的位置,那得浪费多少CPU时间啊。

       æ•ˆæžœï¼š

       è®¾å¤‡åˆ†è¾¨çŽ‡X/Y相对设计分辨率X/Y较大,设配策略为固定高度

       è¯·ç‚¹å‡»è¾“入图片描述

       è®¾å¤‡åˆ†è¾¨çŽ‡X/Y相对设计分辨率X/Y较大,设配策略为固定宽度

       è¯·ç‚¹å‡»è¾“入图片描述

       è®¾å¤‡åˆ†è¾¨çŽ‡X/Y相对设计分辨率X/Y较小,设配策略为固定高度

       è¯·ç‚¹å‡»è¾“入图片描述

       è®¾å¤‡åˆ†è¾¨çŽ‡X/Y相对设计分辨率X/Y较小,设配策略为固定高度

       è¯·ç‚¹å‡»è¾“入图片描述

       PS:枚举类型ResolutionPolicy是框架提供给我们的方便的默认方案。其实我们在设置设计分辨率之前可以获取设备分辨率,然后自己根据设备分辨率调整设计分辨率。

ImageView设置background和src的区别

       ä»Šå¤©å¼€å‘的时候遇到一个小问题,在给一个ImageView更换图片的时候,我使用的是java的方式更换,使用的方法是setBackgroundResource(),但奇怪的是总是没有效果。

       æœ€åŽæŸ¥æ˜ŽåŽŸå› æ˜¯ï¼šæˆ‘在编写xml文件的时候,为了查看效果,给这个ImageView设置了src,这时候再设置background的时候回发生重叠。

       è§£å†³æ–¹æ³•ï¼šå°†xml中的src删除即可。

       é—®é¢˜å»¶ä¼¸ï¼š

       ä¸€ã€ImageView设置background和src的区别。

       1.src是图片内容(前景),bg是背景,可以同时使用。

       2.background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸 。

       3.scaleType只对src起作用;bg可设置透明度。

       äºŒã€ImageView几种不同的设置图片的方式。

       è®¾ç½®background:

       1.image.setBackground(getResources().getDrawable(R.drawable.blackk));//变形

       2.image.setBackgroundResource(R.drawable.blackk);//变形 3.image.setBackgroundDrawable(getResources().getDrawable(R.drawable.blackk));////变形

       æºç ï¼šè¿™ä¸‰ç§æ–¹æ³•çš„实质都是调用方法3setBackgroundDrawable()。

       è®¾ç½®src:

       1.image.setImageDrawable(getResources().getDrawable(R.drawable.blackk)); //不会变形

       2.Stringpath=Environment.getExternalStorageDirectory()+File.separator+”test1.jpg”;

       Bitmap bm = BitmapFactory.decodeFile(path);

       image.setImageBitmap(bm);//不会变形

       3.image.setImageResource(R.drawable.blackk);//不会变形

       æºç ï¼š 其中方法2就是将bitmap转换为drawable然后调用方法1,方法1和方法3都是调用updateDrawable()方法。

UE4-Slate源码学习(六)slate渲染Part2-Paint控件绘制

       上一篇文章介绍了绘制一个SWindow的初期步骤,即计算整个UI树的拉伸拉伸控件大小,为绘制做准备。图片图片文章随后深入探讨了绘制流程的源码源码第二步,即执行FSlateApplication::PrivateDrawWindows()后,下载开始调用SWidget::Paint()函数,任意任意openwrt led源码每个控件随后实现其虚函数OnPaint()。拉伸拉伸

       在这一过程中,图片图片绘制参数被封装在FPaintArgs中,源码源码作为Paint和OnPaint过程中的下载关键引用参数。FSlateRHIRenderer与FSlateDrawBuffer是任意任意继承自FSlateRenderer的类,作为FSlateApplicationBase的拉伸拉伸全局变量,在构造时创建。图片图片在绘制过程中,源码源码通过GetDrawBuffer()函数可获取到FSlateDrawBuffer对象。下载

       FSlateDrawBuffer实现了Slate的小鸟溯源码绘制缓冲区,内部封装了FSlateWindowElementList数组,用于存储多个SWindow下的绘制元素列表。每个SWindow通过AddWindowElementList()返回一个元素列表。

       FSlateWindowElementList负载了SWindow内的所有图元信息,内部封装了FSlateDrawElement的数组,包含Cached和Uncached元素,以及SWindow的指针和用于渲染的批处理数据FSlateBatchData。

       FSlateDrawElement是构建Slate渲染界面的基本块,封装了UI树节点控件需要渲染的相关信息,如渲染变换、位置、大小、层级ID、绘制效果等,以及后续渲染阶段需要的功能网站源码相关数据。

       在Paint流程中,处理当前传入的SWindow和ChildWindows,首先判断窗口是否可见和是否最小化,然后从参数封装的OutDrawBuffer中获取WindowElementList。调用SWindow的PaintWindow()函数开始绘制窗口,并最终返回所有子控件计算完的最大层级。接着,子窗口递归绘制。

       PaintWindow()函数在绘制窗口时,首先调用SetHittestArea()设置点击区域,HittestGrid会判断窗口大小是否改变,若不变则仅更新窗口在屏幕中的位置。构造FPaintArgs参数后,将其封装到FSlateInvalidationContext中。

       FSlateInvalidationRoot类的bch算法 源码PaintInvalidationRoot()函数可以作为控件树的根节点或叶子节点(SInvalidationPanel),构建快速路径避免每次绘制都计算大小和Paint函数,有利于优化。本篇文章主要分析正常慢速路径调用流程,优化相关将另文分析。

       PaintSlowPath()函数从SWindow开始调用Paint()函数,并定义LayerId从0开始作为参数,进行实际的绘制相关计算。

       Paint()函数首先处理裁剪、透明度混合、坐标转换等代码。若SWidget包含NeedsTick掩码,则调用Tick函数,我们在日常开发中通过蓝图或lua使用Tick函数时即调用到这里,通过SObjectWidget::Tick调用到UUserWidget::NativeTick供实现Tick。构造FSlateWidgetPersistentState PersistentState作为SWidget的看视界源码变量,表示Paint时的状态。

       PersistentState.CachedElementHandle将当前SWidget存储到FSlateWindowElementList中的WidgetDrawStack数组中。

       更新FPaintArgs中的父节点参数和继承可点击测试参数,判断点击测试状态,然后将当前SWidget添加到点击测试中。调用虚函数OnPaint,由控件自己实现。

       OnPaint()函数参数包括绘制参数引用、几何体、裁剪矩形、缓冲元素列表、层级、控件风格、父节点状态等。最后处理重绘标签、延迟绘制相关内容、UpdateWidgetProxy()根据缓存句柄更新快速路径中需要处理标记设置为Volatile不稳定状态的SWidget。

       虚函数OnPaint()由子类自己实现,本文列举了SImage、SButton、SCompoundWidget和SConstraintCanvas的OnPaint()示例代码学习。

       在SImage中,简单判断Brush是否存在以及BrushDrawType的类型,然后调用FSlateDrawElement::MakeBox将控件添加到缓冲区元素列表中。

       SButton继承自SCompoundWidget,GetBorder()根据当前按钮状态返回ui中设置的Enabled、Press、Hover、Disabled等状态的Brush。

       SCompoundWidget作为合成节点,有且只能有一个子节点,且在Paint时强制将子节点的LayerId+1,同时SCompoundWidget可以单独设置混合颜色和透明度,影响子节点。

       SConstraintCanvas作为SWidget的基类对应UMG中常用的UCanvasPanel,通过ArrangeLayeredChildren()对孩子进行层级排序,并根据孩子的层级是否相同存储bool值在ChildLayers中。遍历所有孩子,判断是否开启新层级,递归调用Paint函数,最后返回最大层级。

       SConstraintCanvas::ArrangeLayeredChildren函数中,获取设置bExplicitChildZOrder,表示可以将同层一次渲染,有利于提高渲染器批处理。对所有孩子排序,排序规则为FSortSlotsByZOrder。遍历所有孩子,判断可见性掩码、计算偏移、锚点、位置、拉伸缩放等,封装成FArrangedWidget存储到ArrangedChildren中,用于OnPaint时有序遍历。判断每个孩子ZOrder是否相同,相同则bNewLayer为false,大于LastZOrder则将bNewLayer设置为true,最终存储到ArrangedChildLayers中,用于OnPaint函数判断是否将layerId+1。

       FSlateDrawElement::MakeBox()函数在OnPaint之后调用,将绘制控件的相关信息通过创建FSlateDrawElement绘制元素对象,添加到SWindow管理的FSlateWindowElementList元素列表中。创建Payload用于存储贴图等相关信息,根据控件Paint过程中的参数调用Element.Init初始化绘制元素,得到为该控件绘制创建的FSlateDrawElement对象。

       总结整个Slate绘制流程的第二步,我们没有分析快速处理和优化细节,而是按照正常绘制流程分析代码。通过从PaintWindow开始遍历整个控件树,处理每个空间节点的Paint、OnPaint函数,最终目的是给每个控件创建一个FSlateDrawElement对象,存储渲染线程绘制所需的相关信息,并添加到FSlateWindowElementList中。理解了整个调用流程,整个过程较为清晰,本文基于UE4版本4..2。

unslider.js 插件 拉伸时 无法自适应

       原作者源码上规定了

       * {

        margin: 0;

        padding: 0;

        -webkit-font-smoothing: antialiased;

        -webkit-box-sizing: border-box;

        -moz-box-sizing: border-box;

        box-sizing: border-box;

       }

       有奇效,包你满意