项目功能:
1.主界面左滑进入店内,上滑付款结算
第一步就上滑会出现提示信息(必须先看才能买)
2.点击店内心仪品种狗狗,查看详细信息
3.左右滑动翻看心仪品种狗狗,按编号挑选
4.翻看完毕,切换选择界面
5.点击按键做出选择
若选择继续查看其他品种狗狗,返回第2点
若选择离店,弹出离店页面,项目结束
若选择购买,弹出购买界面,上滑付款结算
6.进入购买界面
弹出品种大全,先选择心仪品种
弹出编号表,再选择相应编号
7.购买成功,弹出最终效果图
技术实现:
1.初始化LCD屏幕文件
2.基于内存映射设置一个像素点颜色从而展示相应bmp图片或jpg图片
3.监控触摸点坐标,用click函数封装,实现选狗图片点击功能,跳转相应界面
4.监控触摸屏动作,左右滑动依靠双链表,用slide函数封装实现,把一个目录下所有图片放入双链表
5.监控触摸点坐标,用is_buy函数封装,选择界面设置三个flag判断事件:flag1判断是否离店,离店展示离店界面;flag2判断是否准备按到按钮,不准确则继续展示选择界面;flag3判断是否购买
6.监控触摸屏动作,主界面左滑进店上滑结算,用cover函数封装,若一开始就上滑则展示提示图片
7.根据选择展示各自界面,用option函数封装
8.如若顾客想要购买,展示购买界面,监控触摸点坐标,点击心仪品种切换编号图片,再监控触摸屏坐标切换效果图
源码:
#include "dog.h"
#include "touch.h"
#include "jpeglib.h"
#include "word.h"
#include "num.h"
typedef struct BNode{
char pathname[100];
struct BNode *next;
struct BNode *prev;
}BNode;
BNode *first = NULL;
BNode *last = NULL;
int flag = 0; //flag用来区分是否第一次看狗(0是第一次1不是)
int flag1 = 0;//flag1用来判断是否继续看狗(1不看了0继续看)
int flag2 = 1;//flag2用来判断最后选择时刻是否按了按键(1按了0没按)
int flag3 = 0;//flag3用来判断是否去购买(1购买0不买)
int flag4 = 0;//flag4用来判断第一次在主界面是否向上滑(1是0不是)
int *plcd = NULL;
/*
功能:初始化LCD屏幕文件(在"/dev/fb0"里)
返回值:
文件描述符
*/
int init_lcd()
{
int fd = open("/dev/fb0", O_RDWR);
if(fd == -1)
{
perror("open error");
return -1;
}
//内存映射
plcd = mmap(NULL, 480*800*4, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if(plcd == MAP_FAILED)
{
perror("mmap error");
return -1;
}
return fd;
}
/*
功能:设置像素点(x,y)的颜色
参数:
@x:像素点横坐标
@y:像素点纵坐标
@color:设置的颜色
*/
void lcd_draw_point(int x, int y, int color)
{
if(x>=0 && x<=800 && y>=0 && y<=480)
{
*(plcd+y*800+x) = color;
}
}
/*
功能:展示bmp图片
参数:
@pathname:图片所占绝对路径
@x:起始点横坐标
@y:起始点纵坐标
*/
void show_bmp(char *pathname, int x, int y)
{
int fd = open(pathname, O_RDONLY);
if(fd == -1)
{
perror("open error");
return ;
}
int size, offset, h, w;
short color_depth;//bmp图片的色深
lseek(fd, 0x02, SEEK_SET);
read(fd, &size, 4);
lseek(fd, 0x0A, SEEK_SET);
read(fd, &offset, 4);
lseek(fd, 0x12, SEEK_SET);
read(fd, &w, 4);
lseek(fd, 0x16, SEEK_SET);
read(fd, &h, 4);
lseek(fd, 0x1C, SEEK_SET);
read(fd, &color_depth, 2);
// printf("%s: size = %d offset = %d w = %d h = %d color_depth = %d\n", pathname,size, offset, w, h, color_depth);
int fill = 0;
if(w*3%4)
{
fill += 4 - w*3%4;
}
//读取像素数组
int pixel_size = size - offset;
char *buf = (char *)calloc(pixel_size, sizeof(char));
read(fd, buf, pixel_size);
//显示颜色
char a = 0, r, g , b;
int k = 0;
for(int i=0; i<h; ++i)
{
for(int j=0; j<w; ++j)
{
b = buf[k++];
g = buf[k++];