内存 DC 和 BitBlt
新的 GDI 函数增强了内存 DC 操作函数。GDI 函数在建立内存 DC 时,将调用 GAL 的相应接口。如前所述,GAL 将尽量把内存 DC 建立在显示卡的显示内存当中。这样,可以充分利用显示卡的硬件加速功能,实现显示内存中两个不同区域之间位块的快速移动、复制等等,包括透明处理和 Alpha 混和。应用程序可以建立一个具有逐点 Alpha 特性的内存 DC(每个点具有不同的 Alpha 值),也可以通过 SetMemDCAlpha 设置内存 DC 所有象素的 Alpha 值(或者称为"Alpha 通道"),然后利用 BitBlt 和 StretchBlt 函数实现 DC 之间的位块传送。应用程序还可以通过 SetMemDCColorKey 函数设置源 DC 的透明色,从而在进行 BitBlt 时跳过这些透明色。
有关内存 DC 的 GDI 函数有(include/gdi.h):
#define MEMDC_FLAG_NONE 0x00000000 /* None. */
#define MEMDC_FLAG_SWSURFACE 0x00000000 /* DC is in system memory */
#define MEMDC_FLAG_HWSURFACE 0x00000001 /* DC is in video memory */
#define MEMDC_FLAG_SRCCOLORKEY 0x00001000 /* Blit uses a source color key */
#define MEMDC_FLAG_SRCALPHA 0x00010000 /* Blit uses source alpha blending */
#define MEMDC_FLAG_RLEACCEL 0x00004000 /* Surface is RLE encoded */
HDC GUIAPI CreateCompatibleDC (HDC hdc);
HDC GUIAPI CreateMemDC (int width, int height, int depth, DWORD flags,
Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);
BOOL GUIAPI ConvertMemDC (HDC mem_dc, HDC ref_dc, DWORD flags);
BOOL GUIAPI SetMemDCAlpha (HDC mem_dc, DWORD flags, Uint8 alpha);
BOOL GUIAPI SetMemDCColorKey (HDC mem_dc, DWORD flags, Uint32 color_key);
void GUIAPI DeleteMemDC (HDC mem_dc);
CreateCompatibleDC 函数创建一个和给定 DC 兼容的内存 DC。兼容的含义是指,新创建的内存 DC 的象素格式、宽度和高度与给定 DC 是相同的。利用这种方式建立的内存 DC 可以快速 Blit 到与之兼容的 DC 上。
这里需要对象素格式做进一步解释。象素格式包含了颜色深度(即每象素点的二进制位数)、调色板或者象素点中 RGBA(红、绿、蓝、Alpha)四个分量的组成方式。其中的 Alpha 分量,可以理解为一个象素点的透明度,0 表示完全透明,255 表示完全不透明。在 MiniGUI 中,如果颜色深度低于 8,则 GAL 会默认创建一个调色板,并且可以调用 SetPalette 函数修改调色板。如果颜色深度高于 8,则通过四个变量分别指定象素点中 RGBA 分量所占的位。如果是建立兼容 DC,则兼容内存 DC 和给定 DC 具有一样的颜色深度,同时具有一样的调色板或者一样的 RGBA 分量组成方式。
如果调用 CreateMemDC 函数,则可以指定新建内存 DC 的高度、宽度、颜色深度,以及必要的 RGBA 组成方式。在 MiniGUI 中,是通过各自在象素点中所占用的位掩码来表示 RGBA 四个分量的组成方式的。比如,如果要创建一个包含逐点 Alpha 信息的16 位内存 DC,则可以用每分量四个二进制位的方式分配 16 位的象素值,这样,RGBA 四个分量的掩码分别为:0x0000F000, 0x00000F00, 0x000000F0, 0x0000000F。
ConvertMemDC 函数用来将一个任意的内存 DC 对象,根据给定的参考 DC 的象素格式进行转换,使得结果 DC 具有和参考 DC 一样的象素格式。这样,转换后的 DC 就能够快速 Blit 到与之兼容的 DC 上。
SetMemDCAlpha 函数用来设定或者取消整个内存 DC 对象的 Alpha 通道值。我们还可以通过 MEMDC_FLAG_RLEACCEL 标志指定内存 DC 采用或者取消 RLE 编码方式。Alpha 通道值将作用在 DC 的所有象素点上。
SetMemDCColorKey 函数用来设定或者取消整个内存 DC 对象的 ColorKey,即透明象素值。我们还可以通过 MEMDC_FLAG_RLEACCEL 标志指定内存 DC 采用或者取消 RLE 编码方式。
内存 DC 和其他 DC 一样,也可以调用 GDI 的绘图函数向内存 DC 中进行任意的绘图输出,然后再 BitBlt 到其他 DC 中。下面的程序段演示了如何使用内存 DC 向窗口 DC 进行透明和 Alpha 混和的 Blitting 操作:
/*&
V2 版本有几个注意事项:
- 只能运行在Android2.2以及以上版本的设备上
- 不能运行在模拟器中
-
在开发环境中安装Goole Play service SDK.
(参考: http://developer.android.com/google/play-services/setup.html)
下载后的Google Play services SDK 保存在<android-sdk-folder>/extras/google/google_play_services/.
为了不破坏SDK中的程序的原样,我们先把示例程序复制一份出来.
复制<android-sdk-folder>/extras/google/google_play_services/samples/maps到D:\code 下.
然后选择File > Import, Android > Existing Android Code into Workspace,把此程序导入到Eclipse中.(注意: 这里是 Android > Existing Android Code into Workspace, 而不是General > Existing Projects into Workspace, 否则会出现大量错误.)
这个工程导入后可能会出现很多问题,请尝试使用以下方法解决:
1. 在此工程上点击右键,选择Properties>Android, 在右下方的Library选项中如果出现红叉,先把它删除,然后点击添加按钮,把前面导入的google-play-services_lib工程加进来
2. 另一个问题就是android.support找不到,这个是缺少android-support-v4.jar,可以通过在工程上点击右键,选择Android Tools > Add Support Library, 会从网络上下载.如果网络下载有问题,也可以在工程中新建目录libs,然后把此文件从<android-sdk-folder>\extras\android\compatibility\v4\android-support-v4.jar复制到新建目录一个就可以了.
-
获得Goole Maps API Key
(参考: https://developers.google.com/maps/documentation/android/start#the_google_maps_api_key
http://developer.android.com/tools/publishing/app-signing.html)
获得Google Maps API Key 在V2版本中需要如下几个步骤:
查看程序签名的SHA1认证指纹.
在开发模式下,默认会使用C:\Users\<你的用户名称>\.android\debug.keystore这个自动生成的debug状态的签名文件,可以通过Windows>Preferences>Android中的Default debug keystore进行查看.
接下来进入你的系统的命令行控制台中,切换到你安装的JDK的bin目录中输入keytool -v -list -keystore C:\Users\<你的用户名称>\.android\debug.keystore,密码是android,查看"证书指纹"中的SHA1中的内容,这个内容记下来,接下来会使用到.
创建Google Maps API Key.
访问Google APIs Console(https://code.google.com/apis/console).如果没有登录,就先登录.登录后,如果是首次使用,会出现让你创建API工程的页面.
点击Create project后会跳转到services页面,需要在这个页面选择你要使用的API.这里我们选择Google Maps Android API v2.
之后会跳转到服务条款确认的页面,接受后,在显示的页面中左边列表选择”API Access”,然后点击Create new Android key... 按钮.
在弹出的对话框中填写SHA1认证指纹和程序的包命,中间用分号分隔(google自带的google map v2示例程序的包命是com.example.mapdemo):
0E:10:94:C7:B9:FD:15:62:27:FC:E7:FC:0C:05:59:A7:18:41:F5:B2;com.example.mapdemo
点击create按钮后,就创建了一个新的API key:
当控制台出现:
Failed to install ***.apk on device '019417a3': Unable to open sync connection!
java.io.IOException: Unable to open sync connection!
Launch canceled!
或者
Uploading ****.apk onto device '1000b1eda2c2'
Failed to install ****.apk on device '1000b1eda2c2': adb rejected install command with: device offlinecom.android.ddmlib.AdbCommandRejectedException: device offline
Launch canceled!
解决方法:
第二种:手机-设置-应用程序-开发-usb调试打开再关闭一次
第三种:安装豌豆夹或者360手机精灵在电脑上,用他们连接手机,安装驱动。
第四种:在cmd下Try "adb kill-server" and then "adb start-server"