当前位置:  编程技术>移动开发
本页文章导读:
    ▪EGL接口引见(转)        EGL接口介绍(转) EGL 是 OpenGL ES 和底层 Native 平台视窗系统之间的接口。本章主要讲述 OpenGL ES 的 EGL API ,以及如何用它创建 Context 和绘制 Surface 等,并对用于 OpenGL 的其他视窗 API 做了比较.........
    ▪ gentoo 装配jdk        gentoo 安装jdk 首先,安装eix然后搜索eix -s jdk最后安装指定的jdk1.  安裝 JRE/JDK導覽Java 是由 Sun Microsystems 的工程師發展的程式語言。這是一種物件導向的語言,而且不用在平台上重新編譯就.........
    ▪ 画图技艺       画图技巧 本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!         常用控件说了不少,现在说说手机开发中也常用到的画图。要掌握Android的画图,首先就要了解一下,基本用到的.........

[1]EGL接口引见(转)
    来源: 互联网  发布时间: 2014-02-18
EGL接口介绍(转)

EGL 是 OpenGL ES 和底层 Native 平台视窗系统之间的接口。本章主要讲述 OpenGL ES 的 EGL API ,以及如何用它创建 Context 和绘制 Surface 等,并对用于 OpenGL 的其他视窗 API 做了比较分析,比如 WGL 和 GLX 。本章中将涵盖如下几个方面:

         EGL 综述 
         EGL 主要构成( Display , Context , Configuration ) 
         在 Brew 和 Windows CE 上使用 EGL 
         EGL 和其他 OpenGL 视窗系统的比较 

EGL 介绍

EGL 是为 OpenGL ES 提供平台独立性而设计。在本章中,你将详细地学习每个 EGL API ,并了解使用 EGL 时候需要注意的平台特性和限制。 OpenGL ES 为附加功能和可能的平台特性开发提供了扩展机制,但仍然需要一个可以让 OpenGL ES 和本地视窗系统交互且平台无关的层。 OpenGL ES 本质上是一个图形渲染管线的状态机,而 EGL 则是用于监控这些状态以及维护 Frame buffer 和其他渲染 Surface 的外部层。

图 2-1 是一个典型的 EGL 系统布局图。


 


 

EGL 视窗设计是基于人们熟悉的用于 Microsoft Windows ( WGL )和 UNIX ( GLX )上的 OpenGL 的 Native 接口,与后者比较接近。 OpenGL ES 图形管线的状态被存储于 EGL 管理的一个 Context 中。 Frame Buffers 和其他绘制 Surfaces 通过 EGL API 创建、管理和销毁。 EGL 同时也控制和提供了对设备显示和可能的设备渲染配置的访问。

 

 

EGL 数据类型

EGL 包含了自己的一组数据类型,同时也提供了对一组平台相关的本地数据类型的支持。这些 Native 数据类型定义在 EGL 系统的头文件中。一旦你了解这些数据类型之间的不同,使用它们将变得很简单。多数情况下,为保证可移植性,开发人员将尽可能使用抽象数据类型而避免直接使用系统数据类型。通过使用定义在 EGL 中 Native 类型,可以让你写的 EGL 代码运行在任意的 EGL 的实现上。 Native EGL 类型说明如下:

l         NativeDisplayType 平台显示数据类型,标识你所开发设备的物理屏幕 
l         NativeWindowType 平台窗口数据类型,标识系统窗口 
l         NativePixmapType 可以作为 Framebuffer 的系统图像(内存)数据类型,该类型只用于离屏渲染

下面的代码是一个 NativeWindowType 定义的例子。这只是一个例子,不同平台之间的实现千差万别。使用 native 类型的关键作用在于为开发者抽象化这些细节。 QUALCOMM 使用 IDIB 结构定义 native 类型,如下:

struct IDIB { 
     AEEVTBL(IBitmap) *pvt; // virtual table pointer 
     IQueryInterface * pPaletteMap; // cache for computed palette mapping info 
     byte * pBmp; // pointer to top row 
     uint32 * pRGB; // palette 
     NativeColor ncTransparent; // 32-bit native color value 
     uint16 cx; // number of pixels in width 
     uint16 cy; // number of pixels in height 
     int16 nPitch; // offset from one row to the next 
     uint16 cntRGB; // number of palette entries 
     uint8 nDepth; // size of pixel in bits 
     uint8 nColorScheme; // IDIB_COLORSCHEME_...(ie. 5-6-5) 
     uint8 reserved[6]; 
};

 

