当前位置:  编程技术>移动开发
本页文章导读:
    ▪opengl学习(5)- 视图(二)        opengl学习(五)------ 视图(二)      今天说一下模型变换。      模型变换有三种变换:移动,旋转,拉伸。对应到函数就是glTranslate*(), glRotate*()和glScale*()。这三个函数相当于产生一个.........
    ▪ APK装配过程及原理详解        APK安装过程及原理详解 转自:http://blog.sina.com.cn/s/blog_4059b4f90100xslf.html 应用安装是智能机的主要特点,即用户可以把各种应用(如游戏等)安装到手机上,并可以对其进行卸载等管理操作。AP.........
    ▪ 设立EditText只输入数字、字母       设置EditText只输入数字、字母 如何设置EditText,使得只能输入数字或者某些字母呢? 一、设置EditText,只输入数字:        方法1:直接生成DigitsKeyListener对象就可以了。 et_1.setKeyListener(ne.........

[1]opengl学习(5)- 视图(二)
    来源: 互联网  发布时间: 2014-02-18
opengl学习(五)------ 视图(二)

     今天说一下模型变换。
     模型变换有三种变换:移动,旋转,拉伸。对应到函数就是glTranslate*(), glRotate*()和glScale*()。这三个函数相当于产生一个适当的矩阵,然后当前矩阵与这个矩阵相乘,得出变换后的矩阵,也就呈现了变换效果。
      看一下函数定义:

Void glTranslate{fd}(TYPE x, TYPE y, TYPE z);

     把当前矩阵与一个表示移动物体的矩阵相乘,这个移动矩阵由x、y和z值指定或者在局部坐标系统中移动相同的数量。

使用(0.0, 0.0, 0.0)为参数调用glTranslate*()是单位操作,也就是说,物体将不进行移动。


void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z);


     把当前矩阵与一个表示移动物体(或物体的局部坐标系统)的矩阵相乘,以逆时针方向绕着从原点到点(x, y, z)的直线进行旋转。angle参数指定了旋转的度数。

ps:远离旋转轴的物体比靠近旋转轴的物体的旋转幅度更大(轨道更长)。另外,如果angle参数为零,glRotate*()函数就不能产生任何效果。


void glScale{fd}(TYPE x, TYPE y, TYPE z);


      把当前矩阵与一个表示沿各个轴对物体进行拉伸、收缩和反射的矩阵相乘。这个物体中每个点的x、y和z坐标与对应x、y和z参数相乘。使用局部坐标系统方法,局部坐标系统的轴将由x、y和z因子拉伸、收缩或者反射,相关联的物体也根据它们进行变换。

     单位缩放值为:(1.0, 1.0, 1.0).

ps:如果缩放值为0,它会把所有沿这个轴的物体坐标收缩为0.通常,这并不是一种好的做法,因为这种操作是无法还原的。从数学角度而言,这种矩阵是没有逆矩阵的。但是对于有些光照计算,逆矩阵又是必须的。一般而言,如果一个坐标系统需要收缩为0,应该使用投影矩阵,而不是模型视图矩阵。



 

      现在我们假设这样两种变换:一个物体,沿着原点绕z轴逆时针旋转45度,然后再沿x轴向下进行平移。显然,进行了这两种变换之后的物体是处于x轴上的。那么,如果这个物体先沿着x轴向下平移,然后再绕z轴进行45度的逆时针旋转,物体处在哪里呢?物体处于y = x的直线上。看起来是在做相同的操作,但是变换的顺序不同,变换的结果也是不相同的。
        上面这样的变换是因为我们固定了坐标系统,物体进行变换时,是以这个固定的坐标系统中心点为参考点的。如果换一种思路,使用一个可以局部移动的坐标系统,将会发生怎样的不同呢。所谓的局部移动坐标系统,是假设坐标系统随着物体的移动而移动。就好吧上面将的例子,移动---旋转。

     首先,假设这个物体拥有一个移动的坐标系统。当这个物体沿着x轴移动时,这个局部坐标系统也随着物体沿x轴移动。然后物体再进行旋转(沿原点),就会是绕着已经移动的局部坐标系统的原点进行旋转。旋转之后的物体在固定坐标系统中,还是处于x轴上,与旋转--移动变换效果相同。

 

 

