android Matrix.setRotate å postRotateçåºå«
Matrix主è¦ç¨äºå¯¹å¹³é¢è¿è¡å¹³ç§»(Translate)ï¼ç¼©æ¾(Scale)ï¼æ转(Rotate)以åæå(Skew)æä½ã
为ç®åç©éµåæ¢ï¼Androidå°è£ äºä¸ç³»åæ¹æ³æ¥è¿è¡ç©éµåæ¢ï¼å ¶ä¸å æ¬ï¼
setç³»åæ¹æ³ï¼setTranslateï¼setScaleï¼setRotateï¼setSkewï¼è®¾ç½®ï¼ä¼è¦çä¹åçåæ°ã
preç³»åæ¹æ³ï¼preTranslateï¼preScaleï¼preRotateï¼preSkewï¼ç©éµå ä¹ï¼å¦M' = M * T(dx, dy)ã
postç³»åæ¹æ³ï¼postTranslateï¼postScaleï¼postRotateï¼postSkewï¼ç©éµåä¹ï¼å¦M' = T(dx, dy) * Mã
éè¿å°åæ¢ç©éµä¸åå§ç©éµç¸ä¹æ¥è¾¾å°åæ¢çç®çï¼ä¾å¦ï¼
平移ï¼x'=x+txï¼y'=y+tyï¼ï¼
缩æ¾ï¼x'=sx*xï¼y'=sy*yï¼ï¼
æ转ï¼x'=cosβ*x-sinβ*yï¼y'=sinβ*x+cosβ*yï¼ï¼
éæ©éè¦ç¨å°å¦ä¸çä¸è§å½æ°çå ¬å¼ï¼
â sin(α+β)=sinαcosβ+cosαsinβ
â¡cos(α+β)=cosαcosβ-sinαsinβ
å ¬å¼â å¯ä»¥ç±åä½åæ¹æ³ææåå¯å®çæ¨å¯¼åºæ¥ã
æ¨å¯¼è¿ç¨åè§ï¼/s/blog_fcj.html
æåï¼x'=x+k1*yï¼y'=k2*x+yï¼ï¼
//æºç æ件ï¼external\skia\legacy\src\core\SkMatrix.cpp
#define SK_Scalar1 (1.0f)
#define kMatrixElem SK_Scalar1
typedef float SkScalar;
#define SkScalarMul(a, b) ((float)(a) * (b))
enum {
kMScaleX, kMSkewX, kMTransX,
kMSkewY, kMScaleY, kMTransY,
kMPersp0, kMPersp1, kMPersp2
};
void SkMatrix::reset() {
fMat[kMScaleX] = fMat[kMScaleY] = SK_Scalar1; //å ¶å¼ä¸º1
fMat[kMSkewX] = fMat[kMSkewY] =
fMat[kMTransX] = fMat[kMTransY] =
fMat[kMPersp0] = fMat[kMPersp1] = 0; //å ¶å¼ï¼å ¨ä¸º0
fMat[kMPersp2] = kMatrixElem; //å ¶å¼ä¸º1
this->setTypeMask(kIdentity_Mask | kRectStaysRect_Mask);
}
void SkMatrix::setTranslate(SkScalar dx, SkScalar dy) {
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] = dx; //以æ°å¼dxè¦çåå¼ï¼åå¼æ æäº
fMat[kMTransY] = dy;
fMat[kMScaleX] = fMat[kMScaleY] = SK_Scalar1; //å ¶å¼ä¸º1
fMat[kMSkewX] = fMat[kMSkewY] =
fMat[kMPersp0] = fMat[kMPersp1] = 0; //å ¶å¼ï¼å ¨ä¸º0
fMat[kMPersp2] = kMatrixElem; //å ¶å¼ä¸º1
this->setTypeMask(kTranslate_Mask | kRectStaysRect_Mask);
} else {
this->reset();
}
}
bool SkMatrix::preTranslate(SkScalar dx, SkScalar dy) {
if (this->hasPerspective()) {
SkMatrix m;
m.setTranslate(dx, dy);
return this->preConcat(m); //ç©éµçå ä¹è¿ç®
}
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] += SkScalarMul(fMat[kMScaleX], dx) +
SkScalarMul(fMat[kMSkewX], dy); //å ä¹ï¼éè¦ç©éµè¿ç®è¿
fMat[kMTransY] += SkScalarMul(fMat[kMSkewY], dx) +
SkScalarMul(fMat[kMScaleY], dy);
this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
}
return true;
}
bool SkMatrix::postTranslate(SkScalar dx, SkScalar dy) {
if (this->hasPerspective()) {
SkMatrix m;
m.setTranslate(dx, dy);
return this->postConcat(m); //ç©éµçåä¹è¿ç®
}
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] += dx; //åä¹ï¼ç´æ¥å æ°å¼dxå³å¯
fMat[kMTransY] += dy;
this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
}
return true;
}
bool SkMatrix::preConcat(
大屏适配的几种方式
1. rem方案
根据不同屏幕大小动态调整html根节点的fontsize。
2. vw/vh方案
依据设计稿计算相对百分比。
3. scale 方案
若设计稿为*(:9),存在两种方案:
3.1 按宽度缩放
3.2 动态计算网页的宽高比,决定根据宽度比率还是android美女源码高度比率进行缩放
4.相关开源组件库
4.1 autofit.js
autofit.js基于比例缩放原理,通过动态调整容器的pcf公式源码宽度和高度来实现全屏填充,避免元素的挤压或拉伸。autofit.js提供了一种简单而有效的方法来实现网页的自适应设计,尤其适合需要在不同分辨率和屏幕尺寸下保持布局一致性的应用场景。
安装:
配置:
源码地址
4.2 v-scale-screen
大屏自适应容器组件,适用于大屏项目开发,实现屏幕自适应。可根据宽度自适应、类似发卡源码高度自适应、宽高等比例自适应,全屏自适应(会存在拉伸问题)。如果是分页控件源码React开发者,可以使用r-scale-screen。
安装:
配置:
源码地址:
4.3 FitScreen
一种基于缩放的大屏自适应解决方案的基本方法,基于设计草图的像素尺寸,通过缩放进行适配,淄博直播源码一切变得简单。
支持vue2、vue3以及react,适用于任何框架,只需少量代码。
安装:
配置:
源码地址:
CSS移动端1px(线条/边框)解决方案
由于不同的手机有不同的像素密度导致的。如果移动显示屏的分辨率始终是普通屏幕的2倍,1px的边框在devicePixelRatio=2的移动显示屏下会显示成2px,所以在高清瓶下看着1px总是感觉变胖了小编阅读过其他作者的文章中有写0.5px的写法,在理论上最小的单位是1px。所以会出现有的设备写0.5px无效(没有边框)的情况。
如何使用正确的1px单位又能在移动设备上显示1px的效果呢?
本文将介绍使用CSS3的transform属性的scale值来解决这个问题,这也是最常用的解决方案。下方的源码中说明1px(线条/边框)解决方案
效果对比(效果有点问题,请复制下方源码查看最终效果)源码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"><metaname="author"content="helang.love@qq.com"><title>移动端1px(线条/边框)解决方案</title><styletype="text/css">body{ margin:0;padding:0;font-size:px;color:#;font-family:'MicrosoftYaHei','TimesNewRoman',Times,serif;}/*线条*/.list{ margin:px;list-style:none;line-height:px;padding:0;}.list>li{ padding:0;position:relative;}.list>li:not(:first-child):after{ /*CSS匹配非第一个直接子元素*/content:"";display:block;height:0;border-top:#solid1px;width:%;position:absolute;top:0;right:0;transform:scaleY(0.5);/*将1px的线条缩小为原来的%*/}/*边框*//*其他作者可能会通过设置4个边的线条凑出边框线的效果,这样做不仅代码不够精简,而且调整圆角问题也会非常麻烦*/.button{ line-height:px;text-align:center;margin:px;background-color:#f8f8f8;position:relative;border-radius:4px;}.button:after{ content:"";position:absolute;top:-%;right:-%;bottom:-%;left:-%;border:1pxsolid#;transform:scale(0.5);transform-origin:%%0;box-sizing:border-box;border-radius:8px;/*尺寸缩小%,即圆角半径设置为按钮的2倍*/}</style></head><body><ulclass="list"><li>线条1px</li><li>web前端河浪</li><li>helang.love@qq.com</li></ul><divclass="button">边框1px</div></body></html>作者:黄河爱浪邮箱:helang.love@qq.com
caffe ä¸ä¸ºä»ä¹bnå±è¦åscaleå±ä¸èµ·ä½¿ç¨
1) è¾å ¥å½ä¸å x_norm = (x-u)/std, å ¶ä¸uåstdæ¯ä¸ªç´¯è®¡è®¡ç®çåå¼åæ¹å·®ã2ï¼y=alphaÃx_norm + betaï¼å¯¹å½ä¸ååçxè¿è¡æ¯ä¾ç¼©æ¾åä½ç§»ãå ¶ä¸alphaåbetaæ¯éè¿è¿ä»£å¦ä¹ çã
é£ä¹caffeä¸çbnå±å ¶å®åªåäºç¬¬ä¸ä»¶äºï¼scaleå±åäºç¬¬äºä»¶äºï¼æ以两è è¦ä¸èµ·ä½¿ç¨ã
ä¸ï¼å¨Caffeä¸ä½¿ç¨Batch Normalizationéè¦æ³¨æ以ä¸ä¸¤ç¹ï¼
1. è¦é åScaleå±ä¸èµ·ä½¿ç¨ã
2. è®ç»çæ¶åï¼å°BNå±çuse_global_stats设置为falseï¼ç¶åæµè¯çæ¶åå°use_global_stats设置为trueã
äºï¼åºæ¬å ¬å¼æ¢³çï¼
Scaleå±ä¸»è¦å®æ top=alpha∗bottom+betatop=alpha∗bottom+betaçè¿ç¨ï¼åå±ä¸ä¸»è¦æ两个åæ°alphaalphaä¸betabeta,
æ±å¯¼ä¼æ¯è¾ç®åã∂y∂x=alpha;∂y∂alpha=x;∂y∂beta=1ã éè¦æ³¨æçæ¯alphaalphaä¸betabetaå为åéï¼é对è¾å ¥çchannelschannelsè¿è¡çå¤çï¼å æ¤ä¸è½ç®åç认å®ä¸ºä¸ä¸ªfloatfloatçå®æ°ã
ä¸ï¼å ·ä½å®ç°è¯¥é¨åå°ç»åæºç å®ç°è§£æscalescaleå±:
å¨Caffe protoä¸ScaleParameterä¸å¯¹Scaleæå¦ä¸å 个åæ°ï¼
1ï¼åºæ¬æååéï¼åºæ¬æååé主è¦å å«äºBiaså±çåæ°ä»¥åScaleå±å®æ对åºééçæ 注工ä½ã
2ï¼åºæ¬æåå½æ°ï¼ä¸»è¦å å«äºLayerSetup,Reshape ,ForwardåBackward ï¼å é¨è°ç¨çæ¶åbias_term为trueçæ¶åä¼è°ç¨biasLayerçç¸å ³å½æ°ã
3ï¼Reshape è°æ´è¾å ¥è¾åºä¸ä¸é´åéï¼Reshapeå±å®æ许å¤ä¸é´åéçsizeåå§åã
4ï¼Forward åå计ç®ï¼åå计ç®ï¼å¨BNä¸å½ç´§è·çBNçå½ä¸åè¾åºï¼å®æä¹ä»¥alphaä¸+biasçæä½ï¼ç±äºalphaä¸biaså为Cçåéï¼å æ¤éè¦å è¿è¡å¹¿æã
5ï¼Backward åå计ç®ï¼ä¸»è¦æ±è§£ä¸ä¸ªæ¢¯åº¦ï¼å¯¹alpha ãbetaåè¾å ¥çbottom(æ¤å¤çtemp)ã
2024-11-19 09:29
2024-11-19 08:35
2024-11-19 08:32
2024-11-19 07:33
2024-11-19 07:27