光滑的UIButton

c#的控件重绘 包括Button、RadioButton、ComboBox、TextBox、GroupBox 控件的形状可以通过Region属性来改变,用GraphicsPath来闭合一个特殊形状,然后传给Region属性就可以了。 通过GraphicsPath绘制的图形好像不能去掉锯齿,我写了抗锯齿但是没有效果。 控件的属性可以用        [CategoryAttribute("自定义属性1"),DescriptionAttribute("控件边框的颜色"),DefaultValue(ty 阅读详情

从零开始DIY酷炫按钮!Create your own cool and flexible buttons from scratch!

在教程1,2和3,我们讲解了如何个性化定制一个Table view的全过程 – 仅仅使用了Core Graphics!

在这篇教程中,我们将着手另一个实例 – 如何个性化定制一个UIButton。

在教程中,我们将会学到如何绘制圆角矩形,如何对使用Core Graphics绘制的图形进行简单的染色处理,并且巩固我们之前学过的一些概念。

正如来自Under The Bridge的Alex Curylo多次提到过的,已经有很多关于如何个性化定制UIButton的方法了。

我个人推荐的快速简易制作按钮的方法是Dermot Daly写的Button Maker。但是我认为在这种讨论中缺少的是如何使用Core Graphics个性化定制你的按钮的详细教程。

教程相当的简单,用这种教学方式,你可以直观的了解你将要开发的app内容。现在让我们开始制作按钮吧!开始

在Xcode中,使用View-based Application 模版创建一个新的项目,命名为“CoolButton”。

然后确保你选中了 “Groups & Files”中的”Classes” 组,进入菜单的”FileNew File…”,选择 iOSCocoa Touch Class,Objective-C 类,确保”Subclass of UIView”被选中,然后点击下一步。命名文件为 “CoolButton.m”,然后注意选上”Also create CoolButton.h”,然后点击”完成“。

接着使用以下的代码,替换掉CoolButton.h文件的内容:

#import <UIKit/UIKit.h>
@interface CoolButton : UIButton {
    CGFloat _hue;
    CGFloat _saturation;
    CGFloat _brightness;
}
@property  CGFloat hue;
@property  CGFloat saturation;
@property  CGFloat brightness;
@end

注意到我们没有继承UIVIew,而是继承UIButton。我们还定义了一些属性变量,去设置view的色彩,饱和度还有亮度。

接下来,我们使用以下内容对CoolButton.m文件做改动:

// Under @implementation
@synthesize hue = _hue;
@synthesize saturation = _saturation;
@synthesize brightness = _brightness;
// Delete initWithFrame and add the following:
-(id) initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super initWithCoder:aDecoder])) {
        self.opaque = NO;
        self.backgroundColor = [UIColor clearColor];
        _hue = 1.0;
        _saturation = 1.0;
        _brightness = 1.0;
    }
    return self;
}
// Uncomment drawRect and replace the contents with:
CGContextRef context = UIGraphicsGetCurrentContext();
CGColorRef color = [UIColor colorWithHue:_hue saturation:_saturation 
    brightness:_brightness alpha:1.0].CGColor;
 
CGContextSetFillColorWithColor(context, color);
CGContextFillRect(context, self.bounds);
// Add to the bottom of the file
- (void)setHue:(CGFloat)hue {
    _hue = hue;
    [self setNeedsDisplay];
}
- (void)setSaturation:(CGFloat)saturation {
    _saturation = saturation;
    [self setNeedsDisplay];
}
- (void)setBrightness:(CGFloat)brightness {
    _brightness = brightness;
    [self setNeedsDisplay];
}

这里我们只是初始化了一些变量,使用设定的颜色去填充整个按钮,确保一切正常开始。

注意到我们使用了不同的构造函数去设置颜色 – 而不是使用 colorWithRed:Green:Blue方法,我们使用了colorWithHue:saturation:brightness方法。这将让接下来的操作更简单。

我们最后要做的事情,是重写hue(颜色),saturation(饱和度)和brightness(亮度)属性变量的setter方法,然后当setter方法被调用的时候,我们调用setNeedsDisplay方法。这会在用户改变按钮的颜色的时候,强制我们的view去重绘一遍。

现在,我们回到CoolButtonViewController.h文件,使用以下代码对它进行修改:

// Before @interface
@class CoolButton;
// Inside @interface
CoolButton *_button;
// After @interface
@property (retain) IBOutlet CoolButton *button;
- (IBAction)hueValueChanged:(id)sender;
- (IBAction)saturationValueChanged:(id)sender;
- (IBAction)brightnessValueChanged:(id)sender;

 

这里我们申明了一个对button的outlet引用(我们将在Interface Builder中添加)和一些设定slider控件属性值时的Action回调函数(我们也将会在Interface Builder中添加)。

现在让我们继续吧。打开CoolButtonViewController.m文件,然后拖动一个UIButton,3个UILabel和3个UISlider控件到view中,像下图一样:
Button View Layout

接下来,转到Identity Inspector,修改Class的下拉选项为CoolButton,从而改变UIButton的class属性为CoolButton。

Identity Inspector

另外,确保Attributes Inspector被选中,然后切换Button的drawing type为Custom,用以取消按钮圆角的默认设定。

然后,control键+鼠标拖动“File’s Owner”到CoolButton,然后连接到按钮的outlet上。相似的,control键+鼠标拖动slider的“File’s Owner”,连接到恰当的数值变化回调函数。在我们运行代码之前,使用以下代码修改CustomViewController.m文件:

// In the import section
#import "CoolButton.h"
// Under @implementation
@synthesize button = _button;
// In viewDidUnload
self.button = nil;
// In dealloc
[_button release];
_button = nil;
// Add to the bottom of the file
- (IBAction)hueValueChanged:(id)sender {
 
    UISlider *slider = (UISlider *)sender;
    _button.hue = slider.value;
 
}
- (IBAction)saturationValueChanged:(id)sender {
 
    UISlider *slider = (UISlider *)sender;
    _button.saturation = slider.value;
 
}
- (IBAction)brightnessValueChanged:(id)sender {
 
    UISlider *slider = (UISlider *)sender;
    _button.brightness = slider.value;
 
}

注意到UISlider的默认值范围设定为0.0到1.0, 和我们变化范围在0.0到1.0的颜色值,饱和度和亮点值一致,所以我们可以直接对它们进行设定了。编译运行工程,然后如果一切都运行正常,你应该能使用slider去调整”CoolButton”的颜色。

Button Placeholder

绘制圆角矩形按钮

你其实也可以使用直角按钮,但是目前大部分的软件都是用圆角按钮的。

在最后的教程中,我们讲解了如何使用CGContextAddArc API去绘制弧线。基于经验我们当然可以使用它在每个边角处绘制弧线了,然后绘制线条去连接他们。
但是有个更简单的方法,让我们不需要做这么多数学运算,它很适合绘制圆角矩形。这种方法就是CGContextAddArcToPoint API。

CGContextAddArcToPoint API可以让你在绘制弧线的时候,指定两条切线和半径的大小。下面来自Quartz2D Programming Guide的示意图很好的解释了相关含义。
CGContextAddArcToPoint Diagram

所以对于一个矩形的情况,我们很明显知道每条想要绘制的弧线的切线 – 他们就是矩形的边!并且我们可以根据想要的矩形角弧度去指定半径的大小 – 更大,更圆。

另外还需要对这个函数补充的是如果当前在轨迹上的点没有设定到你开始绘制弧线的位置,程序就会从当前点到轨迹的初始位置绘制一条线。所以你可以使用这种简便方法,仅调用几个函数去绘制一个圆角矩形。

因为我们将要在这篇教程中去创建多个圆角矩形,让我们在Common.h/m文件中添加一个辅助函数去创建圆角矩形的轨迹方法,获得一个矩形。

如果你现在还没有Common.h/m文件,请到这里下载Common.h/m,并且添加到你的工程中。然后将以下内容添加到Common.h文件中:

CGMutablePathRef createRoundedRectForRect(CGRect rect, CGFloat radius);

添加以下代码到Common.m文件的底部:

CGMutablePathRef createRoundedRectForRect(CGRect rect, CGFloat radius) {
 
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, CGRectGetMidX(rect), CGRectGetMinY(rect));
    CGPathAddArcToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMinY(rect), 
        CGRectGetMaxX(rect), CGRectGetMaxY(rect), radius);
    CGPathAddArcToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMaxY(rect), 
        CGRectGetMinX(rect), CGRectGetMaxY(rect), radius);
    CGPathAddArcToPoint(path, NULL, CGRectGetMinX(rect), CGRectGetMaxY(rect), 
        CGRectGetMinX(rect), CGRectGetMinY(rect), radius);
    CGPathAddArcToPoint(path, NULL, CGRectGetMinX(rect), CGRectGetMinY(rect), 
        CGRectGetMaxX(rect), CGRectGetMinY(rect), radius);
    CGPathCloseSubpath(path);
 
    return path;        
}