1 楼 nanapoleon 2012-06-11  
写的很有启发性,就是杂最后一段到,“首先”,然后就戛然而止了?
2 楼 如沐春风的小妮 2012-06-15  
nanapoleon 写道
写的很有启发性,就是杂最后一段到,“首先”,然后就戛然而止了?

那个啥,首先后面多了个逗号。。。本来就是要只写这段结尾的。。
3 楼 nanapoleon 2012-06-16  
如沐春风的小妮 写道
nanapoleon 写道
写的很有启发性,就是杂最后一段到,“首先”,然后就戛然而止了?

那个啥,首先后面多了个逗号。。。本来就是要只写这段结尾的。。


    
[2] APK装配过程及原理详解
    来源: 互联网  发布时间: 2014-02-18
APK安装过程及原理详解

转自:http://blog.sina.com.cn/s/blog_4059b4f90100xslf.html

应用安装是智能机的主要特点,即用户可以把各种应用(如游戏等)安装到手机上,并可以对其进行卸载等管理操作。APK是Android Package的缩写,即Android安装包。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。

 

Android应用安装有如下四种方式

1.        系统应用安装――开机时完成,没有安装界面

奇异的是:adb push 或让它开机自行安装时,apk里的so 库并没有找到安装到哪里。

是否:如果要将带SO库的APK编译加到System/app里时,要将其so 库手动加到/system/lib里。()

2.        网络下载应用安装――通过market应用完成,没有安装界面

3.        ADB工具安装――没有安装界面。

4.        第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。

应用安装的流程及路径 
应用安装涉及到如下几个目录:

system/app 
 系统自带的应用程序,无法删除
 
data/app
 用户程序安装的目录,有删除权限。

安装时把apk文件复制到此目录
 
data/data
 存放应用程序的数据
 
Data/dalvik-cache
 将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)

 

       安装过程:复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。

       卸载过程:删除安装过程中在上述三个目录下创建的文件及目录。

 

一、系统应用安装: 
PackageManagerService处理各种应用的安装,卸载,管理等工作,开机时由systemServer启动此服务

(源文件路径:android\frameworks\base\services\java\com\android\server\PackageManagerService.java)

 

PackageManagerService服务启动的流程:

1. 首先扫描安装“system\framework”目录下的jar包

1. scanDirLI(mFrameworkDir,PackageParser.PARSE_IS_SYSTEM,

                    scanMode | SCAN_NO_DEX);

 


2.第二步扫描安装“system\app”目录下的各个系统应用

scanDirLI(mSystemAppDir,PackageParser.PARSE_IS_SYSTEM, scanMode);


3.第三步扫描“data\app”目录,即用户安装的第三方应用

scanDirLI(mAppInstallDir, 0, scanMode);


4.第四步扫描" data\app-private"目录,即安装DRM保护的APK文件(目前没有遇到过此类的应用)。

scanDirLI(mDrmAppPrivateInstallDir,0, scanMode | SCAN_FORWARD_LOCKED);

 

安装应用的过程

1.scanDirLI(Filedir, int flags, int scanMode) 遍历安装指定目录下的文件

 

2.scanPackageLI(FilescanFile,

            File destCodeFile, FiledestResourceFile, int parseFlags,

            int scanMode)                安装package文件

 

3.scanPackageLI(

        File scanFile, File destCodeFile, FiledestResourceFile,

        PackageParser.Package pkg, intparseFlags, int scanMode)

通过解析安装包parsePackage获取到安装包的信息结构

 

4.mInstaller.install(pkgName,pkg.applicationInfo.uid,

              pkg.applicationInfo.uid);   实现文件复制的安装过程

(源文件路径:frameworks\base\cmds\installd\installd.install)


二、从market上下载应用: 
Google Market应用需要使用gmail账户登录才可以使用,选择某一应用后,开始下载安装包,此过程中,在手机的信号区有进度条提示,下载完成后,会自动调用Packagemanager的接口安装,调用接口如下:

public voidinstallPackage(final Uri packageURI, final IPackageInstallObserver observer,final int flags)