接下来的小节中,我们将深入更多 EGL 数据类型细节。标准 EGL 数据类型如表 2.1 所示。

表 2.1 EGL 数据类型 
数据类型 值 
EGLBoolean EGL_TRUE =1, EGL_FALSE=0 
EGLint int 数据类型 
EGLDisplay 系统显示 ID 或句柄 
EGLConfig Surface 的 EGL 配置 
EGLSurface 系统窗口或 frame buffer 句柄 
EGLContext OpenGL ES 图形上下文 
NativeDisplayType Native 系统显示类型 
NativeWindowType Native 系统窗口缓存类型 
NativePixmapType Native 系统 frame buffer


EGL Displays

EGLDisplay 是一个关联系统物理屏幕的通用数据类型。对于 PC 来说, Display 就是显示器的句柄。不管是嵌入式系统或 PC ,都可能有多个物理显示设备。为了使用系统的显示设备, EGL 提供了 EGLDisplay 数据类型,以及一组操作设备显示的 API 。 
       下面的函数原型用于获取 Native Display : 

EGLDisplay eglGetDisplay (NativeDisplayType display);


其中 display 参数是 native 系统的窗口显示 ID 值。如果你只是想得到一个系统默认的 Display ,你可以使用 EGL_DEFAULT_DISPLAY 参数。如果系统中没有一个可用的 native display ID 与给定的 display 参数匹配,函数将返回 EGL_NO_DISPLAY ,而没有任何 Error 状态被设置。
由于设置无效的 display 值不会有任何错误状态,在你继续操作前请检测返回值。 
下面是一个使用 EGL API 获取系统 Display 的例子: 
m_eglDisplay = eglGetDisplay( system.display); 
if (m_eglDisplay == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS)) 
throw error_egl_display; 

Initialization 初始化

    和很多视窗 API 类似, EGL 在使用前需要初始化,因此每个 EGLDisplay 在使用前都需要初始化。初始化 EGLDisplay 的同时,你可以得到系统中 EGL 的实现版本号。了解当前的版本号在向后兼容性方面是非常有价值的。嵌入式和移动设备通常是持续的投放到市场上,所以你需要考虑到你的代码将被运行在形形色色的实现上。通过动态查询 EGL 版本号,你可以为新旧版本的 EGL 附加额外的特性或运行环境。基于平台配置,软件开发可用清楚知道哪些 API 可用访问,这将会为你的代码提供最大限度的可移植性。 
       下面是初始化 EGL 的函数原型:


EGLBoolean eglInitialize (EGLDisplay dpy, EGLint *major, EGLint *minor);


其中 dpy 应该是一个有效的 EGLDisplay 。函数返回时, major 和 minor 将被赋予当前 EGL 版本号。比如 EGL1.0 , major 返回 1 , minor 则返回 0 。给 major 和 minor 传 NULL 是有效的,如果你不关心版本号。 
       eglQueryString() 函数是另外一个获取版本信息和其他信息的途径。通过 eglQueryString() 获取版本信息需要解析版本字符串,所以通过传递一个指针给 eglInitializ() 函数比较容易获得这个信息。注意在调用 eglQueryString() 必须先使用 eglInitialize() 初始化 EGLDisplay ,否则将得到 EGL_NOT_INITIALIZED 错误信息。 
       下面是获取 EGL 版本字符串信息的函数原型:


const char * eglQueryString (EGLDisplay dpy, EGLint name);


参数 name 可以是 EGL_VENDOR, EGL_VERSION, 或者 EGL_EXTENSIONS 。这个函数最常用来查询有哪些 EGL 扩展被实现。所有 EGL 扩展都是可选的,如果你想使用某个扩展特性,请检查该扩展是否被实现了,而不要想当然假定已经实现了。如果没有扩展被实现,将返回一个 Null 字符串,如果给定的 name 参数无效,则会得到 EGL_BAD_PARAMETER. 错误信息。 

初始化EGL 
OpenGL ES是一个平台中立的图形库,在它能够工作之前,需要与一个实际的窗口系统关联起来,这与OpenGL是一样的。但不一样的是,这部份工作有标准,这个标 准就是EGL。而OpenGL时代在不同平台上有不同的机制以关联窗口系统,在Windows上是wgl,在X-Window上是xgl,在Apple OS上是agl等。EGL的工作方式和部份术语都接近于xgl。

OpenGL ES的初始化过程如下图所示意: 

Display → Config → Surface   
                         ↑   
                       Context   
                         ↑   
