总是有不少怀旧的人喜欢老电话,老相机,比如我,每次看到老上海的电话机,老香港的手提砖头块,总是会产生一种奇怪的感觉。
老话机每一个格就是一个脉冲,拨1就一个格,拨9就9个格,也就是能听到咔咔声9次。每个对应位置就接通一次脉冲,错过位置就断了,
下一个格又是一个脉冲,0就是10个脉冲。
这里只是在MTK做一些小尝试,非完整代码,请勿模仿。
#define DIAL_X  (UI_device_width/2)
#define DIAL_Y  ((UI_device_height/2)+30)
#define DIAL_R  ((((UI_device_height>UI_device_width)?(UI_device_width/2):(UI_device_height/2))))
#define DIAL_IN_R  (20)
#define DIAL_COLOR  (GDI_COLOR_BLACK)
void my_gdi_draw_line(S32 x1, S32 y1, S32 x2, S32 y2, gdi_color line_color, S32 w)
{
mmi_pen_point_struct a[4];
S32 sinx;
S32 cosx;
S32 r;
S32 tmp;
tmp = sqrt(((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)));
sinx = (int)(((y2-y1)*1000/(int)tmp));
cosx = (int)(((x2-x1)*1000/(int)tmp));
if (w >2)
{
r  = w/2;
a[0].x = x1 + (int)((r*sinx)/1000);
a[0].y = y1 - (int)((r*cosx)/1000);
a[1].x = x2 + (int)(((((r%2)!=0)?(r+1):r)*sinx)/1000);
a[1].y = y2 - (int)(((((r%2)!=0)?(r+1):r)*cosx)/1000);
a[2].x = x2 - (int)(((((r%2)!=0)?(r+1):r)*sinx)/1000);
a[2].y = y2 + (int)(((((r%2)!=0)?(r+1):r)*cosx)/1000);
a[3].x = x1 - (int)((r*sinx)/1000);
a[3].y = y1 + (int)((r*cosx)/1000);
gdi_draw_solid_polygon(a,4,DIAL_COLOR);
}
else
{
color c;
c.r = (U8) ((0xFF000000 & line_color) >> 24);
c.g = (U8) ((0x00FF0000 & line_color) >> 16);
c.b = (U8) ((0x0000FF00 & line_color) >> 8);
c.alpha = (U8) ((0x000000FF & line_color));
gui_wline(x1, y1, x2, y2, c, w);
}
}
extern void my_gdi_draw_line(S32 x1, S32 y1, S32 x2, S32 y2, gdi_color line_color, S32 w);
extern void my_gui_draw_anm_dial(void);
void exit_myapp_screen(void)
{
if (buf_ptr != NULL)
{
med_free_ext_mem((void **)&buf_ptr);
}
if (my_layer2 != NULL)
{
gdi_layer_free(my_layer2);
}
InitDesktopScreen();
gui_cancel_timer(my_gui_draw_anm_dial);
//GoBackHistory();
}
void my_gui_draw_dial(U16 angle)
{
U8 i;
char *t[] = {L"0", L"1",L"2", L"3", L"4",L"5", L"6", L"7", L"8", L"9", L"*", L"#", L"←", L"A", L"B", L"C"};
gdi_draw_circle(DIAL_X,DIAL_Y,DIAL_R,DIAL_COLOR);
gdi_draw_circle(DIAL_X,DIAL_Y,(DIAL_R*618)/1000,DIAL_COLOR);
gdi_draw_point(DIAL_X,DIAL_Y,DIAL_COLOR);
gdi_draw_point(DIAL_X+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_cosine_table[angle],DIAL_Y+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_sine_table[angle],DIAL_COLOR);
for (i = 0; i < 16; i++)
{
gdi_draw_circle(DIAL_X+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_cosine_table[((i*22)+angle)>=360?(((i*22)+angle)-360):((i*22)+angle)],DIAL_Y+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_sine_table[((i*22)+angle)>=360?(((i*22)+angle)-360):((i*22)+angle)],(DIAL_R*100)/1000,DIAL_COLOR);
gui_move_text_cursor(DIAL_X+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_cosine_table[((i*22)+angle)>=360?(((i*22)+angle)-360):((i*22)+angle)]-5, DIAL_Y+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_sine_table[((i*22)+angle)>=360?(((i*22)+angle)-360):((i*22)+angle)]-5);
gui_print_text((UI_string_type)t[i]);
}
}
void my_gui_draw_anm_dial(void)
{
static U16 a = 0;
gdi_layer_get_base_handle(&my_base_layer);
gdi_layer_set_active(my_base_layer);
gdi_layer_clear(GDI_COLOR_TRANSPARENT);
my_gui_draw_dial(a);
//UI_start_timer(100, my_gui_draw_anm_dial);
gdi_layer_set_blt_layer(my_base_layer, my_layer2, NULL, NULL);
gdi_layer_blt_previous(0, 0, UI_device_width - 1, UI_device_height - 1);
a = a + 5;
if (a >= 360)
{
a = 0;
}
gui_start_timer(100, my_gui_draw_anm_dial);
}
void entry_myapp_screen(void)
{
U8 *gui_buffer;
BOOL isEnable;
gdi_color base_color;
mmi_pen_point_struct a[4];
U16 angle = 0;
U8 i;
ExitDesktopScreen();
//EntryNewScreen (MAIN_MENU_SCREENID,exit_myapp_screen,entry_myapp_screen, NULL);
//  gui_buffer = GetCurrGuiBuffer(MAIN_MENU_SCREENID);
entry_full_screen();
gdi_layer_clear(GDI_COLOR_TRANSPARENT);
gdi_layer_multi_layer_enable();
gdi_layer_create(0, 0, UI_device_width, UI_device_height, &my_layer2);
gdi_layer_set_active(my_layer2);
gdi_layer_clear_background(GDI_COLOR_TRANSPARENT);
gdi_layer_set_source_key(TRUE, GDI_COLOR_TRANSPARENT);
//draw handle
a[0].x = DIAL_X;
a[0].y = DIAL_Y;
a[2].x = DIAL_X + (int)(((DIAL_R*618)/1000)*g_qj_gui_clock_acm_cosine_table[angle]);
a[2].y = DIAL_Y + (int)(((DIAL_R*618)/1000)*g_qj_gui_clock_acm_sine_table[angle]);
a[1].x = DIAL_X + (int)(DIAL_IN_R*g_qj_gui_clock_acm_cosine_table[((angle-42)>0?(angle-42):(angle-42+360))]);
a[1].y = DIAL_Y + (int)(DIAL_IN_R*g_qj_gui_clock_acm_sine_table[((angle-42)>0?(angle-42):(angle-42+360))]);
a[3].x = DIAL_X + (int)(DIAL_IN_R*g_qj_gui_clock_acm_cosine_table[((angle+42)<360?(angle+42):(angle+42-360))]);
a[3].y = DIAL_Y + (int)(DIAL_IN_R*g_qj_gui_clock_acm_sine_table[((angle+42)<360?(angle+42):(angle+42-360))]);
gdi_draw_polygon(a,4,DIAL_COLOR);
gui_wline(a[0].x, a[0].y,a[2].x,a[2].y, UI_COLOR_GREEN,2);
gui_wline(a[1].x, a[1].y,a[3].x,a[3].y, UI_COLOR_GREEN,2);
//draw earphone
//gdi_draw_circle(DIAL_X,DIAL_Y,UI_device_height/2+20,DIAL_COLOR);
//my_gdi_draw_line(10, 20, 100, 50, DIAL_COLOR, 10);
gdi_layer_get_base_handle(&my_base_layer);
gdi_layer_set_active(my_base_layer);
//draw dial
#if 0
gdi_draw_circle(DIAL_X,DIAL_Y,DIAL_R,DIAL_COLOR);
gdi_draw_circle(DIAL_X,DIAL_Y,(DIAL_R*618)/1000,DIAL_COLOR);
gdi_draw_circle(DIAL_X,DIAL_Y,20,DIAL_COLOR);
gdi_draw_point(DIAL_X,DIAL_Y,DIAL_COLOR);
gdi_draw_point(DIAL_X+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_cosine_table[angle],DIAL_Y+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_sine_table[angle],DIAL_COLOR);
for (i = 0; i < 16; i++)
{
gdi_draw_circle(DIAL_X+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_cosine_table[(i*22)],DIAL_Y+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_sine_table[(i*22)],(DIAL_R*100)/1000,DIAL_COLOR);
gui_move_text_cursor(DIAL_X+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_cosine_table[(i*22)]-5, DIAL_Y+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_sine_table[(i*22)]-5);
gui_print_text((UI_string_type)t[i]);
}
#else
//gui_start_timer(100, my_gui_draw_anm_dial);
//my_gui_draw_dial(90);
my_gui_draw_anm_dial();
#endif
gdi_layer_set_blt_layer(my_base_layer, my_layer2, NULL, NULL);
gdi_layer_blt_previous(0, 0, UI_device_width - 1, UI_device_height - 1);
SetKeyHandler(exit_myapp_screen, KEY_RSK, KEY_EVENT_UP);
}
 
