当前位置:  编程技术>移动开发
本页文章导读:
    ▪OpenGL惯用函数        OpenGL常用函数 glGenTextures说明glGenTextures(GLsizei n, GLuint *textures)函数说明n:       用来生成纹理名字的数量textures:存储纹理名称数组的第一个元素指针备注说明:glGenTextures函数根据纹理参数.........
    ▪ 让您的游戏自适应屏幕吧        让你的游戏自适应屏幕吧         我感觉,做手机的屏幕自适应比做web的浏览器兼容更麻烦..以下是搜到的资料,原来android还有这些不为人知的东西:一:不同的layoutAndroid手机屏幕大小不一.........
    ▪ 转:APK程序卸载二次确认的兑现       转:APK程序卸载二次确认的实现 Android上能不能实现卸载时提示呢,比如卸载某某软件时,做个用户调查卸载的原因。我以前想着是的不行的,以前的想法是:Windows上卸载时能实现此功能是.........

[1]OpenGL惯用函数
    来源: 互联网  发布时间: 2014-02-18
OpenGL常用函数
glGenTextures说明

glGenTextures(GLsizei n, GLuint *textures)函数说明
n:       用来生成纹理名字的数量
textures:存储纹理名称数组的第一个元素指针

备注说明:
glGenTextures函数根据纹理参数返回n个纹理名称。纹理名称集合不必是一个连续的整数集合。因此,可能在先前调用的 glGenTextures的时候没有名称集合被返回。产生纹理函数假定目标纹理的面积是由glBindTexture函数限制的。先前调用 glGentTextures产生的纹理名称集不会由后面调用的glGenTextures得到,除非他们首先被glDeleteTextures删除。
你不可以在显示列表中包含glGenTextures。


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


什么是纹理映射:

在三维图形中,纹理映射(Texture Mapping)的方法运用得最广,尤其描述具有真实感的物体。比如绘制一面砖墙,就可以使用一幅具有真实感的图像或者照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。如果不用纹理映射的方法,这墙上的每一块砖都要作为一个独立的多边形来绘制。另外,纹理映射能够保证在变换多边形时,多边形上的纹理也会随之变化。例如,用透视投影模式观察墙面时,离视点远的墙壁的砖块的尺寸就会缩小,而离视点近的就会大些,这些是符合视觉规律的。此外,纹理映射也被用在其他一些领域。如飞行仿真中常把一大片植被的图像映射到一些大多边形上用以表示地面,或者用大理石、木材等自然物质的图像作为纹理映射到多半形上表示相应的物体。纹理对象通过一个单独的数字来标识。这允许OpenGL硬件能够在内存中保存多个纹理,而不是每次使用的时候再加载它们,从而减少了运算量,提高了速度。

       纹理映射是真实感图像制作的一个重要部分,运用它可以方便的制作出极具真实感的图形而不必花过多时间来考虑物体的表面细节。然而纹理加载的过程可能会影响程序运行速度,当纹理图像非常大时,这种情况尤为明显。如何妥善的管理纹理,减少不