Application → OpenGL Command   

 

1. 获取Display。
Display代表显示器,在有些系统上可以有多个显示器,也就会有多个Display。获得Display要调用EGLboolean eglGetDisplay(NativeDisplay dpy),参数一般为 EGL_DEFAULT_DISPLAY 。该参数实际的意义是平台实现相关的,在X-Window下是XDisplay ID,在MS Windows下是Window DC。

2. 初始化egl。
调用 EGLboolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor),该函数会进行一些内部初始化工作,并传回EGL版本号(major.minor)。

3. 选择Config。
所为Config实际指的是FrameBuffer的参数,在MS Windows下对应于PixelFormat,在X-Window下对应Visual。一般用EGLboolean eglChooseConfig(EGLDisplay dpy, const EGLint * attr_list, EGLConfig * config, EGLint config_size, EGLint *num_config),其中attr_list是以EGL_NONE结束的参数数组,通常以id,value依次存放,对于个别标识性的属性可以只有 id,没有value。另一个办法是用EGLboolean eglGetConfigs(EGLDisplay dpy, EGLConfig * config, EGLint config_size, EGLint *num_config) 来获得所有config。这两个函数都会返回不多于config_size个Config,结果保存在config[]中,系统的总Config个数保存 在num_config中。可以利用eglGetConfig()中间两个参数为0来查询系统支持的Config总个数。
Config有众多的Attribute,这些Attribute决定FrameBuffer的格式和能力,通过eglGetConfigAttrib ()来读取,但不能修改。

4. 构造Surface。
Surface实际上就是一个FrameBuffer,通过 EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig confg, NativeWindow win, EGLint *cfg_attr) 来创建一个可实际显示的Surface。系统通常还支持另外两种Surface:PixmapSurface和PBufferSurface,这两种都不 是可显示的Surface,PixmapSurface是保存在系统内存中的位图,PBuffer则是保存在显存中的帧。
Surface也有一些attribute,基本上都可以故名思意, EGL_HEIGHT EGL_WIDTH EGL_LARGEST_PBUFFER EGL_TEXTURE_FORMAT EGL_TEXTURE_TARGET EGL_MIPMAP_TEXTURE EGL_MIPMAP_LEVEL,通过eglSurfaceAttrib()设置、eglQuerySurface()读取。

5. 创建Context。
OpenGL的pipeline从程序的角度看就是一个状态机,有当前的颜色、纹理坐标、变换矩阵、绚染模式等一大堆状态,这些状态作用于程序提交的顶点 坐标等图元从而形成帧缓冲内的像素。在OpenGL的编程接口中,Context就代表这个状态机,程序的主要工作就是向Context提供图元、设置状 态,偶尔也从Context里获取一些信息。
用EGLContext eglCreateContext(EGLDisplay dpy, EGLSurface write, EGLSurface read, EGLContext * share_list)来创建一个Context。

6. 绘制。
应用程序通过OpenGL API进行绘制,一帧完成之后,调用eglSwapBuffers(EGLDisplay dpy, EGLContext ctx)来显示。

EGL Configurations

EGLConfigs 是一个用来描述 EGL surface 配置信息的数据类型。要获取正确的渲染结果, Surface 的格式是非常重要的。根据平台的不同, surface 配置可能会有限制,比如某个设备只支持 16 位色深显示,或是不支持 stencil buffer ,还有其他的功能限制或精度的差异。

       下面是获取系统可用的 EGL 配置信息的函数原型:


EGLBoolean eglGetConfigs (EGLDisplay dpy, EGLConfig *configs,EGLint config_size, EGLint *num_config);

 

参数 configs 将包含在你的平台上有效的所有 EGL framebuffer 配置列表。支持的配置总数将通过 num_config 返回。实际返回的 configs 的配置个数依赖于程序传入的 config_size 。如果 config_size < num_config ,则不是所有的配置信息都将被返回。如果想获取系统支持的所有配置信息,最好的办法就是先给 eglGetConfig 传一个 NULL 的 configs 参数, num_config 将得到系统所支持的配置总数,然后用它来给 configs 分配合适的内存大小,再用得到的 configs 来调用 eglGetConfig 。 
       下面是如果使用 eglGetConfig() 函数的例子:

 