该文用到的三角形函数值数组请参阅拙作:

巧用数学函数生成函数表

http://blog.csdn.net/blogercn/archive/2011/03/28/6283278.aspx

模仿老式拨盘电话机拨号原理拨号相关推荐

  1. java调用bat脚本实现pppoe拨号_pppoe客户端自动拨号原理及实现

    家庭上网大多采用ADSL拨号上网,很多人使用ADSL网络提供商的拨号软件,可这些软件广告太多,并且还公窃取你的上网习惯等信息,所以可以使用XP自带的拨号软件.一般的XP下ADSL拨号操作如下:开始-附 ...

  2. Cisco(PacketTracer) - PPPoE协议测试实验(ADSL拨号原理)

    ▶ PPPoE服务器配置: 路由器版本:Cisco Router 2811 PacketTracer版本: 5.3支持 7.2.2不支持 ▶ 拓扑图: ▶ 配置步骤: //开启VPDN en conf ...

  3. MT7628 OpenWRT21 SIM8202驱动ppp拨号rndis拨号

    1.模块USB设备概述 使用MT7628通过USB连接SIM8202.SIM8202的VID是0x1e0e,PID9011.添加驱动后USB描述如下: 2.驱动调试使用场景 1.PPP拨号:只需要配置 ...

  4. 微信公众号菜单栏设置直接打电话拨号一键拨号

    添加自定义菜单一键拨号方法: 1.后台关联小程序"小正方助手" 2.关联成功后即可创建菜单 1)菜单内容选择:跳转小程序 2)选择刚刚关联的"小正方助手" 3) ...

  5. RAS使用拨号网络拨号的类

    前一段时间使用了Socket与远程PC进行UDP通讯,使用了一个RAS拨号类,与大家分享一下. 在使用下面的代码建立 TCP/IP 链接前,请断开 ActiveSync,否则会导致失败. 头文件:Ra ...

  6. php拨号接口,拨号网络对应的协议是什么

    拨号网络对应的协议是PPPoE. PPPoE(英语:Point-to-Point Protocol Over Ethernet),以太网上的点对点协议,是将点对点协议(PPP)封装在以太网(Ether ...

  7. python拨号_python 拨号代码(win10 系统亲测有效)

    # -*- coding: utf-8 -*- import win32ras import time,os def Connect(dialname, account, passwd): dial_ ...

  8. 树莓派 4G模块 PPP 拨号 NDIS 拨号

    资料参考:树莓派使用4G模块(华为ME909s-821)亲身尝试的可行方法(上) 转载于:https://www.cnblogs.com/suozhang/p/8488008.html

  9. python pptp拨号_pptp拨号上网

    一.软件 dkms..pptpd 二.下载软件 wget http://sourceforge.net/projects/poptop/files/mppe%20module%20builder/dk ...

最新文章

  1. 【 FPGA 】UltraFast设计方法学:时序约束
  2. 再学 GDI+[81]: TGPImage(1) - 显示图像
  3. python matplotlib散点图-python的matplotlib散点图
  4. 让AngularJS的$http 服务像jQuery.ajax()一样工作
  5. CVPR2016:Improving Person Re-identification via Pose-aware Multi-shot Matching
  6. bootstrap的td可以增加title样式_3.CSS样式的三种使用方式
  7. java多线程之:SynchronousQueue队列
  8. linux编码 form表单,Linux以form表单形式上传文件讲解
  9. 计算机公式or,【转载】 odds、OR和RR的计算公式和实际意义
  10. CentOS7安装ETCD
  11. 华润燃气各大区总经理_华润燃气“十四五”战略研讨会在华润大学小径湾校区举办...
  12. 如何保证进程间同步工作_系统设计硬核知识(2)——操作系统的进程管理
  13. 6)Thymelead th:with 局部变量 与 属性优先级 和 Thymeleaf 注释
  14. ◆谷歌热榜|百度中文搜索风云榜|Top 50
  15. 用C语言求和、找数组中的最大值以及求平均值
  16. java.lang.IllegalArgumentException 如何解决这个异常
  17. 使用Godaddy续费我的域名时遇到支付问题
  18. C 语言隐式类型转换
  19. 【BULL中文文档】用于在 NodeJS 中处理分布式作业和消息的队列包
  20. 量化交易框架开发实践(二)

热门文章

  1. Andriod自动化测试click事件报错:Injecting to another application requires INJECT_EVENTS permission解决
  2. win10网络出现感叹号,但能正常上网
  3. 低代码对接腾讯云-阿里云短信平台
  4. 用JavaScript+html+css制作当当购物车
  5. 港科大教授权龙:三维视觉重新定义人工智能安防
  6. Canvas实现贪吃蛇小游戏(面向对象)
  7. COBOL语言创始人Grace Hopper:编译语言之母
  8. 联想拯救者r7000搜索不到wifi?
  9. 手机的运行内存是否越大就越好?
  10. 《武林外传》产品体验总结