设置聊天泡泡颜色以及添加描边的方式

本文介绍了一种通过程序自动给聊天泡泡上色的方法,解决了因多种配色方案导致图片资源过多的问题。同时,文章还提供了一种实用的非规则图片描边方式,并实现了泡泡方向的调整。

一种简易的聊天泡泡设置颜色以及添加描边的方式

遇到的问题

比如我现在有以下这个图片:

bubble_regular

然后我想做到以下这种效果:

sample

第一种方法

应该是最简单的一种方法,直接提供带描边的图片,在这里例子里就是提供一张篮框绿底的图片以及一张红框黄底的图片。

但是问题来了,如果需要提供多种配色方案怎么办?比如白天模式下是一种配色方案,夜晚模式下是另一种配色方案,或者哪天想把当前配色方案修改掉,这会导致程序里需要存储大量的图片。目前iOS每种图片都需要提供三种分辨率的图片,多一张图片就意味着其实要多三张图片。

还有一个问题就是,泡泡有两种方向,难道我们也需要提供两种图片吗?再结合第一个问题,好像我们需要提供很多图片。

第二种方法

这就是这篇文章所要阐述的方法。该方法就是由程序自动给图片上色。

让我们定义如下这个方法:

- (UIImage *)imageMaskedWithColor:(UIColor *)color {
	UIImage *bubbleImage = [UIImage imageNamed:@"bubble"];
	CGRect imageRect = CGRectMake(0.0f, 0.0f, bubbleImage.size.width, bubbleImage.size.height);
	UIImage *newImage = nil;

    UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, bubbleImage.scale);
    {
        CGContextRef context = UIGraphicsGetCurrentContext();
        
        // 根据文档,使用这种方式展示图片会是上下颠倒的
        // 因此先要将图片向下反转
        CGContextScaleCTM(context, 1.0f, -1.0f);
        // 反转之后再把反转后的图片移回到原来位置
        CGContextTranslateCTM(context, 0.0f, -(imageRect.size.height));
        
        CGContextClipToMask(context, imageRect, bubbleImage.CGImage);
        // 填充所期望的颜色
        CGContextSetFillColorWithColor(context, color.CGColor);
        CGContextFillRect(context, imageRect);
        
        // 生成新的图片返回
        newImage = UIGraphicsGetImageFromCurrentImageContext();
    }
    UIGraphicsEndImageContext();
    return newImage;
}

该函数调用方式如下:

self.imageview.image = [self imageMaskedWithColor:[UIColor yellowColor]];

展示效果如下:

yellow_bubble

那接下来我们再来处理描边的问题。这里我也研究了很久,如果想纯粹用程序自动来做一个通用的非规则图片描边,目前看来好像比较困难(如果大家有比较好的办法,请不吝告知)。

因此我选择了相对简单的办法,就是直接用泡泡的图片把中间扣掉,然后生成一张描边图片,如以下图片:

bubble_stroke

然后我们直接使用上面的技术,分别为实心的泡泡图片和描边的泡泡图片填充想要的颜色,然后再把两种图片画在一起,这样一张带描边的实心泡泡图片就出来了。

让我们定义如下这个新的方法:

- (UIImage *)imageMaskedWithColor:(UIColor *)color strokeColor:(UIColor *)strokeColor {
    UIImage *bubbleImage = [UIImage imageNamed:@"bubble"];
    UIImage *strokeImage = [UIImage imageNamed:@"bubble_stroke"];
    CGRect imageRect = CGRectMake(0.0f, 0.0f, bubbleImage.size.width, bubbleImage.size.height);
    UIImage *newImage = nil;
    
    UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, bubbleImage.scale);
    {
        CGContextRef context = UIGraphicsGetCurrentContext();
        
        CGContextScaleCTM(context, 1.0f, -1.0f);
        CGContextTranslateCTM(context, 0.0f, -(imageRect.size.height));
        
        // 设置底色
        CGContextClipToMask(context, imageRect, bubbleImage.CGImage);
        CGContextSetFillColorWithColor(context, color.CGColor);
        CGContextFillRect(context, imageRect);
        
        // 设置描边色
        CGContextClipToMask(context, imageRect, strokeImage.CGImage);
        CGContextSetFillColorWithColor(context, strokeColor.CGColor);
        CGContextFillRect(context, imageRect);
        
        newImage = UIGraphicsGetImageFromCurrentImageContext();
    }
    UIGraphicsEndImageContext();
    return newImage;
}