EGLConfig *configs_list; 
EGLint num_configs; 
// Main Display 
m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); 
if( m_eglDisplay == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS ) 
return FALSE; 
if( eglInitialize( m_eglDisplay, NULL, NULL ) == EGL_FALSE || eglGetError() != EGL_SUCCESS ) 
return FALSE; 
// find out how many configurations are supported 
if ( eglGetConfigs( m_eglDisplay, NULL, 0, &num_configs)   == EGL_FALSE || eglGetError() != EGL_SUCCESS ) 
return FALSE; 
configs_list = malloc(num_configs * sizeof(EGLConfig)); 
if (configs_list == (EGLConfig *)0) 
return FALSE; 
// Get Configurations 
if( eglGetConfigs( m_eglDisplay, configs_list, num_configs, &num_configs) == EGL_FALSE || eglGetError() != EGL_SUCCESS ) 
return FALSE;

 

由于当前平台的限制,通常只有很少的配置可用。系统支持的配置通常是利用系统硬件提供最好的性能。当你移植游戏到多个平台,它们的 EGL 配置可能会有细微的差别,我们希望作为通用的移植问题来直接处理这些问题。 

选择一个 EGL Configuration 
基于 EGL 的属性,你可以定义一个希望从系统获得的配置,它将返回一个最接近你的需求的配置。选择一个你特有的配置是有点不合适的,因为只是在你的平台上使用有效。 eglChooseConfig() 函数将适配一个你所期望的配置,并且尽可能接近一个有效的系统配置。

       下面是选择一个 EGL 配置的函数原型:

 

EGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list,

EGLConfig *configs, EGLint config_size, EGLint * num_config);

 

参数 attrib_list 指定了选择配置时需要参照的属性。参数 configs 将返回一个按照 attrib_list 排序的平台有效的所有 EGL framebuffer 配置列表。参数 config_size 指定了可以返回到 configs 的总配置个数。参数 num_config 返回了实际匹配的配置总数。 
       下面是如果使用 eglChoosetConfig() 函数的例子:


EGLint attrs[3] = { EGL_DEPTH_SIZE, 16, EGL_NONE }; 
EGLint num_configs; 
EGLConfigs *configs_list; 
// Get the display device 
if ((eglDisplay = eglGetDisplay(EGL_NO_DISPLAY)) == EGL_NO_DISPLAY) 

return eglGetError(); 

// Initialize the display 
if (eglInitialize(eglDisplay, NULL, NULL) == EGL_FALSE) 

return eglGetError(); 

// Obtain the total number of configurations that match 
if (eglChooseConfig(eglDisplay, attrs, NULL, 0, &num_configs) == EGL_FALSE) 

return eglGetError(); 

configs_list = malloc(num_configs * sizeof(EGLConfig)); 
if (configs_list == (EGLConfig *)0) 
return eglGetError(); 
// Obtain the first configuration with a depth buffer of 16 bits 
if (!eglChooseConfig(eglDisplay, attrs, &configs_list, num_configs, &num_configs)) 

return eglGetError(); 
}

 

如果找到多个合适的配置,有一个简单的排序算法用来匹配最接近你所查询的配置。表 2-2 显示了基于属性值的用来选择和排序的顺序,也包括了 EGL 规范中所有 EGL 配置属性及其默认值。

 

表 2.1 EGL 配置属性默认值和匹配法则 
属性 数据类型 默认值 排序优先级 选择顺序 
EGL_BUFFER_SIZE int 0 3 Smaller value 
EGL_RED_SIZE int 0 2 Larger value 
EGL_GREEN_SIZE int 0 2 Larger value 
EGL_BLUE_SIZE int 0 2 Larger value 
EGL_ALPHA_SIZE int 0 2 Larger value 
EGL_CONFIG_CAVET enum EGL_DONT_CARE 1(first) Exact value 
EGL_CONFIG_ID int EGL_DONT_CARE 9 Exact value 
EGL_DEPTH_SIZE int 0 6 Smaller value 
EGL_LEVEL int 0 - Equal value 
EGL_NATIVE_RENDERABLE Boolean EGL_DONT_CARE - Exact value 
EGL_NATIVE_VISUAL_TYPE int EGL_DONT_CARE 8 Exact value 
EGL_SAMPLE_BUFFERS int 0 4 Smaller value 
EGL_SAMPLES int 0 5 Smaller value 
EGL_STENCIL_SIZE int 0 7 Smaller value 
EGL_SURFACE_TYPE bitmask 
EGL_WINDOW_BIT - Mask value 
EGL_TRANSPARENT_TYPE enum 
EGL_NONE - Exact value 
EGL_TRANSPARENT_RED_VALUE int 
EGL_DONT_CARE - Exact value 
EGL_TRANSPARENT_GREEN_VALUE int 
EGL_DONT_CARE - Exact value 
EGL_TRANSPARENT_BLUE_VALUE int 
EGL_DONT_CARE - Exact value 

 


    
[2] gentoo 装配jdk
    来源: 互联网  发布时间: 2014-02-18