必要的开销,是系统优化时必须考虑的一个问题。还好,OpenGL提供了纹理对象对象管理技术来解决上述问题。与显示列表一样,纹理对象通过一个单独的数字来标识。这允许OpenGL硬件能够在内存中保存多个纹理,而不是每次使用的时候再加载它们,从而减少了运算量,提高了速度。以本文为例,使用纹理对象的步骤如下:
    第一步:定义纹理对象
    coast int TexNumber4;
    GLuint    mes Texture[TexNumber];  //定义纹理对象数组
   第二步:生成纹理对象数组
   glGenTextures(TexNumber,m Texture);
   第三步:通过使用glBindTexture选择纹理对象,来完成该纹理对象的定义。
   glBindTexture(GL TEXTURE 2D,m_Texture[0]);
   g1TexImage2D(GL TEXTURE_2D,0,3,mes Texmapl.GetWidthU,mee Texmapl.GetHeight()
              ,0,GL BGR EXT,GL UNSIGNED BYTE,mse Texmapl.GetDibBitsl'trQ);
    第四步:在绘制景物之前通过glBindTexture,为该景物加载相应的纹理。
    glBindTexture(GLes TEXTURE_2D,mse Texture[0]);
    第五步:在程序结束之前调用glDeleteTextures删除纹理对象。
    glDeleteTextures(TexNumber, mee Texture);
    这样就完成了全部纹理对象的管理和使用。















    
[2] 让您的游戏自适应屏幕吧
    来源: 互联网  发布时间: 2014-02-18
让你的游戏自适应屏幕吧

        我感觉,做手机的屏幕自适应比做web的浏览器兼容更麻烦..以下是搜到的资料,原来android还有这些不为人知的东西:
一:不同的layout
Android手机屏幕大小不一,有480x320, 640x360, 800x480.怎样才能让App自动适应不同的屏幕呢? 
   其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。
二:hdpi、mdpi、ldpi
在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。
  drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:
  (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
  (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
  (3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)
  系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。
  在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。

三:横屏竖屏

以下步骤是网上流传的,不过我自己之前是通过图形化界面实现这个配置,算是殊途同归,有空我会把图片贴上来。还要说明一点:每个activity都有这个属性screenOrientation,每个activity都需要设置,可以设置为竖屏(portrait),也可以设置为无重力感应(nosensor)。要让程序界面保持一个方向,不随手机方向转动而变化的处理办法: 
  
在AndroidManifest.xml里面配置一下就可以了。加入这一行android:screenOrientation="landscape"。
例如(landscape是横向,portrait是纵向):

  • <?xml version="1.0" encoding="utf-8"?>    
  • <manifest xmlns:android="http://schemas.android.com/apk/res/android"    
  •       package="com.ray.linkit"    
  •       android:versionCode="1"    
  •       android:versionName="1.0">    
  •     <application android:icon="@drawable/icon" android:label="@string/app_name">    
  •         <activity android:name=".Main"    
  •                   android:label="@string/app_name"    
  •                   android:screenOrientation="portrait">    
  •             <intent-filter>    
  •                 <action android:name="android.intent.action.MAIN" />    
  •                 <category android:name="android.intent.category.LAUNCHER" />   
  •             </intent-filter>    
  •         </activity>    
  •                 <activity android:name=".GamePlay"    
  •                 android:screenOrientation="portrait"></activity>    
  •                 <activity android:name=".OptionView"    
  •                 android:screenOrientation="portrait"></activity>    
  •     </application>    
  •     <uses-sdk android:minSdkVersion="3" />    
  • </manifest>
  • 复制代码
    另外,android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了!

    有的程序适合从竖屏切换到横屏,或者反过来,这个时候怎么办呢?可以在配置Activity的地方进行如下的配置android:screenOrientation="portrait"。这样就可以保证是竖屏总是竖屏了,或者landscape横向。

    而有的程序是适合横竖屏切换的。如何处理呢?首先要在配置Activity的时候进行如下的配置:android:configChanges="keyboardHidden|orientation",另外需要重写Activity的onConfigurationChanged方法。实现方式如下,不需要做太多的内容:
  • @Override  
  •         public void onConfigurationChanged(Configuration newConfig) {   
  •                 super.onConfigurationChanged(newConfig);   
  •                 if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {   
  •                         // land do nothing is ok   
  •                 } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {   
  •                         // port do nothing is ok   
  •                 }   
  •         }  
  • 复制代码



        
    [3] 转:APK程序卸载二次确认的兑现
        来源: 互联网  发布时间: 2014-02-18
    转:APK程序卸载二次确认的实现

    Android上能不能实现卸载时提示呢,比如卸载某某软件时,做个用户调查卸载的原因。
    我以前想着是的不行的,以前的想法是:
    Windows上卸载时能实现此功能是因为有些程序的卸载是自己实现的,非系统操作。
    但android上目前来说还不支持,系统卸载时,还没发现有啥接口可以和目标卸载程序交互。

    呵呵,今天鼓捣LogCat,发现还是可以的。
    实现基础是:
    1.通过注册权限,能够获取LogCat的输出流的输出信息。
    2.进入系统的卸载界面时,"打包安装程序(com.android.packageinstaller)"会输出如下信息

    01-22 16:29:15.250: INFO/ActivityManager(147): Starting activity: Intent { act=android.intent.action.DELETE dat=package:lab.sodino.uninstallhint cmp=com.android.packageinstaller/.UninstallerActivity }

    好了,有这句话就足够了。截取输出流信息,当获取字符串中包含"android.intent.action.DELETE"和"<you_package>"时,就启动卸载提示页面。

    话就这么多了。接下来看效果图,上代码。


     

     

     

    package lab.sodino.uninstallhint;  
    import android.app.Activity;  
    import android.content.Intent;  
    import android.os.Bundle;  
    import android.os.Handler;  
    import android.os.Message;  
    import android.view.View;  
    import android.widget.Button;  
    import android.widget.TextView;  
    /** 
     * @author Sodino E-mail:sodinoopen@hotmail.com 
     * @version Time:2011-1-12 上午10:09:59 
     */  
    public class MainActivity extends Activity implements LogcatObserver {  
        private TextView txtInfo;  
        private Handler handler;  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            Button btnScannerLogcat = (Button) findViewById(R.id.btnScanLogcat);  
            btnScannerLogcat.setOnClickListener(new Button.OnClickListener() {  
                public void onClick(View view) {  
                    // 开启Logcat流监听  
                    LogcatScanner.startScanLogcatInfo(MainActivity.this);  
                }  
            });  
            Button btnUninstallMe = (Button) findViewById(R.id.btnUninstallMe);  
            btnUninstallMe.setOnClickListener(new Button.OnClickListener() {  
                public void onClick(View view) {  
                    // 调用应用程序信息  
                    Intent intent = new Intent(Intent.ACTION_VIEW);  
                    // com.android.settings/.InstalledAppDetails  
                    intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");  
                    intent.putExtra("pkg", "lab.sodino.uninstallhint");  
                    startActivity(intent);  
                }  
            });  
            txtInfo = (TextView) findViewById(R.id.txtInfo);  
            handler = new Handler() {  
                public void handleMessage(Message msg) {  
                    txtInfo.append(String.valueOf(msg.obj) + "\n");  
                }  
            };  
        }  
        public void handleNewLine(String info) {  
            Message msg = new Message();  
            msg.obj = info;  
            handler.sendMessage(msg);  
            if (info.contains("android.intent.action.DELETE") && info.contains(getPackageName())) {  
                // 启动删除提示  
                Intent intent = new Intent();  
                intent.setClass(this, UninstallWarningActivity.class);  
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
                startActivity(intent);  
            }  
        }  
    }  

     

     

     

    package lab.sodino.uninstallhint;  
    import java.io.DataInputStream;  
    import java.io.IOException;  
    import java.io.InputStream;  
    /** 
     *@author Sodino Email:sodinoopen@hotmail<br/> 
     *@version 2011-1-22 上午11:10:56 
     */  
    public class LogcatScanner {  
        private static AndroidLogcatScanner scannerThead;  
        public final static void startScanLogcatInfo(LogcatObserver observer) {  
            if (scannerThead == null) {  
                scannerThead = new AndroidLogcatScanner(observer);  
                scannerThead.start();  
                LogOut.out(LogcatScanner.class, "scannerThread.start()");  
            }  
        }  
        static class AndroidLogcatScanner extends Thread {  
            private LogcatObserver observer;  
            public AndroidLogcatScanner(LogcatObserver observer) {  
                this.observer = observer;  
            }  
            public void run() {  
                String[] cmds = { "logcat", "-c" };  
                String shellCmd = "logcat";  
                Process process = null;  
                InputStream is = null;  
                DataInputStream dis = null;  
                String line = "";  
                Runtime runtime = Runtime.getRuntime();  
                try {  
                    observer.handleNewLine(line);  
                    int waitValue;  
                    waitValue = runtime.exec(cmds).waitFor();  
                    observer.handleNewLine("waitValue=" + waitValue + "\n Has do Clear logcat cache.");  
                    process = runtime.exec(shellCmd);  
                    is = process.getInputStream();  
                    dis = new DataInputStream(is);  
                    while ((line = dis.readLine()) != null) {  
                        observer.handleNewLine(line);  
                    }  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                } catch (IOException ie) {  
                    ie.printStackTrace();  
                } finally {  
                    try {  
                        if (dis != null) {  
                            dis.close();  
                        }  
                        if (is != null) {  
                            is.close();  
                        }  
                        if (process != null) {  
                            process.destroy();  
                        }  
                    } catch (Exception e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
    }  

     

     

    package lab.sodino.uninstallhint;  
    /** 
     * @author Sodino E-mail:sodinoopen@hotmail.com 
     * @version Time:2011-1-22 下午03:00:54 
     */  
    public interface LogcatObserver {  
        public void handleNewLine(String line);  
    }  

     

     

    package lab.sodino.uninstallhint;  
    import android.app.Activity;  
    import android.app.ActivityManager;  
    import android.content.Context;  
    import android.content.Intent;  
    import android.os.Bundle;  
    import android.view.View;  
    import android.widget.Button;  
    /** 
     * @author Sodino E-mail:sodinoopen@hotmail.com 
     * @version Time:2011-1-12 上午10:26:09 
     */  
    public class UninstallWarningActivity extends Activity {  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.uninstall_warning);  
            Button btnContinue = (Button) findViewById(R.id.btnContinue);  
            btnContinue.setOnClickListener(new Button.OnClickListener() {  
                public void onClick(View view) {  
                    UninstallWarningActivity.this.finish();  
                }  
            });  
            Button btnCancel = (Button) findViewById(R.id.btnCancel);  
            btnCancel.setOnClickListener(new Button.OnClickListener() {  
                public void onClick(View view) {  
                    UninstallWarningActivity.this.finish();  
                    ActivityManager actMag = (ActivityManager) UninstallWarningActivity.this  
                            .getSystemService(Context.ACTIVITY_SERVICE);  
                    //杀掉系统的打包安装程序。  
                    if (android.os.Build.VERSION.SDK_INT < 8) {  
                        actMag.restartPackage("com.android.packageinstaller");  
                    } else {  
                        actMag.killBackgroundProcesses("com.android.packageinstaller");  
                    }  
                    Intent i = new Intent(Intent.ACTION_MAIN);  
                    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
                    i.addCategory(Intent.CATEGORY_HOME);  
                    startActivity(i);  
                }  
            });  
        }  
    }  

     

    最后在AndroidManifest.xml中添加上权限。

     

    <uses-permission android:name="android.permission.READ_LOGS" />  
    <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>  
    <uses-permission android:name="android.permission.RESTART_PACKAGES"/>  

     

    转自:http://blog.csdn.net/sodino/archive/2011/01/22/6158659.aspx

     


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