上面的代码按照以下图示顺序绘制了圆角矩形:

How to draw a rounded rect with Core Graphics

  1. 移动到顶部线段的中心点。
  2. 为右上角添加一段弧线。在绘制弧线之前, CGPathAddArcToPoint函数会从当前点(矩形的中间)到弧形的初始位置绘制一条线。
  3. 类似的,为右下脚和连接线添加一段弧线。
  4. 类似的,为左下脚和连接线添加一段弧线。
  5. 类似的,为左上脚和连接线添加一段弧线。
  6. 然后使用CGPathCloseSubpath函数,连接弧线的结束点和开始点。

另外注意到上面,我们使用了一些来自CGGeometry.h文件的辅助函数,在我们提供的矩形中,来获得多个位置点信息。好的,让我们现在来看下它的原理!打开 CoolButton.m文件,根据以下代码做修改:

// At top of file
#import "Common.h"
// Replace the contents of drawRect with the following:
CGContextRef context = UIGraphicsGetCurrentContext();
CGColorRef outerTop = [UIColor colorWithHue:_hue saturation:_saturation 
        brightness:_brightness alpha:1.0].CGColor;
CGColorRef shadowColor = [UIColor colorWithRed:0.2 green:0.2 
        blue:0.2 alpha:0.5].CGColor;
CGFloat outerMargin = 5.0f;
CGRect outerRect = CGRectInset(self.bounds, outerMargin, outerMargin);
CGMutablePathRef outerPath = createRoundedRectForRect(outerRect, 6.0);
if (self.state != UIControlStateHighlighted) {
	CGContextSaveGState(context);
	CGContextSetFillColorWithColor(context, outerTop);
	CGContextSetShadowWithColor(context, CGSizeMake(0, 2), 3.0, shadowColor);
	CGContextAddPath(context, outerPath);
	CGContextFillPath(context);
	CGContextRestoreGState(context);
}

这里我们定义了自己的两种颜色,然后使用了CGRectInset函数去获取一个更小的矩形(每条边有5个像素点),我们将会在这个矩形上绘制圆角矩形。并且我们把它做的尽量小以便留有空间在它的外围绘制阴影。

接下来,我们调用刚才写好的函数为我们的圆角矩形创建轨迹,然后设置填充颜色和阴影,添加轨迹到我们的context上面,并且调用FillPath函数,使用当前颜色填充整个矩形。

注意我们只希望在按钮没有被点击的时候,运行代码。编译并运行app,如果一些运行正常,你将看到以下画面:
Rounded Rect, Draft 2

美化我们的按钮