gentoo 安装jdk
首先,安装eix
然后搜索
eix -s jdk
最后
安装指定的jdk


1.  安裝 JRE/JDK

導覽

Java 是由 Sun Microsystems 的工程師發展的程式語言。這是一種物件導向的語言,而且不用在平台上重新編譯就可以在那種平台執行。雖然 Java 可以用原生的方式執行,Java 受到好評的原因大部份是可以跨平台執行,還有其他的像是垃圾收集等等。他們編譯一次就可以在各平台執行的能力是由即時編譯器(JIT)完成的,他在執行 Java 程式時把 Java bytecodes 編譯成原生的程式。

為了要執行 Java bytecodes,需要安裝 JRE (Java Runtime Environment)。JRE 提供了核心函式庫,和平台相依的 Java 虛擬機器,瀏覽器的外掛,還有其他東西。JDK (Java Development Kit) 則加上了程式工具,像是 bytecode 編譯器及除錯器。

2.  安裝 JRE/JDK

選擇

Gentoo 提供幾種不同的 JDK 和 JRE。在目前可以用的清單中,我們有:

    * blackdown-jre and blackdown-jdk, the Blackdown Java Kit
    * sun-jre-bin and sun-jdk, Sun's Java Kit
    * ibm-jre-bin and ibm-jdk-bin, the IBM Java Kit
    * compaq-jre and compaq-jdk, the Compaq Java Kit for Alpha/Linux/GNU
    * jrockit-jdk-bin, BEA WebLogic's J2SE Development Kit

預設的是 Blackdown JRE/JDK,因為它們不需註冊就可以免費 ("像啤酒一樣") 下載。

Sun JRE/JDK 和 IBM JRE/JDK 一般都比較快,不過您得花更多功夫得到它們。它們要求您下載之前先同意一份合約 (IBM 還要求您註冊)。

我們寫給 Sun 和 IBM JRE/JDK 的 ebuilds 會告訴您那裡可以下載它們。

安裝 Sun/IBM JRE/JDKs

如果您執行 emerge =sun-jdk-1.4.2.06 或 =ibm-jdk-bin-1.4.2,您會被要求自己下載壓縮檔。這是由於 Sun JRE/JDK (線上同意授權) 以及 IBM JRE/JDK 的授權方法的關係。

注意: ibm-jdk-bin 目前是被封鎖的,你在使用前需要先將他解除封鎖。

您應該將檔案下載至 /usr/portage/distfiles。下載完成後,您可以重新執行 emerge 命令,然後 JRE/JDK 就會正確的被安裝在 /opt。

3.  設定您的 JRE/JDK

導覽

Gentoo 擁有能夠讓您安裝多個 JDK 和 JRE 而且不會打架的特異功能。不過有幾點要注意的,如下列所示。

使用 java-config 這個小工具,您可以設定系統的 Java 預設值,當然您得是根 (root) 使用者。使用者也可以用 java-config 來設定他們自己的個人預設值,如果和他們想使用系統預設值不同的 Java 的話。

設定預設的 JRE/JDK

執行 java-config --list-available-vms 可以列出目前系統上所有可用的 JRE 和 JDK,這裡是輸出的範例:

原始碼 3.1: 列出可用的虛擬機器

# java-config --list-available-vms
[blackdown-jdk-1.3.1] Blackdown JDK 1.3.1 (/etc/env.d/java/20blackdown-jdk-1.3.1)
[blackdown-jre-1.3.1] Blackdown JRE 1.3.1 (/etc/env.d/java/20blackdown-jre-1.3.1)
[ibm-jdk-1.3.0] IBM JDK 1.3.0 (/etc/env.d/java/20ibm-jdk-1.3.0)
[ibm-jdk-1.3.1] IBM JDK 1.3.1 (/etc/env.d/java/20ibm-jdk-1.3.1)
[ibm-jre-1.3.1] IBM JRE 1.3.1 (/etc/env.d/java/20ibm-jre-1.3.1)
[sun-jdk-1.4.0] Sun JDK 1.4.0 (/etc/env.d/java/20sun-jdk-1.4.0)

