向数据库中存取图片(BITMAP)

  向数据库中存取图片(BITMAP)

  测试环境:windows xp2 vc6.0 access2003/sql2000
    当前时间所限就先把关于BMP文件的操作总结了一下,在接下来会再总结一下其它几种图片在数据库的操作的。
既然是向数据库中添加位图信息,那么有必须明白我们的数据是以什么形式存放在数据库的,当然没有别的方法,只能是二进制了,所以在创建数据库的时候,一定要注意选择的字段的类型,不然是添加下进去的。(刚开始的时候,我就遇到了这个问题,费了好长时间才搞定的。Access中的字段定义为” OLE 对象”,sql2000中字义为image就行了。)
1> 读取一个位图,
CFile FilePic;//用来读取位图文件
DWORD FileLen=0;//位图的长度
char* FileBuff;//用于存放位图信息

if(!FilePic.Open(FilePath,Cfile::modeRead))//打开位图文件
{
MessageBox("打开图片信息失败!");
return false;
}
FileLen=FilePic.GetLength();//得到位图的长度
FileBuff=new char[FileLen+1];//给位图文件申请内在空间
memset(FileBuff,0,FileLen+1);//初始化位图文件的空间
if(!FileBuff)//判断位图空间是否申请成功
{
MessageBox("给图片分配空间失败!");
return false;
}
if(FilePic.Read(FileBuff,FileLen)!=FileLen)//读取位图信息,存入到FileBuff中去
{
MessageBox("读取图片信息失败!");
return false;
}
2> 把位图信息存放到VARIANT对象中,存入数据库中
char* pBuff= FileBuff;
VARIANT varPic;//该对象用于存放位图信息
SAFEARRAY *safeArray;//定义一个SAFEARRAY结构对象(对于这个东西,会有专门的文档大家可以看一下,网上很多,不过都差不多,最好去MSDN上找一下)
SAFEARRAYBOUND rgsabound[1];//此结构体用来定义SAFEARRAY的边界,详情见MSDN
if(pBuff)//判断位图文件是否为空
{
rgsabound[0].lLbound=0;//定义下界
rgsabound[0].cElements=DwPic;//定义上限
safeArray=SafeArrayCreate(VT_UI1,1,rgsabound);// 使用SafeArrayCreate在堆上创建一维数组
for(long i=0;i<(long)DwPic;i++)
{
   SafeArrayPutElement(safeArray,&i,pBuff++);//传值
}
varPic.vt=VT_ARRAY|VT_UI1;//把值给VARIANT对象
varPic.parray=safeArray; //把值给VARIANT对象
}
3> 把数据写到数据库中
ACCESS2003:
pRecordset->AddNew();
try
{
pRecordset->PutCollect("Name",_variant_t("zhang1"));
pRecordset->GetFields()->GetItem("Picture")->AppendChunk(varPic);
}
catch(_com_error e)
{
MessageBox("Add pic to access is falied!");
}
pRecordset->Update();
sql2000:
pRecordsetSql->AddNew();

try
{
pRecordsetSql->PutCollect("Name",_variant_t("zhang1"));
pRecordsetSql->GetFields()->GetItem("Pic")->AppendChunk(SavePic(FileBuff,FileLen));
}
catch(_com_error e)
{
MessageBox("Add picture to sqlserver2000 is failed!");
}
pRecordsetSql->Update();
在数据库中读取位图信息并显示出来:
其实读取并且显示过程的过程也非常的简单,主要是把它们在数据库中读取出来,放到一个内存空间中,然后把这此些读取出来的信息再转换成一个BITMAP就可以显示了,(如果不明白怎么转换的话,可以看一下关于位图的文件格式,我关于它的一些信息,也可以参与一下本人的《VC下显示位图的几种方法》里面有详细的解释)
进入正题:
_variant_t TheValue;//存储读出来的数据
DWORD DataSize;//在数据库中读取出来的位图的大小