我们现在有个像按钮模样的东西了!但是还不够美观:[

让我们现在着手处理下吧!增加一些重要的改进步骤。打开CoolButton.m文件,并根据以下代码做修改:

// Replace the colors section with the following
CGColorRef blackColor = [UIColor colorWithRed:0.0 green:0.0 
        blue:0.0 alpha:1.0].CGColor;
CGColorRef highlightStart = [UIColor colorWithRed:1.0 green:1.0 
        blue:1.0 alpha:0.4].CGColor;
CGColorRef highlightStop = [UIColor colorWithRed:1.0 green:1.0 
        blue:1.0 alpha:0.1].CGColor;
CGColorRef shadowColor = [UIColor colorWithRed:0.2 green:0.2 
        blue:0.2 alpha:0.5].CGColor;
CGColorRef outerTop = [UIColor colorWithHue:_hue saturation:_saturation 
        brightness:1.0*_brightness alpha:1.0].CGColor;
CGColorRef outerBottom = [UIColor colorWithHue:_hue saturation:_saturation 
        brightness:0.80*_brightness alpha:1.0].CGColor;
CGColorRef innerStroke = [UIColor colorWithHue:_hue saturation:_saturation 
        brightness:0.80*_brightness alpha:1.0].CGColor;
CGColorRef innerTop = [UIColor colorWithHue:_hue saturation:_saturation 
        brightness:0.90*_brightness alpha:1.0].CGColor;
CGColorRef innerBottom = [UIColor colorWithHue:_hue saturation:_saturation 
        brightness:0.70*_brightness alpha:1.0].CGColor;
// Add the following to the bottom
CGContextSaveGState(context);
CGContextAddPath(context, outerPath);
CGContextClip(context);
drawGlossAndGradient(context, outerRect, outerTop, outerBottom);
CGContextRestoreGState(context);

首先我们设置了多种颜色,以便后面使用。有一些普通的颜色,还有一些基于以前的参数设置的颜色。基本颜色是我们构建的,还构建了其他一些颜色,让它们比当前颜色在不同程度上更暗些。

如果你这样去定义颜色,可以让你更容易去改变view(视图)的颜色,提高代码的可重用性!

接下来我们要做的就是裁切我们的圆角矩形,然后用渐变的颜色去填充它(而不是单一的颜色)。编译并运行,我们的按钮现在变得更美观了:

Button Styling - Update 1

现在让我们在按钮内部轨迹添加一种跟外部不同的渐变颜色,创建一种斜面视觉效果。使用以下代码对CoolButton.m文件进行修改:

// Add after the creation of the outerPath
CGFloat innerMargin = 3.0f;
CGRect innerRect = CGRectInset(outerRect, innerMargin, innerMargin);
CGMutablePathRef innerPath = createRoundedRectForRect(innerRect, 6.0);
// At the bottom
CGContextSaveGState(context);
CGContextAddPath(context, innerPath);
CGContextClip(context);
drawGlossAndGradient(context, innerRect, innerTop, innerBottom);
CGContextRestoreGState(context);

这里我们使用CGRectInset函数进一步缩小矩形,然后利用它获得一个圆角矩形,并且填充上渐变颜色。编译运行,你会看到一些微妙的改进:

Button Styling - Update 2

当按钮被点击的时候,我们在它的顶部添加一点高亮效果。使用以下代码对CoolButton.m文件做进一步的修改:

// After the creation of the innerPath
CGFloat highlightMargin = 2.0f;
CGRect highlightRect = CGRectInset(outerRect, highlightMargin, highlightMargin);
CGMutablePathRef highlightPath = createRoundedRectForRect(highlightRect, 6.0);
// At the bottom
if (self.state != UIControlStateHighlighted) {
    CGContextSaveGState(context);
    CGContextSetLineWidth(context, 4.0);
    CGContextAddPath(context, outerPath);
    CGContextAddPath(context, highlightPath);
    CGContextEOClip(context);
    drawLinearGradient(context, outerRect, highlightStart, highlightStop);
    CGContextRestoreGState(context);
}

我们在创建另一个比外部矩形稍微小的圆角矩形,并且在两个矩形之间使用一种alpha高亮渐变颜色去填充,使用我们上篇教程提到的Even-Odd Clip技巧。编译运行程序,你会发现这是很微妙的变化:
Button Styling - Update 3

让我们结束所有的步骤吧。添加以下代码到drawRect:方法的底部:

CGContextSaveGState(context);
CGContextSetLineWidth(context, 2.0);
CGContextSetStrokeColorWithColor(context, blackColor);
CGContextAddPath(context, outerPath);
CGContextStrokePath(context);
CGContextRestoreGState(context);
CGContextSaveGState(context);
CGContextSetLineWidth(context, 2.0);
CGContextSetStrokeColorWithColor(context, innerStroke);
CGContextAddPath(context, innerPath);
CGContextClip(context);
CGContextAddPath(context, innerPath);
CGContextStrokePath(context);
CGContextRestoreGState(context);    
CFRelease(outerPath);
CFRelease(innerPath);
CFRelease(highlightPath);

我们这里所做的是对外部轨迹使用黑色上色(使用两个像素点以避免1px的问题),然后使用1像素点对内部轨迹上色。

你可能会感慨,”我的天“,“那是两个像素点,而不是一个!”好的,我们这里使用了不同的技术解决ipx的问题 – 之前提到过的”clipping mask”技巧。基本上我们设定笔画为2个像素点,然后裁剪掉外部的区域,最后我们释放掉创建的轨迹线。

编译运行app,看下我们的按钮吧!
Button Styling - Update 4

几笔画能做到的这样子确实挺赞的!

Highlighting the Button

突出显示按钮

虽然 我们的按钮看起来相当酷,但是它并不像一个按钮那样可以响应点击操作。没有任何迹象可以看出按钮是否被按下。

幸运的是,Jeff LaMarche在他的文章 posts on the subject 中展示了解决方案。

基本的思路是我们需要重写touch events的方法,去让按钮自己重新绘制显示,因为它需要根据点击状态去更新外形。使用下面的代码对CoolButton.m文件进行修改:

// Add the following methods to the bottom
- (void)hesitateUpdate
{
    [self setNeedsDisplay];
}
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    [self setNeedsDisplay];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];
    [self setNeedsDisplay];
 
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesCancelled:touches withEvent:event];
    [self setNeedsDisplay];
    [self performSelector:@selector(hesitateUpdate) withObject:nil afterDelay:0.1];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];
    [self setNeedsDisplay];
    [self performSelector:@selector(hesitateUpdate) withObject:nil afterDelay:0.1];
}
编译运行工程,现在当你点击按钮的时候,你将看到不同的变化 - 突出显示和点击消失了。现在让我们修改一下代码做得更好一些:
// At beginning of function
CGFloat actualBrightness = _brightness;
if (self.state == UIControlStateHighlighted) {
    actualBrightness -= 0.10;
}   
// Then replace all further cases in the function that use 
//      "_brightness" to define colors with "actualBrightness".