在引號 "[]" 中的名稱是虛擬機器的詳細名稱和 ID。您將這些 ID 送給 java-config --set-system-vm 來設定想使用的虛擬機器,底下是一個設定的範例:

原始碼 3.2: 設定系統虛擬機器

# java-config --set-system-vm=ibm-jdk-1.3.1
Now using IBM JDK 1.3.1 (/etc/env.d/java/20ibm-jdk-1.3.1)

注意: 您必須以根 (root) 使用者的身份來執行 --set-system-vm。

在您使用特定的虛擬機器 ID 執行 java-config --set-system-vm 之後,您必須重新建立您的 /etc/profile.env,如下:

原始碼 3.3: 重建 /etc/profile.env

# env-update

在這之後,您可能會想重新登入,或者重新引入 /etc/profile 環境設定。

如果您是普通使用者,您可以使用 java-config --set-user-vm,這將建立擁有所有必須環境變數的 ~/.gentoo/java-env 檔案。您可以普通的在殼 (shell) 的啟始命令稿中引入這個檔案 (我的是 ~/.bashrc)。

設定預設的 CLASSPATH

java-config也可以用來設定系統預設的 CLASSPATH,當然也可以設定使用者個人的預設 CLASSPATH。

首先,您可能會想看看有什麼函式庫可以放進您的 CLASSPATH,這是一個輸出的例子:

原始碼 3.4: 列出類別

# java-config --list-available-packages
[bsh] BeanShell is a small, free, embeddable, Java
source interpreter with object scripting language
features. (/usr/share/bsh/package.env)
[oro] A set of text-processing Java classes that
provide Perl5 compatible regular expressions, AWK-like
regular expressions, glob expressions, and utility
classes for performing substitutions, splits, filtering
filenames, etc. (/usr/share/oro/package.env)
[bcel] The Byte Code Engineering Library: analyze, create,
manipulate Java class files (/usr/share/bcel/package.env)
[jsch] JSch is a pure Java implementation of SSH2.
(/usr/share/jsch/package.env)
...

再次的,在於 "[]" 中的名稱是您必須傳送給 java-config --set-system-classpath 的 ID,所以:

原始碼 3.5: 設定類別目錄

# java-config --set-system-classpath=log4j,java-gtk,java-gnome

注意: 目前的目錄 (.) 不會出現在系統類別目錄中,它應該被加入根 (root) 使用者的登入設定裡。

再次的,您必須執行 env-update 以更新您的系統環境設定,而您可能也會想重新登入或重新引入 /etc/profile。

對一般使用者,java-config --set-user-classpath 會建立 ~/.gentoo/java-env-classpath,它會自動被 ~/.gentoo/java-env 引入。

4.  使用 Java 的 USE 設定

設定 USE 棋標

關於更多 USE 棋標的資訊,參考手冊中 USE 設定 這章。

可以用的棋標

    * java 棋標對許多程式加入 Java 支援。
    * The mozilla 棋標加入對 Mozilla 類瀏覽器的支援 (包括 Firefox) 如果你用 blackdown's Java kit。你需要加入這個才能在 Mozilla 類瀏覽器中瀏覽 Java applets

5.  更多資源

離線資源

    * java-config 的男人頁 (man page)
    * java-config --help
    * /usr/bin/java-config 命令稿本身

線上資源

    * gentoo-dev 、gentoo-user 郵件列表存檔
    * irc.freenode.net 上的 #gentoo 以及 #gentoo-java 頻道
    * Wikipedia 的 Java 段落

    
[3] 画图技艺
    来源: 互联网  发布时间: 2014-02-18
画图技巧
本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处!

        常用控件说了不少,现在说说手机开发中也常用到的画图。要掌握Android的画图,首先就要了解一下,基本用到的图形接口:

1.Bitmap,可以来自资源/文件,也可以在程序中创建,实际上的功能相当于图片的存储空间;

2.Canvas,紧密与Bitmap联系,把Bitmap比喻内容的话,那么Canvas就是提供了众多方法操作Bitamp的平台;

3.Paint,与Canvas紧密联系,是"画板"上的笔刷工具,也用于设置View控件上的样式;

4.Drawable,如果说前三者是看不见地在内存中画图,那么Drawable就是把前三者绘图结果表现出来的接口。Drawable多个子类,例如:位图(BitmapDrawable)、图形(ShapeDrawable)、图层(LayerDrawable)等。



本文主要讲解如何在ImageView画图,以及如何直接在Button(继承View的控件)上面绘制自定义图像。


