我在滚动视图上放了一些图像视图.当我拖动这个滚动视图时,我没有任何问题.
但是在我将阴影效果应用于这些图像视图后,拖动此滚动视图会导致性能下降.
我使用了shadowOpacity,shadowRadius和shadowOffset方法.
例如:
[ [ anImageView layer ] shadowOpacity: 1.0 ];
Run Code Online (Sandbox Code Playgroud)
如果使用阴影效果会严重影响性能,我会直接绘制图像的阴影.
如果有关于此问题的一些提示,请告诉我们.
我想以编程方式在iOS上使用阴影效果,因为我的绘图技巧最差.
谢谢你的阅读.
Lollipop具有"View"类的所有新功能.它们之间究竟有什么区别,为什么我们需要这么多功能呢?
我已经阅读了文档,我想了解(或更好地理解)每个文档的差异和需求,以便我知道何时使用它们:
基础z视图的深度
必须是维值,这是一个附加单位的浮点数,例如"14.5sp".可用单位是:px(像素),dp(与密度无关的像素),sp(基于首选字体大小的缩放像素),in(英寸),mm(毫米).
这也可能是对包含此类型值的资源(格式为"@ [package:] type:name")或主题属性(格式为"?[package:] [type:] name")的引用.
这对应于全局属性资源符号高程.
那么它是从它开始的呢?
在视图的z中翻译.此值将添加到其高程.
必须是维值,这是一个附加单位的浮点数,例如"14.5sp".可用单位是:px(像素),dp(与密度无关的像素),sp(基于首选字体大小的缩放像素),in(英寸),mm(毫米).
这也可能是对包含此类型值的资源(格式为"@ [package:] type:name")或主题属性(格式为"?[package:] [type:] name")的引用.
这对应于全局属性资源符号translationZ.
除了"提升"之外还添加了这个?为什么需要?
设置此视图的可视z位置(以像素为单位).这相当于将translationZ属性设置为传入的x值与当前提升属性之间的差值.
我根本不明白这个的解释.这会影响阴影吗?它是干什么用的?要处理2个视图具有相同的总elavation值的情况?动画此值是否会改变视图的显示方式?
我已经将UITableViewCell类子类化为在我的单元格下面添加阴影.当TableView出现在屏幕上时,阴影会正确添加.但是,当我向下滚动tableview,并且阴影的单元格隐藏在屏幕上方时,阴影消失.
- (void)layoutSubviews {
[super layoutSubviews];
if (self.shouldAddShadow) {
self.layer.shadowOpacity = 0.5;
self.layer.shadowRadius = 1.5;
self.layer.shadowOffset = CGSizeMake(0, 3);
self.layer.shadowColor = [[[UIColor appDarkDividerColor] colorWithAlphaComponent:0.9] CGColor];
[self setClipsToBounds:NO];
[self.layer setMasksToBounds:NO];
CGRect shadowFrame = self.layer.bounds;
CGPathRef shadowPath = [UIBezierPath bezierPathWithRect:shadowFrame].CGPath;
self.layer.shadowPath = shadowPath;
}
}
Run Code Online (Sandbox Code Playgroud)
忘了提,我有静态细胞的tableview; 所以不会调用prepareForReuse.我有我的单元格的插座,所以我也尝试在scrollViewDidScroll:方法中将阴影设置到我的单元格.即便如此,这对我没有帮助
我知道CALayer的shadowPath只能使用显式动画制作动画,但是我仍然无法使其工作.我怀疑我没有toValue正确传递- 我知道这必须是一个id,但该属性需要一个CGPathRef.将其存储在一个UIBezierPath似乎不起作用.我使用以下代码进行测试:
CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"];
theAnimation.duration = 3.0;
theAnimation.toValue = [UIBezierPath bezierPathWithRect:CGRectMake(-10.0, -10.0, 50.0, 50.0)];
[self.view.layer addAnimation:theAnimation forKey:@"animateShadowPath"];
Run Code Online (Sandbox Code Playgroud)
(我使用负值,以确保阴影延伸到位于其顶部的视图之外...图层的masksToBounds属性设置为NO).
shadowPath的动画是如何实现的?
UPDATE
问题差点解决了.不幸的是,主要问题是有点粗心的错误......
我犯的错误是将动画添加到视图控制器的根层,而不是我专用于阴影的图层.另外,@ pe8ter是正确的,因为toValue需要成为一个CGPathRef演员id(显然当我在尝试这个之前因为错误的图层错误而仍然没有动画).动画使用以下代码:
CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"shadowPath"];
theAnimation.duration = 3.0;
theAnimation.toValue = (id)[UIBezierPath bezierPathWithRect:myRect].CGPath;
[controller.shadowLayer addAnimation:theAnimation forKey:@"shadowPath"];
Run Code Online (Sandbox Code Playgroud)
我很欣赏这很难从我提供的示例代码中找到.希望它仍然可以用于处于类似情况的人.
但是,当我尝试添加该行时
controller.shadowLayer.shadowPath = [UIBezierPath bezierPathWithRect:myRect].CGPath;
Run Code Online (Sandbox Code Playgroud)
动画停止工作,阴影立即跳到最终位置.文档说添加动画时使用与要更改的属性相同的键,以覆盖设置属性值时创建的隐式动画,但是shadowPath无法生成隐式动画...所以如何获取新属性留后的动画?
我正在通过为窗口设置自定义内容视图来绘制自定义窗口.当我绘制自定义视图时,我给它圆角和一个漂亮的轮廓来模仿一个合适的窗口.
但是,我看到窗户周围还有另一个1像素的轮廓,它从角落的边缘偏离.我发现,如果我关掉阴影就会消失,但很明显,因为这需要像窗户一样,我需要阴影.这就是我对1px大纲的意思:

我怎么能阻止这个?
编辑
绘制自定义窗口内容视图的代码:
NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:[self bounds] cornerRadius:5];
NSGradient* aGradient = [[[NSGradient alloc] initWithColorsAndLocations:
[NSColor colorWithDeviceRed:0.5569 green:0.5137 blue:0.4588 alpha:1.0000], 0.0,
[NSColor colorWithDeviceRed:0.5569 green:0.5137 blue:0.4588 alpha:1.0000], 1.0,
nil] autorelease];
[aGradient drawInBezierPath:path angle:90];
[path setLineWidth:4];
[[NSColor colorWithDeviceRed:0.4235 green:0.3922 blue:0.3451 alpha:0.9000] setStroke];
[path strokeInside];
[path setLineWidth:3];
[[NSColor colorWithDeviceRed:0.8431 green:0.8314 blue:0.8078 alpha:1.0000] setStroke];
[path strokeInside];
[path setLineWidth:1];
[[NSColor colorWithDeviceRed:0.4235 green:0.3922 blue:0.3451 alpha:0.9000] setStroke];
[path strokeInside];
Run Code Online (Sandbox Code Playgroud) 我正在尝试将阴影添加到父<img>元素中,其中子元素位于其中.我想插入阴影以重叠图像.
我的HTML代码是:
<section class="highlights">
<img src="images/hero.jpg" alt="" />
</section><!-- End section.highlights -->
Run Code Online (Sandbox Code Playgroud)
和CSS:
.highlights {
height: 360px;
padding: 0;
position: relative;
overflow: hidden;
opacity: 0.9;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
z-index:1;
}
.highlights img {
height: auto;
width: 100%;
margin: 0 auto;
display: block;
position: relative;
}
.highlights {
-webkit-box-shadow: inset 0 0 10px 0 rgba(0, 0, 0, 0.2);
box-shadow: inset 0 0 10px 0 rgba(0, 0, 0, 0.2);
}
Run Code Online (Sandbox Code Playgroud)
阴影不会出现在我身上.我做错了什么?
我刚刚在我的引擎中实现了一个灯光系统.在下面的屏幕截图中,您可以看到正在运行的灯光(黄色方块):
考虑到在照亮场景的光线之上,它还实现了一个FOV,它会遮挡你视野之外的任何东西.这就是为什么阴影的左侧部分看起来如此偏离.
正如你所看到的那样,光线的阴影非常"坚硬",因为它们甚至不能照亮其直接范围之外的一个区域.为了使灯光看起来更好,我对它们应用了一个过滤器,它几乎限制了要照明的范围,并且在该限制范围内略微照亮了该区域:

在大黄色圆圈中,即使没有直射光照射,您也可以看到该区域是如何照亮的.
然而,该解决方案带来一些不希望的副作用.正如您在下面的屏幕截图中看到的那样,即使没有任何光到达某个区域,如果它太靠近光源,它也会被点亮:

我想知道是否有任何方法可以通过正确使用着色器来实现我想要做的事情.我遇到的主要问题来自于我如何绘制这些阴影.
1)首先,我采用光线范围内的结构.
此时,我正在使用顶点,因为它们定义了阴影投射项的区域:

2)然后,对于这些对象中的每一个,我计算它们单独投射的阴影:


他们施放的阴影由CPU完成,通过计算身体每个顶点的投影.
3)然后GPU将这些形状绘制到纹理中以构成最终阴影:

我发现的问题是,制作这种弥散阴影效果,我需要最后的阴影.如果我在步骤2)中计算漫射阴影,则在固体B和C之间会出现光隙.
但是如果我在第3步中消除了阴影,我就不再拥有顶点信息,因为我拥有的所有信息都是在一个最终纹理中加起来的3个局部纹理.
那么,无论如何要实现这一目标吗?我的第一个想法是将变量传递给碎片器以计算有多少光进入暗区,但由于我将在最终阴影上处理此信息,因为它没有顶点信息,我完全迷失了什么我应该用这个做法.
我对这种方法可能完全错了,因为我对着色器的经验非常有限.
这是我现在拥有的一个例子,以及我想要的东西:我拥有的东西:光线半径的明亮照明(导致光线穿过墙壁.

我想要的是:距离光线结束的距离越远,阴影越强烈.

我正在为 jetpack compose 中的顶栏绘制自定义形状。我想为路径画一个阴影。
val topBarShapePath = Path().apply {
moveTo(dpToPixels(leftPadding), 0f)
lineTo(dpToPixels(leftPadding), dpToPixels(dpValue = 110.dp))
arcTo(
Rect(
dpToPixels(leftPadding),
dpToPixels(dpValue = 110.dp),
dpToPixels(dpValue = 32.dp),
dpToPixels(dpValue = 135.dp)
), -180f, -90f, true)
lineTo(
dpToPixels(dpValue = triangleStartX),
dpToPixels(dpValue = rectHeight))
lineTo(
dpToPixels(dpValue = screenWidth),
dpToPixels(dpValue = triangleEndY)
)
lineTo(dpToPixels(dpValue = screenWidth), 0f)
lineTo(dpToPixels(dpValue = leftPadding), 0f)
}
Column(
modifier = Modifier
.fillMaxWidth()
.height(400.dp)
.drawBehind {
val finalWidth = 40.dp.toPx()
drawPath(
topBarShapePath,
color = topbarcolor)
drawOutline(
outline = Outline.Generic(
topBarShapePath),
brush = Brush.horizontalGradient(), …Run Code Online (Sandbox Code Playgroud) shadow ×10
ios ×3
android ×2
objective-c ×2
uitableview ×2
animation ×1
calayer ×1
canvas ×1
cocoa ×1
css ×1
css3 ×1
draw ×1
game-engine ×1
glsl ×1
iphone ×1
lighting ×1
macos ×1
nswindow ×1
opengl ×1
performance ×1
react-native ×1
swift ×1
xcode9 ×1