char *pBuff;//用于存放位图的内存空间
CString str="select * from Picture";//SQL语句^_^
BSTR bstrRecordset=str.AllocSysString();//这句也不用解释了吧
HBITMAP hBitmap;//定义一个HBITMAP对象,用于显示位图用
try
{
pRecordset->Open(bstrRecordset,pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
pRecordset->MoveLast();
TheValue=pRecordset->GetCollect("Picture");//读取字段一
DataSize=pRecordset->GetFields()->GetItem("Picture")->ActualSize;//得到位图字段的大小
if(DataSize>0)//判断那个位图字段是否为空
{
   if(TheValue.vt==(VT_ARRAY|VT_UI1))
   {
    if(pBuff=new char[DataSize+1])
    {
     char *buff;
/***********************主要也就下面这几句画,其它的和显示位图相似**************************/
     SafeArrayAccessData(TheValue.parray,(void**)&buff);//把位图数据放到buff中去
     memcpy(pBuff,buff,DataSize);//把位图数据放到pBuff中
     SafeArrayUnaccessData(TheValue.parray);//释放
     hBitmap=MemTOPic(pBuff);//这是一个自字义
    }
   }
}
}
catch(_com_error e)
{
MessageBox("打开数据表失败!");
return ;
}
/******************根据HBITMAP把位图显示出来************************/
CBitmap cBitmap;
CClientDC *pDC=new CClientDC(this);
BITMAP bitmap;
CDC MemDC;
cBitmap.Attach(hBitmap);
MemDC.CreateCompatibleDC(pDC);
MemDC.SelectObject(&cBitmap);
cBitmap.GetBitmap(&bitmap);
pDC->StretchBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&MemDC,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
MemDC.DeleteDC();
::DeleteObject(&bitmap);
/*************自定义函数************把内存数据转为HBITMAP***************************/
HBITMAP CDBPicDllDlg::MemTOPic(char *buff)
{

HBITMAP hBitmap=NULL;
LPSTR hDib=NULL;
LPSTR PicBuff=NULL;
PicBuff=buff;
LPVOID pDibBit=NULL;
BITMAPFILEHEADER bmpHead;//位图头结构
DWORD LenBmpHead;
LenBmpHead=sizeof(BITMAPFILEHEADER);
strncpy((LPSTR)&bmpHead,PicBuff,LenBmpHead);
// memcpy((LPSTR)&bmpHead,PicBuff,LenBmpHead);
if(bmpHead.bfType!=(*(WORD*)"BM"))//(*(WORD*)"BM")
{
MessageBox("您选择的图片不是bmp图片!");
return NULL;
}
hDib=PicBuff+LenBmpHead;//hDib=PicBuff
BITMAPINFOHEADER &BitmapInfoHead=*(LPBITMAPINFOHEADER)hDib;
BITMAPINFO &BitmapInfo=*(LPBITMAPINFO)hDib;
pDibBit=PicBuff+((BITMAPFILEHEADER*)PicBuff)->bfOffBits;
CClientDC dc(this);
hBitmap=CreateDIBitmap(dc.m_hDC,&BitmapInfoHead,CBM_INIT,pDibBit,&BitmapInfo,DIB_RGB_COLORS);
return hBitmap;
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
在SQL2000下方法也是相同的,这里就不重复了。由于时间原因今天这里只是和大家讨论了BMP文件,接下来我会把一些关于JPG的文件的在数据库的读写方法总结出来,供大家交流之用。

 

 

VC下显示位图的几种方法
总结一下关于位图的几种用法。
说到这还是开头给大家介绍一下,有关位图的知识吧,以及对于我们比较有用的几个关于位图的结构体。
一.位图结构如下:

---- 一、BMP文件结构 
---- 1. BMP文件组成 
---- BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。 
---- 2. BMP文件头 
---- BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。 
---- 其结构定义如下: 
typedef struct tagBITMAPFILEHEADER
{
WORDbfType;   // 位图文件的类型,必须为BM
DWORD   bfSize;   // 位图文件的大小,以字节为单位
WORDbfReserved1; // 位图文件保留字,必须为0
WORDbfReserved2; // 位图文件保留字,必须为0
DWORD   bfOffBits; // 位图数据的起始位置,以相对于位图
// 文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;
---- 3. 位图信息头 
BMP位图信息头数据用于说明位图的尺寸等信息。
typedef struct tagBITMAPINFOHEADER{
   DWORD biSize;   // 本结构所占用字节数
   LONGbiWidth; // 位图的宽度,以像素为单位
   LONGbiHeight; // 位图的高度,以像素为单位
   WORD   biPlanes; // 目标设备的级别,必须为1
   WORD   biBitCount// 每个像素所需的位数,必须是1(双色),
// 4(16色),8(256色)或24(真彩色)之一
   DWORD biCompression;   // 位图压缩类型,必须是 0(不压缩),
// 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
   DWORD biSizeImage; // 位图的大小,以字节为单位
   LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数
   LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数
   DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
   DWORD biClrImportant;// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER; 
---- 4. 颜色表 
    颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下: 
typedef struct tagRGBQUAD {

BYTErgbBlue;// 蓝色的亮度(值范围为0-255)
BYTErgbGreen;   // 绿色的亮度(值范围为0-255)
BYTErgbRed; // 红色的亮度(值范围为0-255)
BYTErgbReserved;// 保留,必须为0
} RGBQUAD;
颜色表中RGBQUAD结构数据的个数有biBitCount来确定:
当biBitCount=1,4,8时,分别有2,16,256个表项;
当biBitCount=24时,没有颜色表项。
   位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedef struct tagBITMAPINFO {
   BITMAPINFOHEADER bmiHeader;   // 位图信息头
   RGBQUAD bmiColors[1]; // 颜色表
} BITMAPINFO;
下面我们介绍第一种办法:
//第一种方法,使用WM__CTRLCOLOR来实现
/*******************OnCtlColor中添加的代码*****************/
HBRUSH CDemoBitmapDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
//第一种实现方法
if(nCtlColor=CTLCOLOR_DLG)
{
return brush;
}
// TODO: Return a different brush if the default is not desired
return hbr;
}

BOOL CDemoBitmapDlg::OnInitDialog()
{
//第一种方法,使用wm_ctlcolor来实现
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
brush.CreatePatternBrush(&bitmap);//brush定义在头文件中CBrush burush
bitmap.DeleteObject();
}
第二种方法使用资源文件中导入的IDB_BITMAP来实现
第一步先在资源中导入一个位图:IDB_BITMAP1
void CDemoBitmapDlg::OnBtnBitmap() 
{
// TODO: Add your control notification handler code here
/***************显示BITMAP的第二种方法**********************/
HBITMAP hBitmap;
CBitmap bitmap;
CClientDC *pDC;
pDC=new CClientDC(this);
hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
bitmap.Attach(hBitmap);
CDC CDCompatible;
CDCompatible.CreateCompatibleDC(pDC);//创建兼容DC
CDCompatible.SelectObject(&bitmap);
/*********其它几种显示方式********/
/* pDC->BitBlt(0,0,200,200,&CDCompatible,0,0,SRCCOPY);
CDCompatible.SetBkMode(TRANSPARENT);
pDC->StretchBlt(0,0,352,288,&CDCompatible,0,0,352,288,SRCCOPY);
    CDCompatible.CreateCompatibleDC(this->GetDC());
    CDCompatible.SelectObject(&bitmap); */ //选择绘图对象
BITMAP bmp;
bitmap.GetBitmap(&bmp);
    pDC->StretchBlt(0,0,bmp.bmWidth,bmp.bmHeight,&CDCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); 
    CDCompatible.DeleteDC(); 
    ::DeleteObject(&bitmap); 
}
第三种方法是通过读取指定目录中的位图文件来显示(这里分别把它们显示在Picture控件和Static上面这也是大家通常要用到的):
void CDemoBitmapDlg::OnBtnPic() 
{
// TODO: Add your control notification handler code here
/****************向PICTURE控件中动态添加位图****************************/
HBITMAP hBitmap;
CBitmap bitmap;
hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
bitmap.Attach(hBitmap);
m_Pic.SetBitmap(hBitmap);

}
/****************在STATIC中显示位图*********************/
void CDemoBitmapDlg::OnBtnStatic() 
{
// TODO: Add your control notification handler code here
CBitmap hbmp;
HBITMAP hbitmap;
//将pStatic指向要显示的地方
CStatic *pStaic;
pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);
// pStaic=(CStatic*)GetDlgItem(IDC_BUTTON1);
//装载资源 MM.bmp是我的一个文件名,用你的替换
hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),"NetFriend.bmp",
IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

hbmp.Attach(hbitmap);
//获取图片格式
BITMAP bm;
hbmp.GetBitmap(&bm);
CDC dcMem;
dcMem.CreateCompatibleDC(GetDC());
CBitmap *poldBitmap=(CBitmap*)dcMem.SelectObject(hbmp);
CRect lRect;
pStaic->GetClientRect(&lRect);
//显示位图
pStaic->GetDC()->StretchBlt(lRect.left ,lRect.top ,lRect.Width(),lRect.Height(), &dcMem,0 ,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcMem.SelectObject(&poldBitmap);
}
/*****************向BUTTON中添加ICON*****************************/
//方法和导入其它位图类似,在这里就只做一个说明一下就是了。 
HICON hIco;
hIco=AfxGetApp()->LoadIcon(IDI_ICON1);
m_BtnBitmap.SetIcon(hIco);
第四种读取位图文件来显示位图:
void CDemoBitmapDlg::OnBtnBtmfile() 
{
// TODO: Add your control notification handler code here
/*******************通过读取位图文件来显示位图**********************/
CString strFileName;
strFileName.Format("%s","NetFriend.bmp");
//成位图信息BITMAPINFO
BITMAPINFO *bitmapinfo=NULL;
BYTE *BmpData=NULL;
CFile file;//读取位图信息
//设置文件的打开方式
if(!file.Open(strFileName,Cfile::modeRead|Cfile::typeBinary))
{
return;
}
//BITMAP文件头结构体
BITMAPFILEHEADER BitmapHead;
//读取位图文件头
if(file.Read(&BitmapHead,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER))
{
MessageBox("读取文件头失败!");
return;
}
if(BitmapHead.bfType!=0x4d42)
{
MessageBox("对不起,您读取的不是位图文件!");
return;
}
//位图信息
BITMAPINFOHEADER BitmapInfo;
if(file.Read(&BitmapInfo,sizeof(BITMAPINFOHEADER))!=sizeof(BITMAPINFOHEADER))
{
MessageBox("读取位图信息失败!");
return;
}
if(BitmapInfo.biBitCount!=24)
{
MessageBox("对不起,当前程序只支持24位位图信息!");
return;
}
bitmapinfo=(BITMAPINFO*)new char[sizeof(BITMAPINFOHEADER)];
if(!bitmapinfo)
{
MessageBox("内存分配失败!");
return;
}
/*把BMP位图信息头中的数据读取到位图信息结构中去.*/
memcpy(bitmapinfo,&BitmapInfo,sizeof(BITMAPINFOHEADER));
/*用来得到位图文件的大小*/
DWORD dataByte=BitmapHead.bfSize-BitmapHead.bfOffBits;
BmpData=(BYTE*)new char[dataByte];
if(!BmpData)
{
MessageBox("内存分配失败!");
delete bitmapinfo;
delete BmpData;
return;
}
if(file.Read(BmpData,dataByte)!=dataByte)
{
MessageBox("读取位图数据失败!");
return;
}
file.Close();
CClientDC *pDC=new CClientDC(this);
pDC->SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC->GetSafeHdc(),200,0,BitmapInfo.biWidth,BitmapInfo.biHeight, 0,0,BitmapInfo.biWidth,BitmapInfo.biHeight,BmpData,bitmapinfo,DIB_RGB_COLORS,SRCCOPY);
}
最后给大家介绍两个显示位图的特效的例子更多的特效显示(http://www.pconline.com.cn/pcedu/empolder/gj/vc/0504/608259.html):
1> 水平交错显示位图
void CListBmap::OnButton1() 
{
// TODO: Add your control notification handler code here
HBITMAP hBitmap;
CBitmap cBitmap;
hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp", IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
cBitmap.Attach(hBitmap);
cBitmap.GetBitmap(&bitmap);
int i=0,j=0;
CClientDC *pDC=new CClientDC(this);
CDC memDC;
memDC.CreateCompatibleDC(GetDC());
memDC.SelectObject(&cBitmap);
for(i=0;i<bitmap.bmHeight;i+=2)
{
j=i;
while(j>0)
{
   pDC->StretchBlt(0,j-1,bitmap.bmWidth,1,&memDC,0,bitmap.bmHeight-(i-j+1),    bitmap.bmWidth,1,SRCCOPY);
   pDC->StretchBlt(0,bitmap.bmHeight-j,bitmap.bmWidth,1,&memDC,0,i-j,    bitmap.bmWidth,1,SRCCOPY);
   j-=2;
}
Sleep(50);
}

}

2>雨点显示:
void CListBmap::OnButton2() 
{
// TODO: Add your control notification handler code here

HBITMAP hBitmap;
CBitmap cBitmap;
hBitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"NetFriend.bmp", IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
cBitmap.Attach(hBitmap);
cBitmap.GetBitmap(&bitmap);
int i=0,j=0;
CClientDC *pDC=new CClientDC(this);
CDC memDC;
memDC.CreateCompatibleDC(GetDC());
memDC.SelectObject(&cBitmap);
for ( i=0; i<=bitmap.bmHeight; i++ )   
{
for ( j=0; j<=bitmap.bmHeight-i; j++ ) 
   pDC->StretchBlt( 
   0,j, 
   //目标设备逻辑横、纵坐标 
   bitmap.bmWidth,1, 
   //显示位图的像素宽、高度 
   &memDC, 
   //源位图设备情境对象 
   0,bitmap.bmHeight-i, 
   //源位图的起始横、纵坐标 
   bitmap.bmWidth,1, 
   //源位图的像素宽、高度 
   SRCCOPY); 
Sleep(20); 
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书以Android应用程序的开发为主题,并结合真实的案例向读者详细介绍了Android的基本组件的使用及应用程序开发的整个流程。本书的讲述由浅入深,实例全面并典型,几乎囊括了所有和Android应用相关的项目。全书分为18章,分别讲解了UI布局实例集锦、控件实例集锦、自动化服务实例集锦、数据存储实例集锦、电话和短信实例集锦、图形图像实例集锦、和网络有关的实例集锦、多媒体实例集锦、Google地图实例集锦、GoogleAPI实例集锦、平板应用实例集锦、游戏应用与程序优化。并且在本书最后,通过4个大型综合实例,分别介绍了开发手机地图系统、音乐播放器系统、NBA激情投篮游戏、综合邮件系统的基本过程。 目录: 第1章 UI布局开发实例集锦 1 实例001: 使用线性布局(LinearLayout) 来布局屏幕 1 实例002: 使用相对布局(RelativeLayout)来布局屏幕 3 实例003: 使用表格布局(TableLayout) 来布局屏幕 5 实例004: 使用绝对布局(AbsoluteLayout) 来布局屏幕 6 实例005: 使用标签布局(TabLayout)来 布局屏幕 8 实例006: 使用层布局(FrameLayout) 10 实例007: 创建一个桌面组件Widget 11 实例008: 在屏幕实现一个按钮效果 12 实例009: 在屏幕显示文字 13 实例010: 在屏幕显示编辑框 17 实例011: 在屏幕显示复选框 18 实例012: 在屏幕显示单选框 21 实例013: 在屏幕显示下拉列表框 22 实例014: 在屏幕实现自动输入文本 效果 26 实例015: 使用日期选择器控件DatePicker 28 实例016: 自动选择一个输入时间 30 实例017: 实现屏幕自动滚动 32 实例018: 实现一个进度条效果 32 实例019: 开发一个评分程序 35 实例020: 在屏幕显示一幅指定的图片 36 实例021: 设置一幅图片作为按钮来使用 38 实例022: 实现QQ空间的显示照片 效果 40 第2章 控件开发实例集锦 44 实例023: 显示在文本框输入的信息 44 实例024: 使用RadioGroup控件实现选 项选择功能 46 实例025: 使用CheckBox控件实现同意 条款效果 48 实例026: 使用Spinner控件实现选项选择 51 实例027: 使用Gallery控件实现个人相 簿功能 55 实例028: 开发一个文件搜索程序 58 实例029: 单击按钮后实现按钮置换 60 实例030: 模拟实现一个时钟界面效果 62 实例031: 联合使用DatePicker和TimePicker 来选择日期和时间 65 实例032:动态分隔手机屏幕 68 实例033:使用ListActivity实现动态菜单 列表 71 实例034:加载手机磁盘的文件 73 实例035:实现抽屉样式效果 76 实例036:在屏幕动态显示多种对话框 82 实例037:手机秘书--重要事情提醒 88 实例038:动态添加或删除菜单 96 实例039: 自定义Android控件实现单选 按钮 100 实例040: 使用自定义控件在屏幕绘 制一条虚线 104 实例041: 在屏幕实现手风琴效果 106 第3章 自动化服务实例集锦 109 实例042: 自动获取手机屏幕的分辨率 109 实例043: 自动获取手机电池的剩余电量 112 实例044: 来电时自动发送信息提醒 115 实例045: 获取手机存储卡的容量 119 实例046: 操作存储卡和内存卡的数据 122 实例047: 设置闹钟 129 实例048: 实现黑名单来电自动静音处理 135 实例049: 设置一个自动开机界面 138 实例050: 更换手机屏幕背景图片系统 140 实例051: 设置自动更换手机桌面背景 144 实例052: 自动控制后台系统服务 154 实例053: 在屏幕拖动一个按钮 157 第4章 数据存储实例集锦 163 实例054: 在屏幕显示SharedPreferences 存储的信息 163 实例055: 演示数据添加、删除等操作 165 实例056: 编写一个手机日记本程序 170 实例057: 使用ContentProvider开发一个 手机日记本 177 实例058: 使用文件保存数据 188 实例059: 将网上的图片保存到SD卡并在 手机显示出来 190 实例060: 保存联系人信息 194 第5章 电话和短信实例集锦 197 实例061: 编写一个拨号程序 197 实例062: 发送一条短信 200 实例063: 单击按钮实现拨号功能 203 实例064: 一个通用发短信程序 206 实例065: 收到短信后用E-mail邮件进行 通知 210 实例066: 实现触屏拨号功能 214 实例067: 一个短信群发程序 215 实例068: 来电后自动发送邮件通知 219 实例069: 监听手机拨接状态 220 实例070: 检查短信是否发送成功 223 第6章 图形图像实例集锦 229 实例071: 在屏幕绘制一个矩形 229 实例072: 在屏幕绘制一个画布 232 实例073: 实现水纹的透明效果 235 实例074: 渲染几何图形 239 实例075: 用图片为背景实现动画效果 242 实例076: 在手机屏幕实现Frame动画 效果 244 实例077: 对图片进行缩放处理 246 实例078: 旋转屏幕图片 250 实例079: 实现旗帜飞扬的效果 253 实例080: 模拟构建一个3D场景效果 258 实例081: 模拟实现粒子系统效果 261 实例082: 在Canvas写文字 265 实例083: 移动屏幕图片 272 实例084:在屏幕绘制一个三维圆柱体 276 实例085: 获取并显示图片的宽和高 285 实例086: 编写一个手机屏保程序 287 实例087: 以触摸方式移动图片 295 第7章 和网络有关的实例集锦 299 实例088: 传递HTTP参数 299 实例089: 在屏幕使用HTML程序 303 实例090: 在手机浏览网页 304 实例091: 使用内置浏览器打开网页 305 实例092: 显示QQ空间的照片 307 实例093: 通过RSS系统在线浏览新闻 309 实例094: 下载网络图片作为手机背景 320 实例095: 将文件上传至服务器 323 实例096: 开发一个移动博客发布器 326 实例097: 远程下载并安装一个软件 331 实例098: 控制蓝牙系统 336 第8章 多媒体实例集锦 346 实例099: 播放一个指定的MP3文件 346 实例100: 调节手机音量的大小 350 实例101: 实现相机预览和拍照功能 353 实例102: 在手机播放影片 360 实例103: 手机录音系统 363 实例104: 设置手机的铃声 368 实例105: 在线播放网络的MP3 371 实例106: 在线下载音乐作为手机铃声 379 实例107: 播放GIF格式的动画 385 实例108: 在手机播放MP4视频 391 实例109: 在线观看3GP视频 394 第9章 Google地图实例集锦 403 实例110: 定位当前位置的坐标 403 实例111: 在手机使用Google地图 406 实例112: 在地图定位输入的坐标 413 实例113: 在地图快速查询某个位置 416 实例114: 随着手机的移动自动更新位置 418 实例115: 在手机地图描绘线路并计算 线路距离 423 实例116: 在Google地图显示指定的 位置 430 实例117: 在手机地图查询一个地址 432 实例118: 在手机实现地址查询 434 实例119: 开发一个路径导航系统 438 第10章 Google API实例集锦 446 实例120: 模拟验证官方账号 446 实例121: 在手机开发一个Google搜索 程序 453 实例122: 在手机编写一个翻译软件 458 实例123: 生成一个二维码 460 实例124: 使用Google Chart API生成二 维码 463 第11章 平板应用 469 实例125: 开发一个音乐播放器 469 实例126: 开发一个在线天气播报系统 475 实例127: 开发一个网页浏览程序 485 实例128: 使用文件来保存音乐状态 491 实例129: 在屏幕显示不同的进度条 效果 494 第12章 游戏应用 498 实例130: 一个简单的贪吃蛇游戏 498 实例131: 开发一个魔塔游戏 504 实例132: 疯狂足球游戏 524 第13章 Android程序优化 547 实例133: 测试计算机的性能 547 实例134: 测试内存性能 550 实例135: 优化Android模拟器 553 实例136: 使用merge标签优化UI界面 556 实例137: 优化Android Layout 559 实例138: 优化Bitmap图片 560 第14章 综合实例--手机地图系统 563 实例139: 使用Google地图开发一个综合 地图系统 563 14.1 项目分析 563 14.1.1 规划UI界面 563 14.1.2 数据存储设计 564 14.2 具体实现 565 14.2.1 新建工程 565 14.2.2 主界面 565 14.2.3 新建界面 567 14.2.4 设置界面 570 14.2.5 帮助界面 574 14.2.6 地图界面 576 14.2.7 数据存取 587 14.2.8 实现Service服务 592 14.3 发布自己的作品来赢利 594 14.3.1 申请成为会员 594 14.3.2 生成签名文件 597 14.3.3 使用签名文件 602 14.3.4 发布 604 第15章 综合实例--音乐播放器系统 605 实例140:开发一个音乐播放器 605 15.1 项目介绍 605 15.1.1 项目背景介绍 605 15.1.2 项目目的 606 15.1.3 对读者的意义 606 15.2 需求分析 606 15.2.1 构成模块 606 15.2.2 功能结构图 609 15.2.3 系统功能说明 610 15.2.4 总体目标 610 15.3 设计数据库 611 15.3.1 字段设计 611 15.3.2 数据库连接 611 15.3.3 创建数据库 612 15.3.4 操作数据库 613 15.3.5 数据显示 614 15.4 具体编码 615 15.4.1 服务信息主界面 615 15.4.2 播放器主界面 616 15.4.3 播放列表功能 628 15.4.4 菜单功能模块 631 15.4.5 播放设置界面 634 15.4.6 设置显示歌词 638 15.4.7 文件浏览器模块 639 第16章 体育类游戏--NBA激情投篮 644 实例141:NBA激情投篮 644 16.1 项目介绍 644 16.1.1 意义和技术分析 644 16.1.2 策划游戏 645 16.1.3 准备工作 645 16.2 项目架构 646 16.2.1 总体架构 646 16.2.2 规划类 646 16.3 具体编码 648 16.3.1 编写主类LanqiuActivity 648 16.3.2 编写常量类 652 16.3.3 设计游戏试玩界面 658 16.3.4 绘制游戏场景 663 第17章 综合邮件系统 672 实例142:开发一个综合邮件系统 672 17.1 项目介绍 672 17.1.1 项目背景介绍 672 17.1.2 项目目的 672 17.2 系统需求分析 673 17.2.1 构成模块 673 17.2.2 系统流程 675 17.2.3 功能结构图 676 17.2.4 系统功能说明 677 17.2.5 系统需求 677 17.3 数据存储设计 677 17.3.1 用户信息类 678 17.3.2 SharedPreferences 682 17.4 具体编码 684 17.4.1 欢迎界面 684 17.4.2 系统主界面 687 17.4.3 邮箱类型设置 694 17.4.4 邮箱收取设置 697 17.4.5 邮箱发送设置 703 17.4.6 邮箱用户检查 708 17.4.7 设置用户别名 713 17.4.8 用户邮件编辑 716 17.5 总结 723
1、volley 项目地址 https://github.com/smanikandan14/Volley-demo (1) JSON,图像等的异步下载; (2) 网络请求的排序(scheduling) (3) 网络请求的优先级处理 (4) 缓存 (5) 多级别取消请求 (6) 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求) 2、android-async-http 项目地址:https://github.com/loopj/android-async-http 文档介绍:http://loopj.com/android-async-http/ (1) 在匿名回调处理请求结果 (2) 在UI线程外进行http请求 (3) 文件断点上传 (4) 智能重试 (5) 默认gzip压缩 (6) 支持解析成Json格式 (7) 可将Cookies持久化到SharedPreferences 3、Afinal框架 项目地址:https://github.com/yangfuhai/afinal 主要有四大模块: (1) 数据库模块:android的orm框架,使用了线程池对sqlite进行操作。 (2) 注解模块:android的ioc框架,完全注解方式就可以进行UI绑定和事件绑定。无需findViewById和setClickListener等。 (3) 网络模块:通过httpclient进行封装http数据请求,支持ajax方式加载,支持下载、上传文件功能。 (4) 图片缓存模块:通过FinalBitmapimageview加载bitmap的时候无需考虑bitmap加载过程出现的oom和android容器快速滑动时候出现的图片错位等现象。 FinalBitmap可以配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等。FinalBitmap的内存管理使用lru算法, 没有使用弱引用(android2.3以后google已经不建议使用弱引用,android2.3后强行回收软引用和弱引用,详情查看android官方文档), 更好的管理bitmap内存。FinalBitmap可以自定义下载器,用来扩展其他协议显示网络图片,比如ftp等。同时可以自定义bitmap显示器, 在imageview显示图片的时候播放动画等(默认是渐变动画显示)。 4、xUtils框架 项目地址:https://github.com/wyouflf/xUtils 主要有四大模块: (1) 数据库模块:android的orm框架,一行代码就可以进行增删改查; 支持事务,默认关闭; 可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名); 支持绑定外键,保存实体时外键关联实体自动保存或更新; 自动加载外键关联实体,支持延时加载; 支持链式表达查询,更直观的查询语义,参考下面的介绍或sample的例子。 (2) 注解模块:android的ioc框架,完全注解方式就可以进行UI,资源和事件绑定; 新的事件绑定方式,使用混淆工具混淆后仍可正常工作; 目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。 (3) 网络模块:支持同步,异步方式的请求; 支持大文件上传,上传大文件不会oom; 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求; 下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件; 返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。 (4) 图片缓存模块:加载bitmap的时候无需考虑bitmap加载过程出现的oom和android容器快速滑动时候出现的图片错位等现象; 支持加载网络图片和本地图片; 内存管理使用lru算法,更好的管理bitmap内存; 可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等... 5、ThinkAndroid 项目地址:https://github.com/white-cat/ThinkAndroid 主要有以下模块: (1) MVC模块:实现视图与模型的分离。 (2) ioc模块:android的ioc模块,完全注解方式就可以进行UI绑定、res的资源的读取、以及对象的初始化。 (3) 数据库模块:android的orm框架,使用了线程池对sqlite进行操作。 (4) http模块:通过httpclient进行封装http数据请求,支持异步及同步方式加载。 (5) 缓存模块:通过简单的配置及设计可以很好的实现缓存,对缓存可以随意的配置 (6) 图片缓存模块:imageview加载图片的时候无需考虑图片加载过程出现的oom和android容器快速滑动时候出现的图片错位等现象。 (7) 配置器模块:可以对简易的实现配对配置的操作,目前配置文件可以支持Preference、Properties对配置进行存取。 (8) 日志打印模块:可以较快的轻易的是实现日志打印,支持日志打印的扩展,目前支持对sdcard写入本地打印、以及控制台打印 (9) 下载器模块:可以简单的实现多线程下载、后台下载、断点续传、对下载进行控制、如开始、暂停、删除等等。 (10) 网络状态检测模块:当网络状态改变时,对其进行检 6、LoonAndroid 项目地址:https://github.com/gdpancheng/LoonAndroid 主要有以下模块: (1) 自动注入框架(只需要继承框架内的application既可) (2) 图片加载框架(多重缓存,自动回收,最大限度保证内存的安全性) (3) 网络请求模块(继承了基本上现在所有的http请求) (4) eventbus(集成一个开源的框架) (5) 验证框架(集成开源框架) (6) json解析(支持解析成集合或者对象) (7) 数据库(不知道是哪位写的 忘记了) (8) 多线程断点下载(自动判断是否支持多线程,判断是否是重定向) (9) 自动更新模块 (10) 一系列工具类

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值