重新编译运行,现在当你点击按钮的时候,按钮看起来更美观了!

Tapped Button

Where To Go From Here?

接下来我们可以做什么?

本教程的例子源代码工程,可以到这里下载。

既然我们从零开始了解了如果创建个性化按钮的全过程,你将对如何个性化定制按钮,以便使用到自己的工程中觉得相当熟悉了!

接下来在Core Graphics 101 教程系列的最后一篇教程,我们将讨论如何使用模式去制作很酷的效果!


C# Winform重绘按钮 重新绘制winform 按钮 阅读详情

相关推荐

宇树G1灵巧手技术瓶颈:从感知控制到工程落地的挑战

在机器人技术领域,灵巧手是实现精细操作的核心部件,其工作原理涉及多自由度协同控制与实时力反馈调节。从技术价值看,灵巧手是连接感知决策与物理执行的关键接口,直接影响机器人在非结构化环境中的适应能力。当前应用场景已从工业装配延伸至家庭服务、医疗康复等领域,但普遍面临感知-控制-学习的三角难题。本文聚焦宇树G1人形机器人,通过分析其强化学习框架与仿真到现实的迁移挑战,揭示灵巧手在力控抓取、工具使用等实操任务中的工程化瓶颈,为具身智能的实用化路径提供验证视角。

weixin_33754065的博客 669

CSS让网页里的提交按钮变得更漂亮

你是不是觉得自己的主页不够靓丽,想让它有所改变呢?听说过样式表格吗?就是CSS,它就是那个能让你更为准确地控制网页的东东。让我们先来看两个例子:      1、把按钮的背景由灰色变成黄色,下面是代码:〈form method="POST"〉 〈input type="button" value="按钮" name="B1" style="background-color: rg

twosecond 2751

重绘 C# button按钮

看这了代码后,在C# winform下,你想要什么样的按纽都可以用代码画出来,这样的重绘方法资率比较高,可以放心使用

css实现流光按钮

实现效果如下图:鼠标悬浮,按钮开始变化流光展示炫酷效果提示:以下是本篇文章的代码内容,供大家参考,相互学习设置元素不响应元素,看得见摸不着,pointer-events 属性定义元素是否对指针事件做出反应。可选:auto:默认值。元素对指针事件做出反应,比如 :hover 和 click。none:元素不对指针事件做出反应。initial:将此属性设置为其默认值。inherit:从其父元素继承此属性。input:focus 选择器:选择已被选中的input。

weixin_45727272的博客 1404

Kaggle | 总奖池超200万美金的数学竞赛AIMO2冠军方案

••••结论1:通过结合高质量大规模数据集、工具集成推理和生成式选择方法,可以构建在挑战性数学问题上达到最先进水平的语言模型。本文的方法在 AIMO-2 竞赛中的胜利以及在多个数学基准上的 SOTA 结果验证了这一策略的有效性。结论2:发布 OpenMathReasoning 数据集、OpenMath-Nemotron 模型和代码是社区的宝贵财富。