该函数调用方式如下:

self.imageview.image = [self strokeImageWithColor:[UIColor yellowColor]
                                      strokeColor:[UIColor redColor]];

展示效果如下:

yellow_red_bubble

那我们还就剩下最后一个问题了,反向的泡泡怎么办?

我们在定义一个方法,用来使得泡泡图片转向:

- (UIImage *)horizontallyFlippedImageFromImage:(UIImage *)image
{
    return [UIImage imageWithCGImage:image.CGImage
                               scale:image.scale
                         orientation:UIImageOrientationUpMirrored];
}

和之前定义的方法结合起来使用:

UIImage *newImage = [self strokeImageWithColor:[UIColor greenColor]
                                   strokeColor:[UIColor blueColor]];
self.imageview.image = [self horizontallyFlippedImageFromImage:newImage];

展示效果如下:

inverse_bubble

总结

到这里这次要介绍的内容都已经介绍完了,这篇博客所介绍方法的最大好处就是可以非常容易适应各种配色方案,同时提供了一种比较实用的描边方式,也解决图片过多导致程序无谓膨胀的问题。

当然也有缺点,比如描边的宽度无法自定义,除非重新截图。另外如果泡泡形状发生改变,也需要重新截图。

其实我这里使用的一些方法基本都来自于JSQMessagesViewController这个第三方库。

【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
在CSS中,颜色渐变和描边颜色设置通常用于丰富网页元素的视觉效果,尤其是在文本和边框设计方面。以下是具体实现方法: ### 渐变颜色设置 CSS支持线性渐变(`linear-gradient`)和径向渐变(`radial-gradient`)两种方式设置颜色渐变。线性渐变可以通过指定方向和颜色停止点来创建平滑的颜色过渡效果。例如,使用线性渐变实现文字颜色渐变的效果可以如下所示: ```css .liner-style { font-size: 50px; font-weight: bold; color: transparent; background-image: linear-gradient(90deg, rgba(42, 130, 228, 1), rgba(139, 100, 245, 1)); -webkit-background-clip: text; background-clip: text; } ``` 上述代码中,`background-image`属性定义了一个从左到右的线性渐变,颜色从蓝色渐变到紫色。`-webkit-background-clip: text`和`background-clip: text`则确保渐变仅应用于文本部分,使文字呈现出渐变色效果[^3]。 ### 描边颜色设置 对于文本描边效果,CSS提供了`-webkit-text-stroke`属性,允许开发者为文本添加描边。此属性在WebKit浏览器中表现最佳,但现代浏览器大多已支持。使用`-webkit-text-stroke`的基本语法如下: ```css .blue-text { -webkit-text-stroke: 2px black; } ``` 这里,`2px`指定了描边的宽度,`black`则是描边颜色。这种方法可以避免传统描边方法导致的文字变瘦问题,提供更加美观的视觉效果[^2]。 ### 结合渐变与描边 若想同时实现文字的渐变填充和描边效果,可以利用伪元素`::before`或`::after`来分别处理渐变和描边。例如,下面的HTML和CSS代码展示了如何为一个文本元素添加渐变填充和黑色描边: ```html <span class="home-intro"> 前端开发<br /> Vue <span class="blue-text" data-text="前端开发">前端开发</span> React </span> ``` ```css .home-intro .blue-text { position: relative; display: inline-block; color: transparent; font-weight: bold; font-size: 50px; background-image: linear-gradient(90deg, rgba(42, 130, 228, 1), rgba(139, 100, 245, 1)); -webkit-background-clip: text; background-clip: text; } .home-intro .blue-text::before { content: attr(data-text); position: absolute; left: 0; top: 0; -webkit-text-stroke: 2px black; color: transparent; pointer-events: none; } ``` 在这个例子中,`.blue-text`类使用了线性渐变填充文本,而`::before`伪元素则用来创建黑色的文本描边。通过设置`content: attr(data-text)`,`::before`的内容与实际文本保持一致,从而实现了渐变文字加上描边的效果[^4]。 以上就是在CSS中设置颜色渐变和描边颜色的方法。这些技术不仅能够提升网站的视觉吸引力,还能增强用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值