【读书笔记《Android游戏编程之从零开始》】8.Android 游戏开发常用的系统控件(系统控件常见问题)

简介:

Android 中常用的计量单位
Android有时候需要一些计量单位,比如在布局Layout文件中可能需要指定具体单位等。
常用的计量单位有:px、dip(dp)、sp,以及一些不常用的pt、in、mm。下面详细介绍下这些计量单位之间的区别和联系。
in:英寸(长度单位);
mm:毫米(长度单位);
pt:磅/点,1/72英寸(一个标准的长度单位);
sp:全名 scaled pixels-best for text size,放大像素,与刻度无关,可以根据用户的字体大小就行缩放,主要用来处理字体的大小;
px:屏幕中的像素;
dip(dp):设备独立像素,一种基于屏幕密度的抽象单位;因为不通设备中有不同的显示效果,所以为了解决在不通分辨率手机上运行不至于相差太大的问题,引入了dip计量单位,这种计量单位与移动设备硬件无关。

说道密度,这里简单介绍下。手机密度值(Density)表示每英寸有多少个显示点,与手机的分辨率是两个概念,但是分辨率与密度之间又互相关联,两者转换公式为:
密度值是120,屏幕实际分辨率为:240px×400px(两个点对应一个分辨率);
密度值是160,屏幕实际分辨率为:320px×533px(3个点对应两个分辨率);
密度值是240,屏幕实际分辨率为:480px×800px(一个点对应一个分辨率)。

比如,QVGA与WQVGA屏的密度值是120,HVGA屏密度值是160,WVGA屏密度值是240.

res资源目录,因为运行的设备的不同,对应的资源文件目录也不同。其真正的原因是,资源目录是根据密度的不同来进行划分的:
密度值是120,对应的资源目录是drawable-ldpi;
密度值是160,对应的资源目录是drawable-mdpi;
密度值是240,对应的资源目录是drawable-hdpi。

根据以上介绍,在布局中应该尽量使用dip(dp)作为单位;而定义作为文字大小的单位则推荐使用sp。

 

Context
Context 类是一个抽象类,它的子类很多,比如 Activity 、 TabActivity 、Service 等。很多方法中需要传入 Context 参数才可实例对象,例如 Toast 实例对象时,第一个对象需传入 Context 对象。其实 Context 从字面上可以理解为类似于句柄,联系上下文的意思。因为 Activity 是 Context 的子类,所以一般在 Activity 中使用 Context 的时候,可以用 this 来代替,但是如果在内部类中(如利用内部类使用监听组件),就不能使用 this 来代替 Context ,而是使用 "ActName.this" ,这里的 ActName 指的是 Activity 类的类名。

在Android中的 Context 可以有很多操作,但是最主要的功能是加载和访问资源,具体可以看下官方文档:http://developer.android.com/reference/android/content/Context.html

 

Resources与getResources
在 Android 资源(Resource)都会自动由 R.java 资源文件生成对应的静态 ID ,通过 R 资源文件对资源生成的 ID 来引用。这样在资源需要修改的时候,就不用去程序源代码中修改,直接修改对应res下的资源文件即可。
在源代码中,如果需要对资源目录下的 string.xml 中定义的字符串变量进行访问,只需要通过 getResources 的方式引用即可。
例如,需要引用 string.xml 中的一个字符串,其变量为 "hello_world",获取方式如下:

getResources().getString(R.string.hello_world);

再如需要引用 drawable 目录下的一张名为"goodby_times.png"的图片,获取方式如下:

getResources().getDrawable(R.drawable.goodby_times);

当然一些函数不仅支持传入 String 类型,也支持传入引用 ID 。例如 TextView 中的setText() 函数,这个方法不仅支持传入 String 类型,还支持 R 文件引用 ID 的参数。"R.string.strName"中的 strName 表示在 string.xml 中定义的字符串在 R 资源文件中生成的对应 ID 索引。

 

findViewById与LayoutInflater
LayoutInflater 的作用类似于 findViewById(),两者不同之处在于 LayoutInflater 是用来实例化 xml 布局文件中的布局:而 findViewById,顾名思义,是通过 ID 来找到 xml 布局文件中定义的组件,比如 EditText、TextView、Button 等等。
关于用 LayoutInflater 来实例布局的方式有两种:
1.通过传入 Context 参数来获得 LayoutInflater 实例,然后调用 LayoutInflater 类中的 inflate 函数来得到布局实例。

LayoutInflater inflater = LayoutInflater.from(Context context) ;
View view = inflater.inflate(R.layout.activity_main, null);

2.通过系统服务来获取到 LayoutInflater 实例,然后调用 LayoutInflater 类中的 inflate 函数来得到布局实例。

LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.activity_main, null);

尽管实例布局的形式不同,但是这两种布局方式的性质没有区别。

 

多个Activity之间跳转/退出/传递数据操作

 

主要代码:

  MainActivity.class
  OtherActivity.class

 