直接把资源图片画出来


在ImageView上画图以及绘字


直接在控件背景上画图

main.xml的源码:
Java代码
  • <?xml version="1.0" encoding="utf-8"?>     
  • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     
  •     android:orientation="vertical"     
  •     android:layout_width="fill_parent"     
  •     android:layout_height="fill_parent"     
  •     >     
  • <Button android:id="@+id/Button01" android:layout_width="fill_parent" android:layout_height="44px" android:text="显示资源图片"></Button>     
  • <Button android:id="@+id/Button02" android:layout_width="fill_parent" android:layout_height="44px" android:text="显示并绘画资源图片"></Button>     
  • <Button android:id="@+id/Button03" android:layout_height="44px" android:layout_width="fill_parent" android:text="在控件上绘图"></Button>     
  • <ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>     
  •      
  • </LinearLayout>    
  • <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:orientation="vertical"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        >  
    <Button android:id="@+id/Button01" android:layout_width="fill_parent" android:layout_height="44px" android:text="显示资源图片"></Button>  
    <Button android:id="@+id/Button02" android:layout_width="fill_parent" android:layout_height="44px" android:text="显示并绘画资源图片"></Button>  
    <Button android:id="@+id/Button03" android:layout_height="44px" android:layout_width="fill_parent" android:text="在控件上绘图"></Button>  
    <ImageView android:id="@+id/ImageView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>  
      
    </LinearLayout>  
    


    程序的源码:
    Java代码
  • package com.testDraw;     
  •      
  • import android.app.Activity;     
  • import android.content.res.Resources;     
  • import android.graphics.Bitmap;     
  • import android.graphics.Bitmap.Config;     
  • import android.graphics.BitmapFactory;     
  • import android.graphics.Canvas;     
  • import android.graphics.Color;     
  • import android.graphics.Paint;     
  • import android.graphics.Typeface;     
  • import android.graphics.drawable.BitmapDrawable;     
  • import android.graphics.drawable.Drawable;     
  • import android.os.Bundle;     
  • import android.view.View;     
  • import android.widget.Button;     
  • import android.widget.ImageView;     
  •      
  • public class testDraw extends Activity {     
  •          
  •     ImageView iv;     
  •     Button btn1,btn2,btn3,btn4;     
  •     Resources r;     
  •     @Override     
  •     public void onCreate(Bundle savedInstanceState) {     
  •         super.onCreate(savedInstanceState);     
  •         setContentView(R.layout.main);     
  •         iv=(ImageView)this.findViewById(R.id.ImageView01);     
  •         btn1=(Button)this.findViewById(R.id.Button01);     
  •         btn2=(Button)this.findViewById(R.id.Button02);     
  •         btn3=(Button)this.findViewById(R.id.Button03);     
  •      
  •         btn1.setOnClickListener(new ClickEvent());     
  •         btn2.setOnClickListener(new ClickEvent());     
  •         btn3.setOnClickListener(new ClickEvent());     
  •              
  •         r = this.getResources();     
  •      
  •        
  •     }     
  •     class ClickEvent implements View.OnClickListener {     
  •      
  •         public void onClick(View v) {     
  •             if(v==btn1)//显示资源图片     
  •             {//功能等效     
  •                 //iv.setBackgroundResource(R.drawable.icon);//打开资源图片     
  •                 Bitmap bmp=BitmapFactory.decodeResource(r, R.drawable.icon);//打开资源图片     
  •                 iv.setImageBitmap(bmp);     
  •             }     
  •             else if(v==btn2)//显示并绘画资源图片     
  •             {     
  •                 Bitmap bmp=BitmapFactory.decodeResource(r, R.drawable.icon);//只读,不能直接在bmp上画     
  •                 Bitmap newb = Bitmap.createBitmap( 300, 300, Config.ARGB_8888 );     
  •                      
  •                 Canvas canvasTemp = new Canvas( newb );     
  •                 canvasTemp.drawColor(Color.TRANSPARENT);     
  •                      
  •                 Paint p = new Paint();     
  •                 String familyName ="宋体";     
  •                 Typeface font = Typeface.create(familyName,Typeface.BOLD);     
  •                 p.setColor(Color.RED);     
  •                 p.setTypeface(font);     
  •                 p.setTextSize(22);     
  •                 canvasTemp.drawText("写字。。。",50,50,p);     
  •                 canvasTemp.drawBitmap(bmp, 50, 50, p);//画图     
  •                 iv.setImageBitmap(newb);     
  •             }     
  •             else if(v==btn3)//直接在Button上绘图     
  •             {     
  •                 Bitmap newb = Bitmap.createBitmap( btn3.getWidth(), btn3.getHeight(), Config.ARGB_8888 );     
  •                 Canvas canvasTemp = new Canvas( newb );     
  •                 canvasTemp.drawColor(Color.WHITE);     
  •                 Paint p = new Paint();     
  •                 String familyName = "宋体";     
  •                 Typeface font = Typeface.create(familyName, Typeface.BOLD);     
  •                 p.setColor(Color.RED);     
  •                 p.setTypeface(font);     
  •                 p.setTextSize(20);     
  •                 canvasTemp.drawText("写字。。。", 30, 30, p);     
  •                 Drawable drawable = new BitmapDrawable(newb);     
  •                 btn3.setBackgroundDrawable(drawable);     
  •             }     
  •         }     
  •              
  •     }     
  •      
  • }    
  • package com.testDraw;  
      
    import android.app.Activity;  
    import android.content.res.Resources;  
    import android.graphics.Bitmap;  
    import android.graphics.Bitmap.Config;  
    import android.graphics.BitmapFactory;  
    import android.graphics.Canvas;  
    import android.graphics.Color;  
    import android.graphics.Paint;  
    import android.graphics.Typeface;  
    import android.graphics.drawable.BitmapDrawable;  
    import android.graphics.drawable.Drawable;  
    import android.os.Bundle;  
    import android.view.View;  
    import android.widget.Button;  
    import android.widget.ImageView;  
      
    public class testDraw extends Activity {  
          
        ImageView iv;  
        Button btn1,btn2,btn3,btn4;  
        Resources r;  
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            iv=(ImageView)this.findViewById(R.id.ImageView01);  
            btn1=(Button)this.findViewById(R.id.Button01);  
            btn2=(Button)this.findViewById(R.id.Button02);  
            btn3=(Button)this.findViewById(R.id.Button03);  
      
            btn1.setOnClickListener(new ClickEvent());  
            btn2.setOnClickListener(new ClickEvent());  
            btn3.setOnClickListener(new ClickEvent());  
              
            r = this.getResources();  
      
        
        }  
        class ClickEvent implements View.OnClickListener {  
      
            public void onClick(View v) {  
                if(v==btn1)//显示资源图片  
                {//功能等效  
                    //iv.setBackgroundResource(R.drawable.icon);//打开资源图片  
                    Bitmap bmp=BitmapFactory.decodeResource(r, R.drawable.icon);//打开资源图片  
                    iv.setImageBitmap(bmp);  
                }  
                else if(v==btn2)//显示并绘画资源图片  
                {  
                    Bitmap bmp=BitmapFactory.decodeResource(r, R.drawable.icon);//只读,不能直接在bmp上画  
                    Bitmap newb = Bitmap.createBitmap( 300, 300, Config.ARGB_8888 );  
                      
                    Canvas canvasTemp = new Canvas( newb );  
                    canvasTemp.drawColor(Color.TRANSPARENT);  
                      
                    Paint p = new Paint();  
                    String familyName ="宋体";  
                    Typeface font = Typeface.create(familyName,Typeface.BOLD);  
                    p.setColor(Color.RED);  
                    p.setTypeface(font);  
                    p.setTextSize(22);  
                    canvasTemp.drawText("写字。。。",50,50,p);  
                    canvasTemp.drawBitmap(bmp, 50, 50, p);//画图  
                    iv.setImageBitmap(newb);  
                }  
                else if(v==btn3)//直接在Button上绘图  
                {  
                    Bitmap newb = Bitmap.createBitmap( btn3.getWidth(), btn3.getHeight(), Config.ARGB_8888 );  
                    Canvas canvasTemp = new Canvas( newb );  
                    canvasTemp.drawColor(Color.WHITE);  
                    Paint p = new Paint();  
                    String familyName = "宋体";  
                    Typeface font = Typeface.create(familyName, Typeface.BOLD);  
                    p.setColor(Color.RED);  
                    p.setTypeface(font);  
                    p.setTextSize(20);  
                    canvasTemp.drawText("写字。。。", 30, 30, p);  
                    Drawable drawable = new BitmapDrawable(newb);  
                    btn3.setBackgroundDrawable(drawable);  
                }  
            }  
              
        }  
      
    }  
    
    • 大小: 18.5 KB
    • 大小: 20.9 KB
    • 大小: 21.3 KB

        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3