final Uri packageURI:文件下载完成后保存的路径

final IPackageInstallObserver observer:处理返回的安装结果

final int flags:安装的参数,从market上下载的应用,安装参数为-r (replace)

installPackage接口函数的安装过程:

1.public voidinstallPackage(

            final Uri packageURI, final IPackageInstallObserverobserver, final int flags,

            final String installerPackageName)

final StringinstallerPackageName:安装完成后此名称保存在settings里,一般为null,不是关键参数

2.FiletmpPackageFile = copyTempInstallFile(packageURI, res);

把apk文件复制到临时目录下的临时文件

3.private voidinstallPackageLI(Uri pPackageURI,

            int pFlags, boolean newInstall,String installerPackageName,

           File tmpPackageFile, PackageInstalledInfo res)

解析临时文件,获取应用包名pkgName = PackageParser.parsePackageName(

                   tmpPackageFile.getAbsolutePath(), 0);

4.判断如果带有参数INSTALL_REPLACE_EXISTING,则调用replacePackageLI(pkgName,

                        tmpPackageFile,

                        destFilePath,destPackageFile, destResourceFile,

                        pkg, forwardLocked,newInstall, installerPackageName,

                        res)

5.如果没有,则调用installNewPackageLI(pkgName,

                        tmpPackageFile,

                        destFilePath,destPackageFile, destResourceFile,

                        pkg,forwardLocked, newInstall, installerPackageName,

                        res);

6.privatePackageParser.Package scanPackageLI(

        File scanFile, File destCodeFile, FiledestResourceFile,

        PackageParser.Package pkg, intparseFlags, int scanMode)

scanPackageLI以后的流程,与开机时的应用安装流程相同。

三、从ADB工具安装 
Android Debug Bridge (adb) 是SDK自带的管理设备的工具,通过ADB命令行的方式也可以为手机或模拟器安装应用,其入口函数源文件为pm.java

(源文件路径:android\frameworks\base\cmds\pm\src\com\android\commands\pm\pm.java)

ADB命令行的形式为adb install <path_to_apk> ,还可以带安装参数如:"-l""-r" "-i" "-t"

函数runInstall()中判断参数

"-l"――INSTALL_FORWARD_LOCK

 "-r"——INSTALL_REPLACE_EXISTING 

"-i" ——installerPackageName

"-t"——INSTALL_ALLOW_TEST

我们常用的参数为-r,表示覆盖安装手机上已安装的同名应用。从market上下载的应用,也是直接传入这个参数安装的。

runInstall与market调用同样的接口完成应用安装。

public voidinstallPackage(android.net.Uri packageURI,android.content.pm.IPackageInstallObserver observer, int flags,java.lang.String installerPackageName)

四、第三方应用安装――通过SD卡里的APK文件安装 
把APK安装包保存在SD卡中,从手机里访问SD卡中的APK安装包,点击就可以启动安装界面,系统应用Packageinstaller.apk处理这种方式下的安装及卸载界面流程,如下图:


PackageInstallerActivity负责解析包,判断是否是可用的Apk文件

创建临时安装文件/data/data/com.android.packageinstaller/files/ApiDemos.apk

并启动安装确认界面startInstallConfirm,列出解析得到的该应用基本信息。如果手机上已安装有同名应用,则需要用户确认是否要替换安装。

确认安装后,启动InstallAppProgress,调用安装接口完成安装。

pm.installPackage(mPackageURI,observer, installFlags);

其它: 
1. PackageManagerService.java的内部类AppDirObserver实现了监听app目录的功能:当把某个APK拖到app目录下时,可以直接调用scanPackageLI完成安装。

2.手机数据区目录“data/system/packages.xml”文件中,包含了手机上所有已安装应用的基本信息,如安装路径,申请的permission等信息。

 

 

http://wenku.baidu.com/view/3a64c3c6bb4cf7ec4afed05f.html

 

APK文件结构详解

 

http://www.ophonesdn.com/article/show/38


    
[3] 设立EditText只输入数字、字母
    来源: 互联网  发布时间: 2014-02-18
设置EditText只输入数字、字母

如何设置EditText,使得只能输入数字或者某些字母呢?