hxshine的博客 1196

XCP实战系列介绍07-使用ASAP2 Editor生成A2l文件详解

介绍通过ASAP2 Editor工具生成A2l文件步骤详解

initiallizer的博客 7298

C#中创建圆形/按钮(使用重绘)

创建圆形按钮挺简单的。 public class EllipseButton : Button { protected override void OnPaint(PaintEventArgs pevent) { GraphicsPath gPath = new GraphicsPath(); // 绘制椭圆形区域 gPath.AddEllipse(0, 0, this.ClientSize.Width, this.ClientSi.

u011555996的博客 1936

Apollo 9.0 速度非线性规划算法 – piecewise jerk speed nonlinear optimizer Ⅰ

二次规划的速度规划算法(PiecewiseJerkSpeedOptimizer)的存在两个问题: 这里以一张图来说明上面的问题,假设存在一个实际限速区间(或曲率很大需要降速的区间)[S1, S2],PiecewiseJerkSpeedOptimizer的做法是根据动态规划的st曲线(黑色),找到具体的时间区间[T1, T2],然后对区间[T1, T2]内所有的点施加约束或惩罚。但是二次规划平滑后的曲线(黄色)发生了变化,那么限速区间[S1, S2]对应的时间区间[T1, T2]也发生了变化,所以实际应该是对

WaiNgai 333

Core Graphics 101: 光滑的按钮

原文地址:http://www.raywenderlich.com/zh-hans/20367/core-graphics-101-%E5%85%89%E6%BB%91%E7%9A%84%E6%8C%89%E9%92%AE 欢迎回到Core Graphics 101教程系列的另一篇教程!在这篇教程中,我们将会结合实例开始讲解Core Graphics 101! 在教程1,2和3,我们讲

qtcreatorlinux的专栏 886

Cesium 实战 26 - 自定义纹理材质 - 箭头流动线(图片纹理)

Cesium 实战 - 自定义纹理材质 - 箭头流动线(图片纹理)。

非科班Java出身GISer的博客 1403

TypeError: ‘<=‘not supported between instances of ‘float’and ‘str‘解决方案

本文主要介绍了TypeError: '

weixin_43178406的博客 28万+

想让jcombobox显示图片要重写ui吗_二、UI相关知识

一、TextMeshPro1、无论是文字放大缩小,都能够保持锐利清晰。美术效果提升明显。2、阴影、描边等效果在shader实现,更加高效。UGUI的Text通过多画几遍文字的方式实现描边,文字一多,顶点可能就爆了。3、几乎没有GCAlloc。该做的缓存都有做。大量结构都是struct。4、文字生成速度很快。几乎不用担心界面打开卡顿的问题。也不用针对大量显示的数字做BMFont来优化性能。5、缺点是...

weixin_39777497的博客 159

【ArcGIS Pro微课1000例】0067:ArcGIS Pro3.4.2学习版下载及安装教程

【ArcGIS Pro微课1000例】0067:ArcGIS Pro3.4.2学习版网盘下载及安装教程

智慧空间实验室 2389

Hilo3d API参考手册:核心类与方法全解析

Hilo3d 是一款面向生产环境的现代 Web 图形引擎,同时支持 WebGL2 与 WebGPU 双后端渲染,可用于构建 2D 与 3D 交互体验。本文是一份面向初学者的 Hilo3d API 参考手册,围绕 Stage、Renderer、Node、Mesh、Camera、灯光、材质、加载器等核心类与方法展开全解析,帮助你快速掌握 Hilo3d 的编程模型,从零搭建第一个 3D 场景。 [![

gitblog_00369的博客 889

2万字大厂面经:小米嵌入式面试题及参考答案(持续更新)

BIOS (Basic Input/Output System) 是一种存储在ROM中的固件程序,它为计算机提供了最基础的硬件初始化和服务。BIOS主要存在于传统的x86架构计算机中。嵌入式系统的启动流程取决于具体的硬件平台和所采用的操作系统。复位阶段:当系统通电或复位时,CPU进入复位状态。硬件初始化:CPU和必要的硬件设备(如内存控制器)被初始化。加载引导加载程序:引导加载程序(如U-Boot)被加载到内存中。执行引导加载程序:引导加载程序开始执行,初始化更多的硬件设备,并检测存储介质。

大模型大数据攻城狮的专栏 2529

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

虚拟内容:从工程视角看AI如何重塑内容生产与消费

在人工智能技术快速发展的今天,虚拟内容已成为内容生产领域的重要趋势。从技术原理上看,虚拟内容技术主要基于深度学习和生成式模型,通过大规模数据训练,实现对文本、图像、视频等内容的自动化生成。其核心价值在于作为效率杠杆和创意催化剂,能够显著降低内容生产的启动成本,解决重复性、模板化内容的批量生产问题,并降低高门槛视觉内容创作的技术壁垒。在应用场景上,虚拟内容已广泛应用于AI写作、AI绘画、AI视频生成、个性化内容交付等领域,为内容创作者和消费者带来了全新的可能性。本文将从工程实践角度,探讨虚拟内容如何解决真实世

weixin_33834137的博客 323

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Unity面试核心:从原理到实战的深度能力考察与准备策略

在游戏开发领域,Unity引擎作为核心技术栈,其面试不仅考察API的熟悉度,更注重对底层原理和工程实践的理解。理解引擎的渲染管线、资源管理、物理系统等核心模块的工作原理,是构建高性能、稳定游戏应用的基础。这种深度认知能直接转化为解决实际性能瓶颈、内存泄漏等复杂问题的能力,对于开发大型商业项目至关重要。本文聚焦于Unity面试中高频出现的【协程】实现机制与【对象池】设计模式等核心热词,深入剖析其背后的状态机原理与享元模式思想,旨在帮助开发者构建从概念理解到场景迁移的完整能力图谱,从而在面试中展现真正的工程素养

weixin_34150830的博客 285

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C# Winform编程RadioButton重绘

这里为了简单,没有扩展RadioButton实现重用。 privatevoidradioButton1_Paint(objectsender,PaintEventArgse) { RadioButtonrButton=(RadioButton)sender; Graphicsg=e.Graphics; ...

weixin_33775582的博客 922

重绘按钮,做个自己的圆形LED指示灯

最近为了做个上位机触摸屏软件,客户要求和工业触摸屏界面一样,要求指示灯做成圆形的。实际应用中,添加LED控件后,修改属性type的值,指示灯的颜色就会自动切换。

yxt99的博客 1739

Button控件的重绘

 在用VC6.0编写windows程序时,你是不是时常因为自己的界面不好看而自卑。从现在开始我就来尝试着使我们的程序旋起来。按钮是我们编写windows程序时不可缺少的控件之一。按一般用户的理解,不管窗口是否为输入焦点,当鼠标(准确的说应该是光标cursor)划过按钮时,按钮应该变色,表示这个地方是可以按下的。可是用VC6.0原始给出的按钮像个傻瓜一样,没有丝毫反应。其实要让他有反应还

alunlee的专栏 2808

C# button重绘

1.添加一个新类 using System;using System.Windows;using System.Windows.Forms;using System.Collections.Generic;using System.Text;using System.Drawing; namespace WindowsFormsApplication2{ class MyButton:S...

weixin_30536513的博客 678

c# GDI+之Button重绘(转)

在.NET平台混总是入门容易进阶难。最近在看GDI+,重写了一个自己的按钮,感觉还不错,值得推广,(*^__^*) 嘻嘻…… 写了一个绘制圆角Button的工具类: using System;using System.Collections.Generic;using System.Text;using System.Drawing;using System.Drawing.Dr...

weixin_30662539的博客 375

iOS重绘机制drawRect

iOS的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要写一个扩展UIView 的类,并重写drawRect方法,在这里进行绘图操作,程序会自动调用此方法进行绘图。 下面先说明一下绘图,比如,你想绘制一个方块,你需要写一个类来扩展UIView并在drawRect方法中填入如下代码: - (void)drawRect:(CGRect)rec...

gcs的博客 985

重绘Button控件

分享到 一键分享QQ空间新浪微博百度云收藏人人网腾讯微博百度相册开心网腾讯朋友百度贴吧豆瓣网搜狐微博百度新首页QQ好友和讯微博更多... 百度分享 public partial class ShapeButton : Button { public ShapeButton() { InitializeCompo

u012792791的专栏 1618
上一篇: Core Graphics : 弧线和轨迹
下一篇: UIView中动画及其属性说明
Vjsplus
博客等级 码龄13年 1粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值