PS:记得在 AndroidManifest.xml 文件中声明新建的Activity,不然应用会由于找不到活动而报异常。

<!-- 下面是注册新建的Activity(OtherActivity) -->
        <activity android:name="yc.example.activityex.OtherActivity"></activity>

 

横竖屏切换处理的三种方式
Android 手机中运行应用的时候,一般用户都是竖屏,但是如果突然将手机横屏,那么很可能就会造成程序出现异常,因为在 Android 中每次屏幕切换都会重启当前的 Activity 。这种情况下,异常的解决方式有一下三种。

1.锁定横竖屏切换
此方式只需要在 AndroidManifest.xml 文件中,对 Activity 定义屏幕方向属性只能为横屏或者竖屏即可
将屏幕固定为竖屏显示

<activity android:screenOrientation="portrait">

将屏幕固定为横屏显示

<activity android:screenOrientation="landscape">

其他参数:
"unspecified":默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向. 
"landscape":横屏显示(宽比高要长) 
"portrait":竖屏显示(高比宽要长) 
"user":用户当前首选的方向 
"behind":和该Activity下面的那个Activity的方向一致(在Activity堆栈中的) 
"sensor":有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。 
"nosensor":忽略物理感应器,这样就不会随着用户旋转设备而更改了("unspecified"设置除外)。

因为一个 Android 应用程序中可能会有多个 Activity ,那么可以根据需要去配置每一个 Activity 的显示方式,如果不设置,默认可以横竖屏切换。

或者在源码中设置横竖屏:
设置竖屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

设置横屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2.源代码中处理横竖屏切换事件
首先在AndroidManifest.xml中为Activity设置configChanges属性

android:configChanges="orientation|screenSize"

然后在对应的 Activity 源代码中重写 onConfigurationChanged() 函数即可。这样处理后,当横竖屏切换的时候,就会响应其 Activity 中的 onConfigurationChanged() 函数,然后对横竖屏做出判断处理。

复制代码
package yc.example.helloworld;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {
     private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
           Log.i("--Main--", "onCreate");  
           textView=(TextView)findViewById(R.id.tv);  
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.i("--Main--", "onConfigurationChanged");  
        if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
             textView.setText("当前屏幕为竖屏");  
        } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
             textView.setText("当前屏幕为横屏");  
        }
    }

}
复制代码

此方式就不会在切换横竖屏的时候,Activity 默认重启了。

3.重写 onRestoreInstanceState() 与 onSaveInstanceState() 函数代码:

复制代码
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.i("YInfo", "onRestoreInstanceState()");
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i("YInfo", "onSaveInstanceState()");
}
复制代码

在屏幕切换横竖屏的时候,会响应 onSaveInstanceState() 函数,然后重启载入当前的 Activity ,最后响应 onRestoreInstanceState() 函数,所以可以通过重写这两个函数,进行屏幕横竖屏切换时的处理。

以上3种处理横竖屏切换方式,根据当前应用来进行选择。






本文转自叶超Luka博客园博客,原文链接:http://www.cnblogs.com/yc-755909659/p/3750030.html,如需转载请自行联系原作者
目录
相关文章
|
5月前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
75 3
|
4月前
|
XML 存储 Java
浅谈Android的TextView控件
浅谈Android的TextView控件
59 0
|
6月前
|
前端开发 Android开发 开发者
安卓开发中的自定义视图:构建你的第一个控件
【8月更文挑战第26天】在安卓开发的浩瀚海洋中,自定义视图是一块充满魔力的乐土。它不仅是开发者展示创造力的舞台,更是实现独特用户体验的关键。本文将带你步入自定义视图的世界,从基础概念到实战应用,一步步教你如何打造自己的第一个控件。无论你是初学者还是有经验的开发者,这篇文章都将为你的开发之旅增添新的风景。
|
8月前
|
Java Android开发
18. 【Android教程】图片控件 ImageView
18. 【Android教程】图片控件 ImageView
135 4
|
8月前
|
前端开发 API Android开发
25. 【Android教程】列表控件 ListView
25. 【Android教程】列表控件 ListView
288 2
|
8月前
|
Java Android开发 开发者
17. 【Android教程】开关控件ToggleButton/Switch
17. 【Android教程】开关控件ToggleButton/Switch
113 2
|
7月前
|
XML 数据格式
Android-自定义三角形评分控件
Android-自定义三角形评分控件
63 0
|
8月前
|
XML Android开发 数据格式
Android基础控件介绍
Android基础控件介绍
|
8月前
|
Android开发
Android 自定义View 测量控件宽高、自定义viewgroup测量
Android 自定义View 测量控件宽高、自定义viewgroup测量
178 0
|
9月前
|
XML Java Android开发
Android控件动态使用 (转)
Android控件动态使用 (转)
49 1

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 6
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 7
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 10
    《Effective C#》读书笔记——条目27:让类型支持序列化<使用C#表达设计>