一、设置EditText,只输入数字:

       方法1:直接生成DigitsKeyListener对象就可以了。

et_1.setKeyListener(new DigisKeyListener(false,true));

       方法2:在EditText中设置属性,android:numeric="integer"即只能输入整数,如下 

<EditText

android:singleLine="true"

android:numeric="integer"

/>

       方法3:新建一个char[],在里面添加允许输入的字符。如下

editText.setKeyListener(new NumberKeyListener(){

      protected char[] getAcceptedChars()

{

 char[] numberChars[]={'1','2','3','4','5','6','7','8','9','0',};

return numberChars;

}

});

二、设置EditText只能输入某些字母,如下面设置edtitext只能输入A—N,a—n这些字母。方法如下:

 
 

editText.setKeyListener(new NumberKeyListener(){

      protected char[] getAcceptedChars()

{

 char[] numberChars[]={'a,'b','c','d','e','f','A','B','C','D'};

return numberChars;

}

});

 
  • EditText et;  
  • et = (EditText) findViewById(R.id.et);  
  • // 方法1:建立一个DigitsKeyListener,然后把它设为你的EditText的KeyListener   
  • DigitsKeyListener numericOnlyListener = new DigitsKeyListener(false,true);  
  • et.setKeyListener(numericOnlyListener);  
  • // 方法2:为EditText设置一个NumberKeyListener,然后重写getAcceptedChars()方法和getInputType()方法   
  • et.setKeyListener(new NumberKeyListener() {  
  •     @Override  
  •     protected char[] getAcceptedChars() {  
  •         return new char[] { '1', '2', '3', '4', '5', '6', '7', '8','9', '0' };  
  •     }  
  •     @Override  
  •     public int getInputType() {  
  •         // TODO Auto-generated method stub   
  •         return android.text.InputType.TYPE_CLASS_PHONE;  
  •     }  
  • });  
  • --------------------------------------------------------

    01.EditText et;  
    02.et = (EditText) findViewById(R.id.et);  
    03.// 方法1:建立一个DigitsKeyListener,然后把它设为你的EditText的KeyListener   
    04.DigitsKeyListener numericOnlyListener = new DigitsKeyListener(false,true);  
    05.et.setKeyListener(numericOnlyListener);  
    06.// 方法2:为EditText设置一个NumberKeyListener,然后重写getAcceptedChars()方法和getInputType()方法   
    07.et.setKeyListener(new NumberKeyListener() {  
    08.    @Override  
    09.    protected char[] getAcceptedChars() {  
    10.        return new char[] { '1', '2', '3', '4', '5', '6', '7', '8','9', '0' };  
    11.    }  
    12.    @Override  
    13.    public int getInputType() {  
    14.        // TODO Auto-generated method stub   
    15.        return android.text.InputType.TYPE_CLASS_PHONE;  
    16.    }  
    17.}); 

    小结:

    第一种可以输入小数。

    第二种由于设置了TYPE_CLASS_PHONE所以只能输入整数。且比较灵活。

    ============================================

    很多网友可能在开发Android时发现EditText有时候需要限制用户输入的内容,通常我们可以使用正则表达式直接限制,但是Android 已经为我们准备好了EditText的输入类型,这样的比正则要有以下几点优势:

      1. 开发更简单,执行速度高效。 2. 输入法默认会根据情况变动,比如说设置为numeric后输入法会自动仅显示数字,不会出现Qwerty中的字母。

      下面我们通过EditText的layout xml文件中的相关属性来实现:

      1. 密码框属性 android:password="true"  这条可以让EditText显示的内容自动为 星号,输入时内容会在1秒内变成*字样。

      2. 纯数字 android:numeric="true" 这条可以让输入法自动变为数字输入键盘,同时仅允许0-9的数字输入

      3. 仅允许 android:capitalize="cwj1987" 这样仅允许接受输入cwj1987,一般用于密码验证

      下面是一些扩展的风格属性

      android:editable="false" 设置EditText不可编辑

      android:singleLine="true" 强制输入的内容在单行

      android:ellipsize="end" 自动隐藏尾部溢出数据,一般用于文字内容过长一行无法全部显示时。


        
    最新技术文章:
    ▪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