刚才给同学推荐了神舟笔记本推荐,是不是要被饮水机了

21ic官方微信-->
后使用快捷导航没有帐号?
请完成以下验证码
查看: 538|回复: 17
PWM 初始化
&&已结帖(0)
主题帖子积分
技术达人, 积分 9957, 距离下一级还需 43 积分
技术达人, 积分 9957, 距离下一级还需 43 积分
主题帖子积分
专家等级:结帖率:83%打赏:10.00受赏:10.00
主题帖子积分
技术达人, 积分 9957, 距离下一级还需 43 积分
技术达人, 积分 9957, 距离下一级还需 43 积分
PWM就是脉冲宽度调制。说白了就是可以输出波形,波形的频率、高电平宽度/低电平宽度都可以调节。PWMIP的功能很多,除了输出基本的波形,还能捕获、输出互补的波形、中心对齐的波形或者触发ADC进行采样,以及刹车等等功能。 新唐芯片的PWM有的多达24路,频率可以到100M或者更高。 下面的demo,只demo简单的PWM输出波形的功能。从PWM0的通道0输出100HZ的波形,高电平占30%。要使用更复杂的功能,需要详细研读TRM(技术参考手册)int32_t PWM_init (void)
& & /* 使能PWM0通道0/1的时钟 */
CLK_EnableModuleClock(PWM0_CH01_MODULE);
/* PWM0 IP选择HCLK作时钟源 */
CLK_SetModuleClock(PWM0_CH01_MODULE, CLK_CLKSEL1_PWM0_CH01_S_HCLK, 0);
& & /* 配置 PB8 和 PB9用作PWM0的通道0和通道1 */
& & SYS-&PB_H_MFP = (SYS-&PB_H_MFP & ~(SYS_PB_H_MFP_PB8_MFP_Msk | SYS_PB_H_MFP_PB9_MFP_Msk))
| SYS_PB_H_MFP_PB8_MFP_PWM0_CH0 | SYS_PB_H_MFP_PB9_MFP_PWM0_CH1;
& & /* PWM0 frequency is 100Hz, duty 30% */
& & PWM_ConfigOutputChannel(PWM0, 0, 100, 30);
& & /* 使能PWM0的通道0输出功能 */
& & PWM_EnableOutput(PWM0, PWM_CH_0_MASK);
/* 开始输出波形 */
& & PWM_Start(PWM0, PWM_CH_0_MASK);
& & while(1);
复制代码之后从PB8就会量到100HZ的波形,占空比30%。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
技术达人, 积分 9957, 距离下一级还需 43 积分
技术达人, 积分 9957, 距离下一级还需 43 积分
主题帖子积分
专家等级:结帖率:83%打赏:10.00受赏:10.00
主题帖子积分
技术达人, 积分 9957, 距离下一级还需 43 积分
技术达人, 积分 9957, 距离下一级还需 43 积分
函数PWM_ConfigOutputChannel(PWM0, 0, 100, 30); 通过修改下面四个寄存器实现功能
?&&PWM0 选择 HCLK 做时钟源,假设 HCLK工作在 32M,预分频之后 PWM0 频率=32M/32=1MPWM0-&PRES= (PWM0-&PRES&~PWM_PRES_CP01_Msk) | 0x1F;//divided by (CP01 + 1) PWM0-&CLKSEL= PWM_CLK_DIV_1&&PWM_CLKSEL_CLKSEL0_P//通道0输入时钟再& && && &除以1& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && & ?&&PWM0 Timer 0 工作在连续模式 ,将会连续输出 PWM 波形 PWM0-&CTL = PWM_CTL_CH0MOD_M//continuousmode ?&&设置频率和占空比。频率=1M/10000 = 100HZ,总共计数 10000,duty 时间占 3000*/ PWM0-&DUTY0 = 3000&&PWM_DUTY0_CM_Pos| 10000;
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
技术达人, 积分 9957, 距离下一级还需 43 积分
技术达人, 积分 9957, 距离下一级还需 43 积分
主题帖子积分
专家等级:结帖率:83%打赏:10.00受赏:10.00
主题帖子积分
技术达人, 积分 9957, 距离下一级还需 43 积分
技术达人, 积分 9957, 距离下一级还需 43 积分
我觉得直接修改寄存器更有弹性,不过就是要熟悉这四个寄存器。?&&PRES就是 PWM的预分频寄存器。PWM的时钟源经过 PRES预分频之后传给 PWM0的CLKSEL 寄存器 ?&&PWM0的 CLKSEL可以再次进行分频,所以 PWM可以输出很慢的频率 ?&&CTL寄存器用于设定 PWMTimer 工作在 one-shot模式还是连续模式,以及波形是否要反转等等 ?&&DUTY寄存器用于设定 PWM输出波形的频率和占空比
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级工程师, 积分 2476, 距离下一级还需 524 积分
初级工程师, 积分 2476, 距离下一级还需 524 积分
主题帖子积分
专家等级:结帖率:60%
主题帖子积分
初级工程师, 积分 2476, 距离下一级还需 524 积分
初级工程师, 积分 2476, 距离下一级还需 524 积分
芯片手册里面怎么知道用哪个GPIO可以输出PWM呢?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级技术员, 积分 208, 距离下一级还需 92 积分
中级技术员, 积分 208, 距离下一级还需 92 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级技术员, 积分 208, 距离下一级还需 92 积分
中级技术员, 积分 208, 距离下一级还需 92 积分
假设PWM分辩率为256级,能输出的最高频率是多少?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
资深技术员, 积分 362, 距离下一级还需 138 积分
资深技术员, 积分 362, 距离下一级还需 138 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 362, 距离下一级还需 138 积分
资深技术员, 积分 362, 距离下一级还需 138 积分
用GPIO模拟的PWM和硬件PWM主要差在什么地方呢
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 4025, 距离下一级还需 975 积分
中级工程师, 积分 4025, 距离下一级还需 975 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
中级工程师, 积分 4025, 距离下一级还需 975 积分
中级工程师, 积分 4025, 距离下一级还需 975 积分
PWMIP的功能很多,除了输出基本的波形,还能捕获、输出互补的波形、中心对齐的波形或者触发ADC进行采样,以及刹车等等功能。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
资深技术员, 积分 374, 距离下一级还需 126 积分
资深技术员, 积分 374, 距离下一级还需 126 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 374, 距离下一级还需 126 积分
资深技术员, 积分 374, 距离下一级还需 126 积分
PWMIP& &如何触发ADC进行采样?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
/* PWM0 frequency is 100Hz, duty 30% */
& & PWM_ConfigOutputChannel(PWM0, 0, 100, 30);
这个有4个参数,第一个,是选择哪个发生器,第二个选择通道号,第三个和第四个分母分子
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 4332, 距离下一级还需 668 积分
中级工程师, 积分 4332, 距离下一级还需 668 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4332, 距离下一级还需 668 积分
中级工程师, 积分 4332, 距离下一级还需 668 积分
新唐芯片的PWM有的多达24路,频率可以到100M或者更高。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
技术达人, 积分 9957, 距离下一级还需 43 积分
技术达人, 积分 9957, 距离下一级还需 43 积分
主题帖子积分
专家等级:结帖率:83%打赏:10.00受赏:10.00
主题帖子积分
技术达人, 积分 9957, 距离下一级还需 43 积分
技术达人, 积分 9957, 距离下一级还需 43 积分
新唐芯片的PWM有的多达24路,频率可以到100M或者更高。
24路够你随便用了,应该是没有胜任不了的场合。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
资深技术员, 积分 311, 距离下一级还需 189 积分
资深技术员, 积分 311, 距离下一级还需 189 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
资深技术员, 积分 311, 距离下一级还需 189 积分
资深技术员, 积分 311, 距离下一级还需 189 积分
参考BSP里面的DEMO配置就可以啦, 我都用过了。
立一山嵌入式系统 ARM|PowerPC|驱动|BSP QQ:
& && && && && && && && & i.MX6Q核心板|ODM/OEM
主题帖子积分
技术达人, 积分 9957, 距离下一级还需 43 积分
技术达人, 积分 9957, 距离下一级还需 43 积分
主题帖子积分
专家等级:结帖率:83%打赏:10.00受赏:10.00
主题帖子积分
技术达人, 积分 9957, 距离下一级还需 43 积分
技术达人, 积分 9957, 距离下一级还需 43 积分
不掰着手册做几遍,你是真不熟练。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
PWM就是脉冲宽度调制,也就是占空比可变的脉冲波形.
脉冲宽度调制是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
PWM控制技术就是对半导体开关器件的导通和关断进行控制,使输出端得到一系列幅值相等而宽度不相等的脉冲,用这些脉冲来代替正弦波或其他所需要的波形。按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
电流跟踪型PWM变流电路就是对变流电路采用电流跟踪控制。也就是,不用信号波对载波进行调制,而是把希望输出的电流作为指令信号,把实际电流作为反馈信号,通过二者的瞬时值比较来决定逆变电路各功率器件的通断,使实际的输出跟踪电流的变化。采用滞环比较方式的电流跟踪型变流器的特点:
①硬件电路简单;
②属于实时控制方式,电流响应快;
③不用载波,输出电压波形中不含特定频率的谐波分量;
④与计算法和调制法相比,相同开关频率时输出电流中高次谐波含量较多;
⑤采用闭环控制.
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
中级工程师, 积分 4593, 距离下一级还需 407 积分
若令频率不变,直接改变脉冲的宽度,亦即控制开关元件的导通时间;比如现在是高电平导通,那么方波的A越大,B越小,导通时间就长;否则就越短。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
技术达人, 积分 9957, 距离下一级还需 43 积分
技术达人, 积分 9957, 距离下一级还需 43 积分
主题帖子积分
专家等级:结帖率:83%打赏:10.00受赏:10.00
主题帖子积分
技术达人, 积分 9957, 距离下一级还需 43 积分
技术达人, 积分 9957, 距离下一级还需 43 积分
新唐M051 pwm使用程序#include &PWM.h&
#define EN_EXT_OSC& && & 0
#define COMPLEMENT_MODE& && && &0x
#define DEAD_ZONE_INTERVAL& && &0xC8FF0000
#define PWM_ENABLE& && && && &&&0x
#if& &&&EN_EXT_OSC
#define PWM_CLOCK_SOURCE& && &&&0x&&//使用外部振荡12MHz
#else&&
#define PWM_CLOCK_SOURCE& && &&&0xF0000000&&//使用内部RC振荡22.1184MHz
#endif
#define PWM_PRESCALAE& && && &&&0x&&//PWM01预分频0x31(49),PWM23预分频0xC7(199)
#define PWM_CLOCK_DIVIDER& && & 0x&&//输入时钟分频1
#define PWM_OUTPUT_INVERT& && & 0x
#define PWM_OUTPUT_ENABLE& && & 0x0000000F& &//PWM0、1、2、3输出使能
#define PWM_CMR_VALUE& &0x0
#define PWM_CNR_VALUE& && & 0x1000& && &//4096
/*
PWM频率=PWMxy_CLK/(prescale+1)*(clock divider)/(CNR+1)
(1)使用外部晶振12MHz
PWM频率=+1)*Hz
(2)使用内部RC振荡22.1184MHz
PWM频率=+1)*Hz
*/
#define LED_DARKING& && && && & 0
#define LED_BRIGHTING& &1
STATIC UINT32 g_unPWMCMRValue=PWM_CNR_VALUE;
STATIC UINT32 g_unLedStat=LED_DARKING;
/****************************************
*函数名称:PWMInit
*输& & 入:无
*输& & 出:无
*功& & 能:PWM初始化
******************************************/
VOID PWMInit(VOID)
{
& & P2_MFP |= ~(P20_AD8_PWM0 | P21_AD9_PWM1 | P22_AD10_PWM2 | P23_AD11_PWM3);
P2_MFP |= (PWM0 | PWM1 | PWM2 | PWM3);& &//使能P2.0~P2.3为PWM输出& &
& & P2_PMD &= ~Px0_PMD;& && && && && && && &&&//配置P2.0~P2.3为推挽输出
P2_PMD |= Px0_OUT;
P2_PMD &= ~Px1_PMD;
P2_PMD |= Px1_OUT;
P2_PMD &= ~Px2_PMD;
P2_PMD |= Px2_OUT;
P2_PMD &= ~Px3_PMD;
P2_PMD |= Px3_OUT;
& & APBCLK |= PWM01_CLKEN | PWM23_CLKEN;& && && && && && && && &//使能PWM0~3时钟
CLKSEL1 = PWM_CLOCK_SOURCE;& && && && && &&&//选择PWM0~3时钟源
& &
PPRA = PWM_PRESCALAE | DEAD_ZONE_INTERVAL;& && && && && && &//选择PWM0~3时钟预分频和死区间隔
& & CSRA = PWM_CLOCK_DIVIDER;& && && && && && && && && && && &&&//选择PWM0~3时钟分频
& & PCRA = 0x | PWM_OUTPUT_INVERT | COMPLEMENT_MODE;& & //PWM0~3自动重装载
& & CNR0A = CNR1A = CNR2A = CNR3A = PWM_CNR_VALUE;& && && && &&&//PWM0~3计数值
& & CMR0A = CMR1A = CMR2A = CMR3A = PWM_CMR_VALUE;& && && && &&&//PWM0~3比较值
& & PIERA&&|= PWMIE3 | PWMIE2 | PWMIE1 | PWMIE0 ;& & //使能PWM0~3中断
& & NVIC_ISER |= PWMA_INT;& && && && && && && && && && && && &&&//使能PWM0~3中断
& & POEA = PWM_OUTPUT_ENABLE;& && && && && && && && && && && &&&//PWM输出使能
& & PCRA |= PWM_ENABLE;& && && && && && && && && && && && && &&&//PWM使能,启动
}
/****************************************
*函数名称:PWMA_IRQHandler
*输& & 入:无
*输& & 出:无
*功& & 能:中断服务函数-PWMA
******************************************/
VOID PWMA_IRQHandler(VOID)
{
&&switch(g_unLedStat)& && && && &//检查LED状态
&&{
& &case&&LED_DARKING:& && && &//LED状态渐暗
&&{
& & if(g_unPWMCMRValue & PWM_CNR_VALUE)
& & {
& &&&g_unPWMCMRValue+=50;
& & }
& & else
& & {
& && & g_unLedStat = LED_BRIGHTING;
& &&&g_unPWMCMRValue=PWM_CNR_VALUE;
& & }&&
&&}
&&case&&LED_BRIGHTING:& && && &//LED状态渐亮
&&{
& & if(g_unPWMCMRValue&=50)
& & {
& &&&g_unPWMCMRValue-=50;
& & }
& & else
& & {
& && & g_unLedStat = LED_DARKING;
& &&&g_unPWMCMRValue=PWM_CMR_VALUE;& &
& & }
&&}
&&default:&&
&&}
&&CMR0A = CMR1A = CMR2A = CMR3A = g_unPWMCMRV&&//设置PWM0~3比较值
& &&&PIIRA = PIIRA;& && && && && && && && && &
}
/****************************************
*函数名称:main
*输& & 入:无
*输& & 出:无
*功& & 能:函数主体
******************************************/
INT32 main(VOID)
{
& &PROTECT_REG& && && && && && && && & //ISP下载时保护FLASH存储器
&&(
& &PWRCON |= XTL12M_EN;& && && && && && & //默认时钟源为外部晶振
& &while((CLKSTATUS & XTL12M_STB) == 0);& && && && && & //等待12MHz时钟稳定&&
& &CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;& && && && &&&//设置外部晶振为系统时钟
& &PWMInit();& && && && &&&//PWM初始化
&&)
& &&&while(1);
}复制代码
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
技术高手奖章
人才类勋章
湍急之河流
发帖类勋章
精华达人奖章
等级类勋章
时间类勋章
技术新星奖章
人才类勋章
时间类勋章1063人阅读
Flex Module(8)
一、使用背景是为解决应用初始化时较大的下载负载问题而设计的一种折中方案。将主合理分割为多个后,配合延迟加载策略,就可以保证主在初始化只加载必要的资源从而减少等待时间。未被访问的默认将不被加载,这样在首次访问它们时会需要额外的等待时间,当然我们也可以在监听主加载完毕事件中将这些提前载入或者直接取消使用延迟加载策略以保证的响应时间。二、相关类和接口简介与相关的类和接口如下:()()()()()()()
在使用FLEX模块时有几点需要注意的地方
1.module内不可以访问别的module的对象但是可以访问主程序的对象引用
2.不要在主程序中创建模块的引用,这样模块还是会被加载到主程序中,模块的意义也就没了。
3.module内的组件的初始化实在ModuleEvent.READY事件之后,所以不能在ModuleEvent.READY事件里直接访问module内的组件
为了在主程序中使用module对象来操作module内的一些行为,这时可以将module对象在主程序中转换成object类型,然后保存引用,或者让module实现一个接口,然后保存该接口的引用。
然而使用object类型无法知道内部公开的方法,但使用接口就没有此问题
在使用FLEX提供的动态的载入module功能时我们需要用到一下3个类
&ModuleManager,IModuleInfo,ModuleEvent
&&&&& ModuleManager 内有一个管理各个module的map,ModuleManager 在加载module之前会判断他是否已经存在,如果存在则不会再次加载通过ModuleManager.getModule(URL)方法我们可与获取到ModuleManager的内部类ModuleInfoProxy的对象,ModuleInfoProxy实现了IModuleInfo接口,因此我们可以通过IModuleInfo接口来保存ModuleInfoProxy内部类的对象对象进行系列的操作。
有关ModuleManager,IModuleInfo,ModuleEvent的详细信息见帮助文档。
如何动态的载入module:
&1.通过ModuleManager.getModule(URL)获取与特定 URL 关联的 IModuleInfo 接口。
_moduleInfo=ModuleManager.getModule(&com/myMusic/nominateMusicModule/NominateMusic.swf&);
&2.为加载module的各个过程添加事件监听
&_moduleInfo.addEventListener(ModuleEvent.READY, onModuleReady);
&_moduleInfo.addEventListener(ModuleEvent.SETUP, onModuleSetup);
&_moduleInfo.addEventListener(ModuleEvent.UNLOAD, onModuleUnload);
&_moduleInfo.addEventListener(ModuleEvent.PROGRESS, onModuleProgress);
&3.调用loader方法执行加载动作
&_moduleInfo.load(); //加载Module
对于一个较大型的Flex RIA应用,生成的 swf文件的体积必然不会小, 在中国这样艰苦的网络环境下面,不得不考虑如何让用户减少等待的时间. 这样就需要把一个大的Flex程序分成各个不同的功能部件, 每个Module单独编译成一个 SWF ,需要的时间,再动态的加载调用.减小主程序的体积.
具体的做法是:
&使用 mx.modules.ModuleLoader 可以进行Module动态加载.
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:626519次
积分:9190
积分:9190
排名:第1901名
原创:245篇
转载:200篇
译文:16篇
评论:94条
(1)(1)(1)(1)(1)(2)(1)(10)(21)(7)(4)(11)(12)(3)(20)(2)(1)(9)(23)(8)(2)(3)(5)(7)(8)(19)(7)(7)(3)(2)(5)(6)(14)(15)(11)(15)(21)(8)(24)(26)(8)(25)(24)(5)(18)(3)(32)2247人阅读
flex(84)
Flex生成的swf是个2帧的MovieClip,文档类继承SystemManager。
2帧结构是为创建加载应用程序的默认加载器。
加载器的外观是通过代码绘制的,SystemManager使用工厂模式来创建应用程序。
当Flex工程和需要的共享库下载完毕后,SystemManager跳到第二帧,从应用程序域中找出Application的定义创建实例。
SystemManager:
SystemManager是Flex发布swf的文档类,是应用程序的入口,SystemManager继承MovieClip,不仅控制swf的加载和启动,还划分Flex工程显示层级,保存嵌入字体和样式,监视swf画布大小等顶级功能,某些功能被映射到Application或全局管理器中,你可以选择访问的方式。
popUpChildren:IChildList,toolTipChildren:IChildList,cursorChildren:IChildList并不是具体的显示层,而是记录顶级层的集合,SystemManager自动维护这些集合。
SystemManager重写了DisplayObjectContainer的接口,它与Container一样忽略辅助性的元素,通过SystemManager获取的子级实际上不包含浮动窗口、工具提示和光标这样的辅助层,也不包括内部的鼠标捕捉层,只包含默认的应用程序层和使用addChild()等方法添加进来的应用层,这也是SystemManager提供cursorChildren等这样的集合访问而不是通过getChildAt()访问顶级显示层的原因。
通过cursorChildren这样的集合也并不能完全暴露SystemManager的所有子级,要访问原始子级,可以使用rawChildren:IChildList属性进行遍历,但不要通过此手段破坏SystemManager的结构。
载入Flex项目
SystemManager实现IFlexModuleFactory接口,但并不表示它可以作为一个Module载入,扩展IFlexModuleFactory是为了利用工厂模式分离preloader和Application的关联。整个Flex项目确实可以载入到其它项目中的,但不是以Module方式载入而是通过普通方法加载,例如使用SWFLoader或Loader加载,SystemManager作为顶级容器加入到项目的显示列表。
SystemManager的application:IUIComponent属性引用载入Flex项目的application实例,getDefinitionByName(name:String):Object方法获取载入swf中的定义,例如Object(SystemManager(mySwfLoader.content).application.testButton获取载入项目中的testButton按钮实例,SystemManager(mySwfLoader.content).getDefinitionByName(&TestButton&)获取载入项目中的TestButtond定义。
将Flex项目载入到另一个Flex项目中时后,会使用新项目的SystemManager管理顶级层,因为全局管理器只能有一个,例如载入项目中有弹出窗口,这个弹出窗口的父级为新项目的SystemManager,原项目的SystemManager仅作为一个父级存在,它的功能只限定于引用,原项目中可以使用topLevelSystemManager:ISystemManager属性引用新项目的SystemManager。让一个Flex项目载入另外一个Flex项目没有什么优势,不能很好的体现项目和模块的关系,代码组织不明确且无法避免重定义,我们应该使用Module来分割应用程序。一个例外是你可以让Flash项目载入Flex工程构建UI来代替Flash的v3组件框架,但你需要斟酌加载swf给Flash项目带来的等待时间,Flex项目通常体积比较大。
Application
Application是应用层的顶级容器,Application的某些属性关系到Flex如何编译项目或生成的网页,这些属性不能用as设置,只能通过mxml标签设置,如下:
获取swf地址和flashVars
Application的url:String可以获取swf地址,但这个属性依然不能获取网页传递的值对,因为Application是通过发布swf的loaderInfo获取地址,parameters:Object属性映射了loadInfo的flashVars,访问flashVars参数比较方便。
Flex的预加载器为mx.preloaders.Preloader,Preloader加载应用程序和SystemManager传入的RSL共享库以及资源模块,Preloader并不包含加载器的界面,它是一个位置为(0,0)的空Sprite,采用mx.preloaders.DownloadProgressBar作为默认的皮肤。
Preloader在加载过程中发送大量的事件,DownloadProgressBar和SystemManger通过监听Preloader的事件显示加载进度和跳帧。Application中preloader属性可以更改Preloader使用的加载界面,默认路径为mx.preloaders.DownloadProgressBar,如果你指定其他类,这些类将代替DownloadProgressBar被编译到项目中。
修改加载界面可以分为两种方式,一是修改默认预加载器样式,即设置DownloadProgressBar的属性,二是通过制定类名自定义预加载器皮肤,Preloader作为功能类无需更改其逻辑。Application的usePreloader:Boolean属性可以禁用预加载器,但并不会改变Flex发布swf的结构,swf依然被编译为2帧并且使用Prelaoder加载,只是不创建加载外观而已。
修改预加载器样式
DownLoadProgressBar提供了一些属性用于设置加载器样式,背景样式被声明为public,自定义加载界面后仍然可以设置这些属性,绘制的矢量界面和文本标签被声明为protected,自定义加载界面后将无法访问。
DownloadProgressBar并不是只有中间显示的那个加载框,还拥有一个和舞台一样大小的背景色块,backgroundColor:uint,backgroundAlpha:Number属性可以设置加载器的背景颜色和透明度,backgroundImage:String和backgroundSize:String属性可以设置背景图片和大小,backgroundImage可以是文件名或类名,设置为文件名后会自动使用内部的Loader加载背景图片,但加载背景图片会增加加载swf加载时间,backgroundSize设置背景图片的缩放方式,如果为百分比,则”100%”表示拉伸到背景图片到完整大小,为”auto”表示图片保持大小不变。
Preloader在创建DownLoadProgressBar时会将背景设置为Application的背景颜色,然后调用DownLoadProgressBar的initialize()方法,我们可以通过覆盖initiliaze()方法更改背景设置,例如:
override public function initialize():void
&&&&&& super.initialize();
&&&&&& backgroundImage=&chuyin30.jpg&;
&&&&&& backgroundAlpha=0.2;
加载框和加载条
borderRect:RoundedRectangle可以修改加载框的大小,barFrameRect:RoundedRectangle和barRect:RoundedRectangle可以修改加载槽和加载条的大小,如图:
这两个属性都是只读的,修改需要覆盖get属性。没有修改加载框和加载条颜色的属性,加载框默认为透明的灰色,要自定义加载框和加载条,需要自定义加载界面。
修改加载标签
默认情况下DownloadProgressBar只显示了提示标签而没有显示进度标签,我们可以通过showPercentage:Boolean属性启用进度标签,showLabel:Boolean用于扩展显示自定义标签,labelRect:Retangle,labelFormat:TextFormat修改提示标签的大小和格式,percentRect:Rectangel和percentFormat属性设置进度文本的大小和格式。label:String属性为提示标签文本内容,加载应用程序时显示downloadingLabel:String属性的值,加载共享库时显示共享库的加载个数。
下图为修改过的DownloadProgressBar样式:
修改代码如下:
&& import mx.graphics.RoundedR
&& import mx.preloaders.DownloadProgressB
&& public class DownloadProgressBar1 extends DownloadProgressBar
&&&&&& public function DownloadProgressBar1()
&&&&&&&&& super();
&&&&&& override public function initialize():void
&&&&&&&&& super.initialize();
&&&&&&&&& backgroundColor=0xAAAAAA;
&&&&&&&&& downloadingLabel=&&;
&&&&&&&&& showPercentage=
&&&&&& override protected function get borderRect():RoundedRectangle
&&&&&&&&& return new RoundedRectangle(0, 0, 282, 80, 4);
&&&&&& override protected function get barFrameRect():RoundedRectangle
&&&&&&&&& return new RoundedRectangle(14, 40, 254, 24);
&&&&&& override protected function get barRect():RoundedRectangle
&&&&&&&&& return new RoundedRectangle(14, 39, 254, 26, 0);
将DownloadProgressBar1指定给Application的preload属性即可看到效果。
自定义加载界面
修改DownloadProgressBarPreloader的样式往往不能满足项目高级需求,例如需要将应用程序和资源下载进行分段显示,自定义加载界面需必须实现IPreloaderDisplay接口,这个接口包括外观的背景设置,所处的舞台大小等属性,但Flex的框架决定了IPreloaderDisplay与Preloader的耦合度很高,重新编写界面不容易,更多的时候我们选择继承DownLoadProgressBar类来简化操作,DownLoadProgressBar不仅实现IPreloaderDisplay接口,而且考虑的非常细致,例如加载所需的时间小于700m或启动进度超过总数的一半不显示加载界面。此外DownLoadProgressBar更是为我们扩展加载界面提供了有力的支持,某些方法定义了但内容却为空,这就是供我们扩展的提示。
DownloadProgressBar中的加载框、加载条都是通过代码绘制的,这使得默认加载器的体积很小,绘制的代码在createChildren()方法中,而更改进度显示的代码在setProgress()方法中,这两个方法实现了显示和逻辑的分离,通过覆盖这两个方法定制自己的加载界面可以在不改变加载逻辑的方式下进行,下面我们让Flex使用使用flash绘制的界面作为加载器的皮肤:
1.&& 在flash中新建影片剪辑,绘制所需的界面,如图:
progressBar
progressText
将加载条命名为progressBar,进度文本命名为progressText,共享库进度条为rslBar,共享库文本为rslText,然后将元件导出为ActionScript,类名为DownloadProgressBarDisplay,将fla发布为swc导入Flex后便可以使用flash制作的素材了。
2.&& 覆盖定义
覆盖定义之前我们要了解DownloadProgressBar内部一些实现,为了避免加载速度过快导致加载界面闪动一下就消失,createChildren()方法在700ms后才被调用,如果你想一开始就显示加载界面可以在构造函数中创建界面,但创建的界面不会自动居中,需要自己设置,此时可以利用基类提供的stageWidth:Number和stageHeight:Number属性访问舞台尺寸,但这个两个属性只有在执行createChildren()方法时才变得准确。默认绘制的加载条把显示进度分割为两个阶段,第一个阶段是加载阶段,应用程序将和rsl共享库同时加载,第二个阶段是Application初始化阶段,DownloadProgressBar使用属性DOWNLOAD_PERCENTAGE:uint进行百分比分割,你可以修改DOWNLOAD_PERCENTAGE更改默认进度条分割的百分比,也可以选择不进行分割、,下表为DownloadProgressBar对Preload添加的侦听器。
progressHandler(event:ProgressEvent):void
应用程序和共享库加载进度
rslProgressHandler(event:RSLEvent):void
rsl加载进度
rslCompleteHandler(event:RSLEvent):void
rsl加载完毕
rslErrorHandler(event:RSLEvent):void
rsl加载出错
completeHandler(event:Event):void
应用程序和共享库加载完毕
initProgressHandler(event:Event):void
应用程序初始化进度
progressHandler()和initProgressHandler()都调用setProgress()方法设置进度,setProgress()反映加载总数。RSLEvent既可以反映rsl共享库的加载进度又可以反映加载数量,通过覆盖rsl的侦听器可以单独为rsl创建进度条。
通过对DownloadProgressBar的观察使我们了解到,要定制加载界面,起码要覆盖createChildren()和setProgress()这两个方法,其它方法可以自己选择覆盖,MyDownloadProgressBar通过覆盖createChildren()和setProgress()方法引入flash制作的界面并且更新进度,如下:
&& import flash.events.E
&& import mx.events.RSLE
&& import mx.preloaders.DownloadProgressB
&& public class MyDownloadProgressBar extends DownloadProgressBar
&&&&&& private var downloadDisplay:DownloadProgressBarD
&&&&&& public function MyDownloadProgressBar()
&&&&&&&&& super();
&&&&&&&&& downloadDisplay=new DownloadProgressBarDisplay();
&&&&&& override protected function createChildren():void
&&&&&&&&& downloadDisplay.x=(stageWidth-downloadDisplay.width)/2;
&&&&&&&&& downloadDisplay.y=(stageHeight-downloadDisplay.height)/2;
&&&&&&&&& addChild(downloadDisplay);
&&&&&& override protected function rslProgressHandler(event:RSLEvent):void
&&&&&&&&& downloadDisplay.rslText.text=&共享库&+&(&+event.rslIndex+&/&+event.rslTotal+&)&;
&&&&&&&&& downloadDisplay.rslBar.scaleX=event.bytesLoaded/event.bytesT
&&&&&& override protected function setProgress(completed:Number, total:Number):void
&&&&&&&&& var per:Number=completed/
&&&&&&&&& downloadDisplay.progressBar.scaleX=
&&&&&&&&& downloadDisplay.progressText.text=(100*per).toFixed(0)+&%&;
我们在构造函数中创建了flash绘制的加载界面是避免createChildren()方法70ms后才执行而导致rslProgressHandler中无法访问downloadDisplay报错,由于stageWidth和stageHeight在createChildren()才能反映准确的舞台尺寸,因此在createChildren()中创建sownloadDisplay并且设置为舞台居中,rslProgressHandler使用了独立的进度条反映rsl加载进度,setProgress()反映总的加载进度。
3.&& 测试加载效果
将Flex框架发布为共享库,然后再导入几个共享库一同进行测试,如下图:
总加载进度会在加载过程中有跳跃的现象,这是因为同时加载应用程序swf和rsl时,无法一时间获取所有rsl的大小,而在Application初始化时发生跳动是因为我们没有进行百分比分割。自定义加载界面后,DownloadProgressBar默认加载器的加载框和加载标签等样式变得没有意义,但加载背景仍然有效,我们仍然可以通过覆盖initiliaze()方法设置加载器的背景。
封装预加载器
如果能够将预加载器界面和代码封装到一个swc中,就可以让任何Flex工程使用,通过上面的例子修改如下:
1.&& 新建影片剪辑,放置DownloadProgressBarDisplay的实例,命名为preloadBox
2.&& 在flash路径库中导入Flex的framwork.swc
3.&& 取消DownloadProgressBarDisplay的导出
4.&& 将新影片剪辑导出为MyDownloadProgressBar
MyDownloadProgressBar元件绑定的代码MyDownloadProgressBar.as如下:
&& import flash.events.E
&& import mx.events.RSLE
&& import mx.preloaders.DownloadProgressB
&& public class MyDownloadProgressBar extends DownloadProgressBar
&&&&&& public function MyDownloadProgressBar()
&&&&&&&&& super();
&&&&&&&&& preloadBox.visible=
&&&&&& override protected function createChildren():void
&&&&&&&&& x=(stageWidth-width)/2;
&&&&&&&&& y=(stageHeight-height)/2;
&&&&&&&&& preloadBox.visible=
&&&&&& override protected function rslProgressHandler(event:RSLEvent):void
&&&&&&&&& preloadBox.rslText.text=&共享库&+&(&+event.rslIndex+&/&+event.rslTotal+&)&;
&&&&&&&&& preloadBox.rslBar.scaleX=event.bytesLoaded/event.bytesT
&&&&&& override protected function setProgress(completed:Number, total:Number):void
&&&&&&&&& var per:Number=completed/
&&&&&&&&& preloadBox.progressBar.scaleX=
&&&&&&&&& preloadBox.progressText.text=(100*per).toFixed(0)+&%&;
在createChildren()方法中显示加载界面一来符合基类70ms的逻辑,再者舞台大小在createChildren()才具备准确的数值。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:539886次
积分:5630
积分:5630
排名:第4418名
原创:19篇
转载:185篇
评论:40条
(2)(6)(17)(21)(19)(15)(22)(24)(11)(1)(4)(2)(11)(24)(4)(3)(18)

我要回帖

更多关于 猫饮水机推荐 的文章

 

随机推荐